Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   буфер обмена в Firefox (https://javascript.ru/forum/misc/10368-bufer-obmena-v-firefox.html)

KOLANICH 30.06.2010 22:12

буфер обмена в Firefox
 
как получить доступ к буферу обмена в mozilla firefox?
код будет выполняться как скрипт greasemonkey, поэтому надобнось в извращениях отпадает

exec 01.07.2010 08:49

zero clipboard

KOLANICH 01.07.2010 17:46

я и так уже к своему юзерскрипту 2 внешние библиотеки подключил

exec 01.07.2010 18:00

Ну так ещё одну подключишь.

Octane 01.07.2010 18:12

Вот кусок кода из проекта, там в одной из веток выполняется работа с буфером при помощи 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.


Часовой пояс GMT +3, время: 08:00.