XPConnect(Firefox) - 如何从对象中获取价值

时间:2009-11-03 04:27:13

标签: javascript out out-parameters universalxpconnect

我正在尝试从剪贴板javascript函数创建一个读取,它通常正常工作,但我似乎无法从我使用out参数创建的对象中提取实际字符串(Components.interfaces.nsITransferable)。如果你想知道,这是一个本地内部网,我已启用剪贴板访问。

这是我为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;

有人可以帮我弄清楚如何提取剪贴板内容吗?我太近了!

1 个答案:

答案 0 :(得分: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;