这是jquery中的跨域问题吗?

时间:2012-11-06 22:59:39

标签: javascript jquery ajax

我不确定这是否是跨域问题。我正在尝试使用$.ajax来加载文件。但是有些文件我得到readyState = 4而有些文件我得到readyState = 1

这是我运行茉莉花测试的路径 file:///home/myname/development/path1/path2/src/test/java/javascript/jasmine/SpecRunner.html

在代码中我使用jQuery.pyte来要求相关文件。但是当代码进入$ .ajax

时,它停留在readyState:1

如果我做这样的事情,它会正确返回readyState = 4并打印出SpecRunner.html内的内容


$.ajax({url: 'file:///home/myname/development/path1/path2/src/test/java/javascript/jasmine/SpecRunner.html', async: false}).responseText

但如果我做这样的事情,我只会得到readyState = 1并且不会返回任何内容。


$.ajax({url: 'file:///home/myname/development/path1/path2/src/main/webapp/static/js/core/application/FileThatIWant.js', async: false}).responseText

2 个答案:

答案 0 :(得分:1)

一般来说,你应该避免使用file:// URL,因为浏览器不允许在很多不同的地方使用它们。试试XAMPP它是一个简单易用的本地网络服务器,你肯定需要一个。

答案 1 :(得分:1)

是的,这是一个跨域问题。您可以通过强制jQuery使用跨域AJAX(JSONP)来解决此问题。

$.ajax({
    url:            "yoururl",
    cache:          false,
    crossDomain:    true,
    data:           {}, //put your GET parameters here or directly into the url
    dataType:       "jsonp",
    processData:    true,
    success:        function(data, textStatus, jqXHR){
                        //This will be executed if it worked
                    },
    error:          function(data, textStatus, jqXHR){
                        //This will be executed if it failed
                    },
    timeout:        4000, //You can put any value here
    traditional:    true,
    type:           "GET"
});

jQuery会自动添加一个包含随机字符串的回调参数(& callback = XXXXXX)。 目标URL需要输出以下内容:

XXXXX(your_output_encoded_in_JSON);

其中XXXXX是随机字符串。这样做的PHP代码是:

echo $_GET["callback"]."(".json_encode($myoutput).");";

确保PHP(或您正在使用的任何语言)页面仅输出! 相反,如果您要查询的页面不是动态构建的,例如HTML页面,则需要将以下选项添加到$ .ajax选项对象中:

jsonp:          false,
jsonpCallback:  "mycallback",
mimeType:       "text/javascript",

您的.html文件将包含以下内容:

mycallback("<html><head></head><body>TEST PAGE. This is a double quote: \" and I didn't forget to escape it!</body></html>");

这种技术非常方便绕过浏览器中硬编码的严格跨域限制,但它只支持GET参数。 XMLHTTPRequest v2支持跨域请求,但我们无法假设所有用户至少在2016年之前都拥有与XHRv2兼容的浏览器。 http://caniuse.com/xhr2