在Xul中传递一个arbritrary JavaScript对象

时间:2011-01-04 13:11:13

标签: javascript xul

我跟随this example将一个对象传递给一个窗口,但当它作为一个参数时,它的值是“未定义”。

这是我的第一个窗口(obs。 dump 是打开debug options时打开控制台的方式):

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<!DOCTYPE window SYSTEM "chrome://XulWindowArgTest/locale/XulWindowArgTest.dtd">

<window id="windowID" width="400" height="300"
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

    <script>
        <![CDATA[
            function onClickMe(event) {
                dump("begin\n");

            try {
                var args = {
                  param1: true,
                  param2: 42
                };
                args.wrappedJSObject = args;

                var watcher = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].getService(Components.interfaces.nsIWindowWatcher);
                watcher.openWindow(null, "chrome://XulWindowArgTest/content/about.xul", "windowName", "chrome", args);

            } catch (e) {
                dump("error: " + e + "\n");
            }


                dump("end\n");
            }
        ]]>
    </script>

    <button label="Click me !" oncommand="onClickMe();" />

</window>

和我的第二个窗口:

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<!DOCTYPE window SYSTEM "chrome://XulWindowArgTest/locale/XulWindowArgTest.dtd">

<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
    onload="onload()">

    <script>
        <![CDATA[
            function onload() {
                dump('arg = ' + window.arguments[0].wrappedJSObject + "\n");
            }
        ]]>
    </script>

    <label value="test" />

</window>

当第二个窗口加载时,它调用onload并打印:

  

arg = undefined

知道怎么解决吗?

1 个答案:

答案 0 :(得分:0)

我通常会调用openDialog,因此可以在不使用观察者的情况下传递一个或多个参数...但是从您尝试遵循的示例中,您似乎忽略了这一行:

args.wrappedJSObject = args;

如果您尝试全部内联,也许您应该通过:

{wrappedJSOBject:["myarg"]}

此外,在您的第二个窗口中,您正在尝试打印

window.arguments[0].wrappedJSObjectarg

当您的示例引用

window.arguments[0].wrappedJSObject;

我假设前一个错误是疏忽而后者是一个错字。


此外,您可能需要确保在加载窗口之前不检查参数 - 在窗口的onload属性调用的函数中检查它们。