WinJS运行时错误

时间:2014-06-23 11:58:57

标签: javascript winjs

我正在使用JavaScript在Visual Studio中创建一个feed阅读器,当我运行它时,我收到一个错误:

0x800a138f - JavaScript runtime error: Unable to get property 'addEventListener' of undefined or null reference

受影响的代码是:

articlelistElement.addEventListener("iteminvoked", itemInvoked);

articleListElement引用引用WinJS.UI.Listview的变量。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果你的document.getElementById(“articlelist”)返回null,那么你必须在实际加载DOM之前尝试添加监听器。

如果你开始使用Blank项目模板,那么在default.js中你会看到这段代码:

app.onactivated = function (args) {
    if (args.detail.kind === activation.ActivationKind.launch) {
        if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
            // TODO: This application has been newly launched. Initialize
            // your application here.
        } else {
            // TODO: This application has been reactivated from suspension.
            // Restore application state here.
        }
        args.setPromise(WinJS.UI.processAll());
    }
};

在调用此激活事件之前,DOM将不会就绪,getElementById可以返回null。 (关于激活序列的完全破败,请参阅我的免费电子书的第3章Programming Windows Store Apps with HTML, CSS, and JavaScript)。

如果您正在使用导航或网格应用程序模板,则需要将该初始化代码放在页面控件的ready方法(或已处理的方法)中。使用导航模板,您将在pages / home / home.js中看到该代码。 (我的免费电子书的相同章节讨论了页面控制。)

这是第一步 - 如果你在正确的时间调用getElementById,那么它应该返回你声明ListView的div。

然而,故事还有更多内容,因为要将事件处理程序正确附加到WinJS控件,您必须确保已实例化控件。这是上面Blank模板代码中WinJS.UI.processAll的目的(同样的调用也是作为加载页面控件的一部分自动进行的。)

WinJS.UI.processAll(或WinJS.UI.process,在单个元素及其子元素而不是整个文档中工作),通过DOM查找数据获胜控制属性。当它找到一个时,它解析data-win-options属性(如果你提供了一个),然后用该解析的选项对象调用data-win-control中标识的构造函数。

在此之前,您声明控件的位置将只是一个div而不包含任何其他控件结构。

再次使用页面控件,在已处理或就绪的方法中,应实例化控件。在Blank模板中,您需要将完成的处理程序附加到WinJS.UI.processAll:

args.setPromise(WinJS.UI.processAll().then(function () {
    //Controls have been instantiated, do initialization here

    //Note that calling .then and not .done is necessary because we need to return a promise
    //to args.setPromise.
});

此时,document.getElementById(“articlelist”)应该会到达ListView的主机div。

最后一步是将处理程序附加到WinJS控件事件,您必须将侦听器添加到控件对象而不是主机div,您可以通过该属性获取.winControl属性主机元素。所以你的代码需要看起来像这样:

articlelistElement.winControl.addEventListener("iteminvoked", itemInvoked);