2016-03-06 66 views
0
function getJSON(url, placeholderForCallback){ 
    var request = new XMLHttpRequest(); 
    request.open('GET', url, true); 
    request.onprogress = function(event){ 
     console.log(event.loaded, event.total); 
    }; 
    request.addEventListener('load', function(){ 
     if(request.status < 400){ 
      placeholderForCallback(request); 
     } 
    }); 
    request.send(null); 
} 

getJSON('http://api.open-notify.org/astros.json', function(placeholder){ 
    console.log(placeholder.responseText); 
}); 

我有三個問題:阿賈克斯XMLHttpRequest實例方法ivocation

哪個事件被傳遞給函數request.onprogress()

2.爲什麼我看不到request.onprogres()的調用?取而代之的是與價值null屬性初始化之前: printscreen of console

是本次活動傳遞給函數的時間或事件火災每一個時期?萬一發生火災 - 爲什麼我不能在任何地方看到request.addEventListener('event', request.onprogres())

+0

如平時好主意來算賬) - 加入 '事件' 本身的執行console.log: request.onprogress =函數(事件){ 的console.log( event.loaded,event.total,event); }; 它給了我 'XMLHttpRequestProgressEvent' 對象 – Dancyg

回答

0
  1. 當服務器報告整體操作的某些進度時,會調用XMLHttpRequest對象的onprogress屬性。這會觸發XHR的進展情況,其存儲作爲該事件的處理程序有以下功能:

    function(event){ 
        console.log(event.loaded, event.total); 
    } 
    
  2. 進度事件的調用由服務器最新進展引發的,所以你不會/不能確切地知道何時會發生,但通常每個字節大約每隔50毫秒(如此處所述:XmlHttpRequest onprogress interval)。

  3. 是的,每次Progress事件觸發時,事件都會傳遞給您的事件處理程序。這就是爲什麼你能得到event.loadedevent.total。每次調用該函數時,更新的事件都會與更新後的信息一起傳遞。

您的代碼不「絲上」使用DOM事件模型的進展情況:

request.addEventListener('event', functionToHandleEvent); 

相反,你的代碼使用onprogress對象屬性來存儲處理該事件的功能:

request.onprogress = function(event){ 
     console.log(event.loaded, event.total); 
    }; 

這種技術確實讓您的回調函數被註冊,但它是一種較老的技術。標準(和更新的方式)是:

request.addEventListener("progress", function(event){ 
     console.log(event.loaded, event.total); 
    }); 
+0

是 'XMLHttpRequestProgressEvent' 對象傳遞給每個屬性: 'onabort:空 的onerror:空 的onload:(事件) onloadend:空 onloadstart:空 onprogress:(事件) onreadystatechange:null ontimeout:null'作爲'事件'? – Dancyg

+0

當通過回調函數處理事件時,該函數總是將事件對象作爲函數的第一個參數傳遞。所以,是的,您創建的用於處理中止,錯誤,readystatechange,超時等的函數將全部通過事件對象。只要確保你的回調函數通過指定一個參數來接收它,就像函數(evt){。 。 。 } –

0
  1. what event is passed to the function request.onprogress

按照documentation它傳遞的對象與在其他loadedtotal性能。

  1. why cannot I see request.onprogres invocation

因爲你試圖調用遠程端點(http://api.open-notify.org/astros.json)不支持CORS和爲你的AJAX請求永遠不會發送的結果。進度事件將在實際進行AJAX請求後被調用以報告進度。

請注意,除非遠程服務器明確支持,否則無法進行跨域AJAX調用。

3.this event is passed to the function every period of time or event fire?

這是在執行AJAX請求期間觸發的事件。