2014-01-23 68 views
1

我現在已經堅持了幾個小時。請幫我發現錯誤!爲什麼這個d3.text請求失敗?

爲什麼這個d3.text請求失敗? (link to diff.php

d3.text("http://q39.qhor.net/cach/diff.php?action=diff", function(diff) { 
    document.write(diff); // returns 'null' 
}); 

雖然這是行得通的嗎? (link to ltcProxy.php

d3.text("http://freya.syari.net/pool/ltcProxy.php?action=diff", function(diff) { 
    document.write(diff); // returns a number read from input 
}); 

我一直在閱讀這一回documentation來回,嘗試使用不同的輸入格式(text/plaintext/html,等...),但我不能得到的第一個片段的工作。

它有什麼不對?

+0

在D3的新版本中,*秒*回調的參數是數據 - 即'function(error,diff)'。那對你有用嗎? –

+0

不是,但似乎第一個鏈接的請求花費的時間太長,這就是爲什麼'diff'是'null'的原因。不知道如何解決它,而不會失去性能...... – default

+0

第一個對我來說相當快(幾乎是瞬間)。 –

回答

1

正如您發現的那樣,如果文件請求返回錯誤,則數據對象(diff)將爲空。你本可以更快地計算出來,如果你總是使用回調函數的兩個參數的版本,使你的函數的第一行的錯誤檢查:

d3.text("http://q39.qhor.net/cach/diff.php?action=diff", function(error, diff) { 

    if (error) { 
     document.write("Error reading file"); 
     return; 
    } 

    document.write(diff); // returns 'null' 
}); 

由D3傳遞的「錯誤」對象除了檢查它的存在之外並不是非常有用 - 它是使用的XMLHTTPRequest函數,而不是返回的錯誤。錯誤本身應該通過瀏覽器記錄到您的控制檯。

即使您可以直接打開文件沒有問題,爲什麼文件請求會返回錯誤?因爲在使用外部文件時Javascript非常禮貌:只有當服務器包含一個表示可能會被網頁使用的標頭時,它纔會使用它們。

具體來說,應該在控制檯上,當您嘗試運行該請求將會像

XMLHttpRequest cannot load http://q39.qhor.net/cach/diff.php?action=diff . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://fiddle.jshell.net ' is therefore not allowed access.

換句話說可以顯示錯誤消息,你不能在你的腳本,除非它使用別人的文件,特別是告訴您的瀏覽器您有權使用它。您在第二個示例中使用的代理服務器爲您提取文件,然後將其傳遞給瀏覽器,並使用http://syari.net域中任何網站可能使用的說明。如果我嘗試使用從JS撥弄那個文件名,但是,我仍然得到一個錯誤:

XMLHttpRequest cannot load http://freya.syari.net/pool/ltcProxy.php?action=diff . The 'Access-Control-Allow-Origin' whitelists only ' http://syari.net '. Origin ' http://fiddle.jshell.net ' is not in the list, and is therefore not allowed access.

更多的訪問控制和HTTP請求: https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS