我正在尝试创建一个bookmarklet,它将启动对我编写的aspx页面的AJAX调用。
当我将javascript放在静态html页面中时,代码测试完美,但当我尝试从书签中调用它时,代码将挂在xmlHttp.open(“GET”,url,true)一部分。
书签的代码基本上是这个(在网上的几个例子中找到):
javascript:(function(){
var s,
d=document,
a=function(o){ d.body.appendChild(o) };
s=d.createElement('script');
s.type='text/javascript';
s.src='http://localhost/squirt/sq.js';
a(s)
})();
这会将sq.js的内容(ajax调用+其他一些处理)添加到浏览器当前所在的页面,然后将ajax调用到我的aspx页面。
我正在使用ASP 2.0(带VS2008)和IIS 7.到目前为止,我刚刚在我的家庭网络上测试它。
我认为来自外部页面的ajax调用必定存在某种权限问题,因为就像我说的那样,一切都可以从静态页面中正常工作。这是一个IIS设置我需要更改以允许呼叫,还是我做错了什么?
答案 0 :(得分:3)
XMLHttpRequest对象遵循同源策略
这就是为什么您的bookmarklet加载的脚本不能使用XHR从服务器获取数据,除非它嵌入在服务器的页面中。
通过动态添加脚本标记添加的脚本可以正常工作,您可以知道 - 您的书签可以从不同的来源加载脚本
所以有你的答案。不要使用XMLHttpRequest对象:以与书签相同的方式动态加载脚本
这就是JSONP的工作原理(实际上JSONP还有更多内容,但它是如何绕过SOP的)
实际上,为什么不使用JSONP
答案 1 :(得分:0)
在页面上注入JavaScript代码仍然具有与通常存在的代码相同的权限问题。您无法对其他域进行Ajax调用。因此,如果您从example.com调用localhost,它将不起作用。
您可能希望查看从服务返回JSON并使用脚本标记进行JSON调用。
埃里克
答案 2 :(得分:0)
您在那里使用的代码相当丑陋,我建议使用我构建的类似内容:http://sktrdie.org/getScript.js
它的工作原理如下:
getScript("http://anotherdomain.com/something", function(data) {
alert(data); // the request is complete
});
在http://anotherdomain.com/something上,如果你使用PHP,它必须返回这样的东西:
echo $_GET["jsonp"]."('Testing data, you can put anything in here');";
请务必阅读JSONP。