Вот кусок кода из проекта, там в одной из веток выполняется работа с буфером при помощи Components.interfaces.nsIClipboard, но для этого пользователь должен изменить настройки браузера:
/**
* Копирует содержимое выделения в буфер обмена
*
* @protected
* @returns {Boolean} Выполнена ли операция
*/
this._copyToClipboard = function()
{
var range = this._range.getRange();
var content = range.text || range.toString();
if(window.clipboardData)
{
/**
* Метод IE
*/
window.clipboardData.setData('Text', content);
return true;
}
else
{
var flag = false;
try
{
/**
* Пробуем включить привилегии XPCOM
* Этот вызов нельзя вынести в отдельную функцию, т.к. привилегии на доступ
* выдаются только вызвавшему методу
*/
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
flag = true;
}
catch(e)
{
if(this._Client.isGecko)
{
alert('Для работы с буфером обмена установите параметр signed.applets.codebase_principal_support в значение true на странице настроек about:config');
}
else
{
try {
/**
* Пробуем выполнить копирование через интерфейс execCommand
*/
this._doc.execCommand('Copy', false, null);
} catch(e)
{
alert('Ваш браузер не поддерживает операции с буфером обмена!');
return false;
}
return true;
}
return false;
}
if(flag)
{
try
{
/**
* Если удалось активировать привилегии XPCOM, выполняем копирование при помощи средств движка Gecko
*/
var str = Components.classes['@mozilla.org/supports-string;1'].createInstance(Components.interfaces.nsISupportsString);
if(!str) return false;
str.data = content;
// Создаем объект-посредник для переноса данных
var transfer = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if(!transfer) return false;
// Устанавливаеем тип содержимого
transfer.addDataFlavor('text/unicode');
transfer.setTransferData('text/unicode', str, content.length * 2);
// Получаем объект буфера обмена
var clipboard = Components.classes['@mozilla.org/widget/clipboard;1'].getService(Components.interfaces.nsIClipboard);
if(!clipboard) return false;
// Пробуем записать данные
clipboard.setData(transfer, null, Components.interfaces.nsIClipboard.kGlobalClipboard);
return true;
}
catch(e)
{
return false;
}
}
}
}
/**
* Вставляет содержимое буфера обмена в документ
*
* @protected
* @returns {Boolean} Выполнена ли операция
*/
this._pasteFromClipboard = function()
{
var range = this._range.getRange();
if(window.clipboardData)
{
// Получаем данные из буфера стандартным методом
var content = window.clipboardData.getData('Text');
range.pasteHTML(content);
return true;
}
else
{
var flag = false;
try
{
/**
* Пробуем включить привилегии XPCOM
* Этот вызов нельзя вынести в отдельную функцию, т.к. привилегии на доступ
* выдаются только вызвавшему методу
*/
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
flag = true;
}
catch(e)
{
if(this._Client.isGecko)
{
alert('Для работы с буфером обмена установите параметр signed.applets.codebase_principal_support в значение true на странице настроек about:config');
}
else
{
try {
/**
* Пробуем выполнить вставку через интерфейс execCommand
*/
this._doc.execCommand('Paste', false, null);
} catch(e)
{
alert('Ваш браузер не поддерживает операции с буфером обмена!');
return false;
}
return true;
}
return false;
}
if(flag)
{
try
{
/**
* Если удалось активировать привилегии XPCOM, выполняем вставку при помощи средств движка Gecko
*/
var clipboard = Components.classes['@mozilla.org/widget/clipboard;1'].getService(Components.interfaces.nsIClipboard);
if(!clipboard) return false;
// Создаем объект-посредник для передаыи данных
var transfer = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
if(!transfer) return false;
// Устанавливаем тип содержимого
transfer.addDataFlavor('text/unicode');
// Пробуем получить данные из буфера
clipboard.getData(transfer, clipboard.kGlobalClipboard);
var str = {}, strlen = {}, content = '';
transfer.getTransferData('text/unicode', str, strlen);
// Производим преобразование в нормальную строку
if(str) str = str.value.QueryInterface(Components.interfaces.nsISupportsString);
if(str) content = str.data.substring(0, strlen.value / 2);
var fragment = range.createContextualFragment(content);
range.deleteContents();
// Добавляем полученную информацию в документ
range.insertNode(fragment);
return true;
}
catch(e)
{
return false;
}
}
}
}
execCommand не работает в Firefox в обычном режиме, только в WYSIWYG.