ОК - это то, что я делаю, основываясь на предложении jsFiddle, и оно работает. Единственная проблема заключается в том, что у меня нет Windows, а в IE, где у меня есть копия в буфер обмена, очевидно, разрывы строк нарушены, но это не тот вопрос (и я подозреваю, что .replace () может это исправить - мне просто нужен доступ к Windows, чтобы играть с IE):
function lineBreakCount(str){
// http://snippets.dzone.com/posts/show/5770
/* counts \n */
try {
return((str.match(/[^\n]*\n[^\n]*/gi).length));
} catch(e) {
return 0;
}
}
function nodeToCopy($node) {
// For Code Snippets - [AW]
$pre = $node.find('pre:first');
var string = $pre.text();
if (window.clipboardData && clipboardData.setData) {
clipboardData.setData('text', string);
} else {
var n = 1 + lineBreakCount(string);
$pre.attr('class','nodisplay');
$pre.after('<textarea readonly="readonly" rows="' + n + '" class="dbg-copycode">' + string.replace(/</g,'<').replace(/>/,'>') + '</textarea>');
$node.find('textarea:first').focus();
$node.find('textarea:first').select();
$node.find('div:last').find('button').replaceWith('<button class="dbg-copycode" type="button" title="Restore syntax highlight">Restore</button>');
$node.find('div:last').find('button').click(function() {restorePreFromText($(this).parent().parent())});
}
}
function restorePreFromText($node) {
// For Code Snippets - [AW]
$node.find('pre:first').removeAttr('class');
$node.find('textarea').remove();
$node.find('div:last').find('button').replaceWith('<button class="dbg-copycode" type="button" title="Select code example for copying">Select Code</button>');
$node.find('div:last').find('button').click(function() {nodeToCopy($(this).parent().parent())});
}
$(document).ready(function() {
// For Code Snippets - [AW]
var copybutton = 'Select Code';
var copytitle = 'Select code example for copying';
if (window.clipboardData && clipboardData.setData) {
copybutton = 'Copy Code';
copytitle = 'Copy code example to clipboard';
}
$('pre[data-code]').after('<div class="dbg-rbutton"><button class="dbg-copycode" type="button" title="' + copytitle + '">' + copybutton + '</button></div>');
$('.dbg-copycode').click(function() {nodeToCopy($(this).parent().parent())});
});
Причина, по которой я не использую .hide (), где скрываю предварительный блок, заключается в том, что .hide () добавляет атрибут стиля, который запрещен политикой Mozilla CSP, которую использует сервер, поэтому я должен установить атрибут класса вместо этого.