2009-11-03 3 views
0

Я пытаюсь создать чтение из функции javascript из буфера обмена, и он обычно работает, но я не могу извлечь фактическую строку из объекта, который я создаю с помощью параметр out (Components.interfaces.nsITransferable). В случае, если вам интересно, это для локальной интрасети, и я включил доступ к буфер обмена.XPConnect (Firefox) - как получить значение из объекта

Это часть кода, в котором я создаю объекты для параметров out, а затем устанавливаю их. Я знаю, что он работает в основном, потому что если я вернусь obj_length.value, он даст мне правильную длину (* 2 для unicode). Однако obj.value дает мне только объект типа [xpconnect wrapped nsISupports]. Мне нужна строка с содержимым буфера обмена!

var obj = {}; 
var obj_length = {}; 
b.getTransferData("text/unicode", obj, obj_length); 
return obj.value; 

Может ли кто-нибудь помочь мне разобраться, как извлечь содержимое буфера обмена? Я так близок!

ответ

0

Как оказалось, я смог ответить на свой вопрос. Это немного RTFM мне, но в случае, если это полезно для других людей, чтобы найти его здесь на SO, вот где я его нашел:

https://developer.mozilla.org/en/Using_the_Clipboard 

А вот полный код, который я использовал. Он протестирован и работает в FF 3.5. Он не будет работать в IE, но это должно быть довольно тривиально протестировать IE и добавить поддержку для этого браузера. Не так уверен в Chrome, Opera, Safari и т. Д. Помните, что вам нужно включить доступ к буферам обмена в Firefox, иначе он не будет работать. Поэтому, вероятно, это не подходит для публичных сайтов:

try { 
    netscape.security.PrivilegeManager 
      .enablePrivilege("UniversalXPConnect"); 
} catch (e) { 
    alert("You need to enable clipboard access in FireFox"); 
    return false; 
} 

var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard); 
if (!clip) return false; 

var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); 
if (!trans) return false; 
trans.addDataFlavor("text/unicode"); 

clip.getData(trans, clip.kGlobalClipboard); 

var str  = new Object(); 
var strLength = new Object(); 

trans.getTransferData("text/unicode", str, strLength); 

if (str) str  = str.value.QueryInterface(Components.interfaces.nsISupportsString); 
if (str) pastetext = str.data.substring(0, strLength.value/2); 

return pastetext;