无法获取未定义或空引用的属性 - 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 显然是 undefinednull

【讨论】:

我原本是这么想的,但后来看到下面的链接建议它应该是undefined - ***.com/questions/9822561/…

以上是关于无法获取未定义或空引用的属性 - Windows 8 JS/CSS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

无法获取未定义或空引用的属性“id”

Angular 2+:IE 11 无法获取未定义或空引用的属性“调用”

无法在 WCF Rest 中获取未定义或空引用的属性“appendChild”

IE10 d3.v3.js 错误:无法获取未定义或空引用的属性“原型”

0x800a138f - JavaScript 运行时错误:无法获取未定义或空引用的属性“mData”

无法解析数据表 SCRIPT5007:无法设置未定义或空引用的属性“_DT_CellIndex”