Что нового

Копирование содержимого тега code в буфер обмена

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Хочу прикрутить на форуме функцию копирования выделенного кода, но возникли некие проблемы.

Нужна помощь js знатоков.

Внимание вопрос...

Имеем код:
JavaScript:
function smfCopySelection(codeElement)
{
	// create an element to contain our copying flash element
	if(!document.getElementById('clipboard')) {
		var copydiv = document.createElement('div');
		copydiv.id = 'clipboard';
		document.body.appendChild(copydiv);
	}
	// clear our element ready for new stuff to copy
	document.getElementById('clipboard').innerHTML = '';
	smfSelectText(codeElement);
	// input = the stuff in the code tag
	var input = window.getSelection();
	// replace active line breaks with carriage returns
	input = input.replace(/<(BR\/|br\/|BR \/|br \/|br|BR)>/g, '\r\n');
	// remove active html (part of smf)
	input = input.replace(/<\/?[^>]+(>|$)/g, '');
	// now decode our content  (which maybe html itself) (added by the user)
	var output = input.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/ /g," ").replace(/&amp;/g, '&').replace(/&quot;/g, '"');
	// using a flash file to copy to clipboard
	document.getElementById('clipboard').innerHTML = '<embed src="clipboard.swf" FlashVars="clipboard='+encodeURIComponent(output)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
}

вызывается так:
JavaScript:
<a href="javascript:void(0);" onclick="smfCopySelection(this);" class="codeoperation">Копировать</a>

почему этот код выдаёт следующую ошибку:
Uncaught exception: TypeError: 'input.replace' is not a function

?
:scratch:
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
хе-хееей :laugh:
стоит вспомнить про кроссбраузерность
и вместо
Код:
var input = window.getSelection();
писать
Код:
var input;
if (window.getSelection) input = window.getSelection();
else if (document.getSelection) input = document.getSelection();
else input = document.selection.createRange().text;

ps:
в JS можно и без ";" ;-)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
`p r o x y [?]
Давно тебя не видно было :beer:

стоит вспомнить про кроссбраузерность
Ну я проверял на Opera, а там window.getSelection вроде работает.
Но в любом случае, ошибка та же :(


Добавлено:
Сообщение автоматически объединено:

`p r o x y
Вот так работает:

JavaScript:
function smfCopyText(codeElement)
{
    // create an element to contain our copying flash element
    if(!document.getElementById('clipboard')) {
        var copydiv = document.createElement('div');
        copydiv.id = 'clipboard';
        document.body.appendChild(copydiv);
    }
    
    // clear our element ready for new stuff to copy
    document.getElementById('clipboard').innerHTML = '';
    
    // Select element content
    smfSelectText(codeElement);
    
    // input = the stuff in the code tag
    var input;
    
    if (document.selection)
	{
		// IE
		input = document.selection.createRange().text;;
	}
	else if (document.getSelection)
	{
		// Opera(?)
		input = document.getSelection();
	}
	else if (window.getSelection)
	{
		// FIREFOX & OTHERS
		input = window.getSelection();
	}
	
    // replace active line breaks with carriage returns
    input = input.replace(/<(BR\/|br\/|BR \/|br \/|br|BR)>/g, '\r\n');
    
    // remove active html (part of smf)
    input = input.replace(/<\/?[^>]+(>|$)/g, '');
    
    // now decode our content  (which maybe html itself) (added by the user)
    var output = input.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/ /g," ").replace(/&amp;/g, '&').replace(/&quot;/g, '"');
    
    // using a flash file to copy to clipboard
    document.getElementById('clipboard').innerHTML = '<embed src="clipboard.swf" FlashVars="clipboard='+encodeURIComponent(output)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
    
    // Remove any selection
    smfDeselectAll();
}

но теперь проблема в том что clipboard.swf ничего не копирует, видно что данные загружаются со страницы, но текст так и не копируется в буфер обмена.
 
Верх