为什么我收到此错误:“未捕获的TypeError:无法读取未定义的属性’标题’”?

我正在尝试编写一个ajax web应用程序。 我有一个函数,假设请求一个json对象,然后使用它来重新/填充网站。

这是问题中的Javascript (第8 – 16行)

window.onload=LoadData("Home", {}); var _doc = {}; function LoadData(page, params) { $.get(page, params, function ( data ) { _doc = jQuery.parseJSON( data ); } ); document.title = _doc.Title.Title; }; 

这是Chrome给出的错误:

 Uncaught TypeError: Cannot read property 'Title' of undefined LoadDatahttp://127.0.0.1/:15 (anonymous function) 

如果我在控制台中运行相同的语句,这让我感到困惑:

 document.title = _doc.Title.Title; "Home" 

它将标题更改为Home

这是certificate其未定义:

 _doc Object Body: Object Menus: Array[4] 0: Object Menu: Object 1: Object Menu: Object 2: Object Menu: Object 3: Object Menu: Object Title: Object Title: "Home" User: Object Name: "Username" 

并截图作为概述: 这就是Chrome控制台的样子...... 注意:对底部函数的调用确实改变了标题

您只能在回调中访问AJAX请求中的data

 window.onload=LoadData("Home", {}); var _doc = {}; function LoadData(page, params) { $.get(page, params, function ( data ) { _doc = jQuery.parseJSON( data ); document.title = _doc.Title.Title; } )); }; 

AJAX请求( 异步 JavaScript和XML)请求是异步的; 浏览器启动请求,而不是等待响应…而是继续执行JavaScript。 一段时间后 ,当AJAX请求的HTTP请求完成时,将调用您为AJAX请求提供的回调,并且可以访问HTTP响应中包含的数据。

在你的情况下, document.title = _doc.Title.Title; 在调度AJAX请求之后立即执行(即在上面提到的一段时间之后发生); 所以回调_doc = jQuery.parseJSON( data ); 尚未解雇,所以_doc仍然是一个空对象,所以_doc.Title是未定义的,并且尝试在未定义的_doc.Title上检索Title _doc.Title错误。

与您的问题无关,但仅供参考,您可能需要查看jQuery.getJSON方法; jQuery.get方法之间的区别在于您传递的响应对象已经是JSON对象(因此您不需要调用jQuery.parseJSON )。

你的$.get()函数是异步的。 这意味着当你调用它时,你所做的就是开始执行ajax调用。 因此,它之后的行:

 document.title = _doc.Title.Title; 

在ajax调用完成之前执行。 您只知道ajax调用已完成其完成function。

要解决此问题,请在_doc中添加对ajax完成函数的引用:

 window.onload=LoadData("Home", {}); var _doc = {}; function LoadData(page, params) { $.get(page, params, function ( data ) { _doc = jQuery.parseJSON( data ); document.title = _doc.Title.Title; } ); };