我正在使用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的变量。
感谢您的帮助!
答案 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);