无法获取未定义或空引用的属性 - Windows 8 JS/CSS 应用程序
Posted
技术标签:
【中文标题】无法获取未定义或空引用的属性 - Windows 8 JS/CSS 应用程序【英文标题】:Unable to get property of undefined or null reference - Windows 8 JS/CSS app 【发布时间】:2012-12-22 01:21:49 【问题描述】:下面是我的代码的 sn-p。我得到的错误是当我执行搜索并调用方法_searchData
时,它成功调用了方法_lookUpSuccess
,然后返回以下错误:
JavaScript 运行时错误:无法获取未定义或空引用的属性“_displayResult”
当它尝试调用_displayResult
方法时。
为什么会这样?
(function ()
// make this an object property/method eventually
var displayResult = function (queryResult)
for (var i = 0; i < holder.length; i++)
//document.querySelector(".item-content .title").textContent = "FilmApp";
document.querySelector(holder[i]).textContent = queryResult[i];
;
// Creates a new page control with members
ui.Pages.define(searchPageURI,
//...
_searchData: function (queryText)
searchBase = 'http://www.example.com/web-service2.php?termID=';
searchFormat = 'JSON';
searchFormatPiece = '&format=' + searchFormat;
if (!window.Data)
var searchUrl = searchBase + queryText + searchFormatPiece;
WinJS.xhr( url: searchUrl ).done(this._lookUpSuccess, this._lookUpFail, this._lookUpProgress);
else
document.querySelector(".titlearea .pagetitle").textContent = "There has been a computer malfunction - sort it the **** out!";
,
_lookUpSuccess: function xhrSucceed(Result)
var response = JSON.parse(Result.responseText);
if (response.response[0].Message === "Found")
for (var x in response.response[1].term)
content.push(response.response[1].term[x]);
;
this._displayResult(content);
//displayResult(content);
return content;
else
content.push("Not Found", "Not Found");
return content;
,
_lookUpFail: function xhrFail(Result) document.querySelector(".titlearea .pagetitle").textContent = "Got Error"; ,
_lookUpProgress: function xhrProgress(Result) document.querySelector(".titlearea .pagetitle").textContent = "No Result 2"; ,
_displayResult: function (queryResult)
var holder;
holder = [DefDiv, DescDiv];
for (var i = 0; i < holder.length; i++)
//document.querySelector(".item-content .title").textContent = "FilmApp";
document.querySelector(holder[i]).textContent = queryResult[i];
;
,
);
// End of UI.page.define
// #2 This method is run on application load
WinJS.Application.addEventListener("activated", function (args)
if (args.detail.kind === appModel.Activation.ActivationKind.search)
args.setPromise(ui.processAll().then(function ()
if (!nav.location)
nav.history.current = location: Application.navigator.home, initialState: ;
return nav.navigate(searchPageURI, queryText: args.detail.queryText );
));
);
// #3
appModel.Search.SearchPane.getForCurrentView().onquerysubmitted = function (args) nav.navigate(searchPageURI, args); ;
)();
【问题讨论】:
【参考方案1】:在这行代码中:
WinJS.xhr( url: searchUrl ).done(this._lookUpSuccess, this._lookUpFail, this._lookUpProgress);
您将 _lookupSuccess
作为 done 处理程序函数传递,但是当它被调用时,this
的值不再是您想要的值,因为它将由调用 done 处理程序的任何内部设置.传递this._lookUpSuccess
作为函数只是传递函数。它没有传递this
的值。因此,当使用错误的 this
调用 this._lookUpSuccess
时,其中对 this
的任何引用都不会在其上找到预期的属性(因此您会看到错误)。
您可以像这样修复它,将this
值保存在局部变量中,然后在调用_lookUpSuccess()
时使用它:
var self = this;
WinJS.xhr( url: searchUrl ).done(function(result) self._lookUpSuccess(result), this._lookUpFail, this._lookUpProgress);
这是在回调中重新附加正确的this
值的一种非常常见的解决方法。
【讨论】:
非常感谢,这已经奏效了,但是它在lookUpSuccess
方法中引入了一个新问题。现在我得到`无法获取未定义或空引用的属性'responseText'',好像进行该修改已停止将任何值传递给_lookUpSuccess
@James - 是的,您必须传递结果值。我已经修改了我的答案,以展示你是如何做到的。注意:如果_lookUpFail
和_lookUpProgress
需要this
ptr,您会遇到完全相同的问题。
这非常有效,非常感谢您的帮助。非常有用的疑难解答!
非常感谢!这解决了我过去一个小时一直困扰的问题。 :D【参考方案2】:
在:
this._displayResult(content);
那里,this
显然是 undefined
或 null
【讨论】:
我原本是这么想的,但后来看到下面的链接建议它应该是undefined
- ***.com/questions/9822561/…以上是关于无法获取未定义或空引用的属性 - Windows 8 JS/CSS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Angular 2+:IE 11 无法获取未定义或空引用的属性“调用”
无法在 WCF Rest 中获取未定义或空引用的属性“appendChild”
IE10 d3.v3.js 错误:无法获取未定义或空引用的属性“原型”