簡體   English   中英

為什么我收到此錯誤:“未捕獲的TypeError:無法讀取未定義的屬性'標題'”?

[英]Why am i getting this error: “Uncaught TypeError: Cannot read property 'Title' of undefined”?

我正在嘗試編寫一個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

這是證明其未定義:

_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調用已完成其完成功能。

要解決此問題,請在_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;
        }
    );
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM