Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.06.2010, 22:12
Аватар для KOLANICH
Профессор
Отправить личное сообщение для KOLANICH Посмотреть профиль Найти все сообщения от KOLANICH
 
Регистрация: 22.11.2008
Сообщений: 277

буфер обмена в Firefox
как получить доступ к буферу обмена в mozilla firefox?
код будет выполняться как скрипт greasemonkey, поэтому надобнось в извращениях отпадает
Ответить с цитированием
  #2 (permalink)  
Старый 01.07.2010, 08:49
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

zero clipboard
Ответить с цитированием
  #3 (permalink)  
Старый 01.07.2010, 17:46
Аватар для KOLANICH
Профессор
Отправить личное сообщение для KOLANICH Посмотреть профиль Найти все сообщения от KOLANICH
 
Регистрация: 22.11.2008
Сообщений: 277

я и так уже к своему юзерскрипту 2 внешние библиотеки подключил
Ответить с цитированием
  #4 (permalink)  
Старый 01.07.2010, 18:00
Профессор
Отправить личное сообщение для exec Посмотреть профиль Найти все сообщения от exec
 
Регистрация: 21.01.2010
Сообщений: 1,022

Ну так ещё одну подключишь.
Ответить с цитированием
  #5 (permalink)  
Старый 01.07.2010, 18:12
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

Последний раз редактировалось Octane, 01.07.2010 в 18:17.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AJAX + Firefox некорректное отображение checkbox shu7 Firefox/Mozilla 2 26.06.2015 14:23
Peppy и Firefox Cr@ZyBoY Библиотеки/Тулкиты/Фреймворки 13 14.02.2010 20:38
Скопироватьв буфер обмена nemo Общие вопросы Javascript 0 02.12.2009 14:40
В Mozilla Firefox 3.0 проблемма с Javascript меню artmedia Элементы интерфейса 1 07.09.2008 10:43
FireFox: onmouseover не работает при зажатой кнопке мыши no. Общие вопросы Javascript 4 19.08.2008 13:43