2011-12-13 66 views
12

我正在一个Chrome扩展(内容脚本)中发出JSONP请求。当我作为一个网页运行时,一切运行良好 - 在浏览器中加载HTML文件 - 但是当我将它加载为Chrome扩展时,当服务器提供响应时,jquery创建的jsonp回调函数似乎不存在。Chrome扩展中的JSONP请求,回调函数不存在?

我的控制台说:

Uncaught ReferenceError: jQuery17105683612572029233_1323808231542 is not defined 

这里是我的Ajax请求:

$.ajax({ 
    url: 'http://example.com', 
    data: 
    { 
     imgUrl: this.href, 
     returnString:true 
    }, 
    dataType: "jsonp", 
    success: function(msg){ 
     newNode.src = msg.data; 
    }, 
    error: function(msg){ 
     console.log(msg.data); 
    } 
}) 
+0

为了澄清,你已经尝试过了一个Chrome扩展,没有问题么?你确定你有对你请求的URL的主机许可吗? – 2011-12-13 20:40:09

+0

正确的,当它不是一个扩展名 - 只是打开一个包含javascript文件的网页时,它可以正常工作。我应该提到这是一个内容脚本。 – 2011-12-13 20:42:46

回答

23

的问题是JSONP响应是由实际的页面抓,沙盒JavaScript代码之外的Chrome内容脚本也会限制您。

jQuery17105683612572029233_1323808231542是jQuery JSONP调用为特定调用动态生成的回调函数的名称。此功能正在内容脚本有权访问的沙盒区域中定义。

我知道的唯一解决方法是为内容脚本创建一个XHR调用。从Chrome 13开始,您可以通过内容脚本使XHR调用跨域(非常酷)。在您的清单文件,你需要将外部URL添加到权限:

{ 
    ... 
    "permissions": [ 
     "http://example.com" 
    ] 
} 

然后,您可以让XHR调用就像这样:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com/", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     //handle the xhr response here 
    } 
} 
xhr.send(); 

你需要做一些事情的jQuery为你自动完成,比如将数据对象的值编码到XHR URL(在你的例子中是“imrUrl”和“returnString”),并将xhr.responeText或xhr.reponseXML的响应转换为对象。

这种方法的不足之处在于,如果您在Chrome扩展程序和其他内容(如书签)之间共享此代码,则您现在必须为Chrome用例设置不同的逻辑。

欲了解更多信息,请参阅:Chrome Extension XHR