2014-01-23 33 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