在Chrome扩展中使用jQuery.getJSON
我需要在Chrome扩展程序中执行跨域请求。 我知道我可以通过消息传递,但我宁愿坚持只是jQuery习语(所以我的javascript也可以作为 )。
我做正常的:
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) { console.log(data); });
但在错误控制台中我看到:
Uncaught ReferenceError: jsonp1271044791817 is not defined
jQuery没有正确地将回调函数插入到文档中吗? 我能做些什么来完成这项工作?
(如果我将代码粘贴到chrome控制台中,它可以正常工作,但如果我把它作为page.js放在扩展名中就会出现问题。)
唉,这些都不起作用,所以我最终通过background.html进行了沟通。
background.html
Java脚本/ page.js
chrome_getJSON = function(url, callback) { console.log("sending RPC"); chrome.extension.sendRequest({action:'getJSON',url:url}, callback); } $(function(){ // use chrome_getJSON instead of $.getJSON });
如果在manifest.json文件中指定“api.flickr.com”,则不需要使用JSONP回调,跨域请求的脚本注入样式。
例如:
"permissions": ["http://api.flickr.com"],
这应该在你的代码中很好地工作。 我会删除querystring参数“&jsoncallback”,因为不需要JSONP工作。
您当前代码无法正常工作的原因是您的代码注入到页面DOM中,内容脚本可以访问DOM但无法访问javascript上下文,因此没有方法可以调用回调。
我的印象是,这失败是因为jQuery回调函数是在Chrome扩展的“隔离世界”内创建的,并且在响应回来时无法访问:
http://code.google.com/chrome/extensions/content_scripts.html#execution-environment
我出于各种原因使用Prototype和jQuery,但我的快速修复应该很容易解析:
// Add the callback function to the page s = new Element('script').update("function boom(e){console.log(e);}"); $$('body')[0].insert(s); // Tell jQuery which method to call in the response function shrink_link(oldLink, callback){ jQuery.ajax({ type: "POST", url: "http://api.awe.sm/url.json", data: { v: 3, url: oldLink, key: "5c8b1a212434c2153c2f2c2f2c765a36140add243bf6eae876345f8fd11045d9", tool: "mKU7uN", channel: "twitter" }, dataType: "jsonp", jsonpCallback: callback }); } // And make it so. shrink_link('http://www.google.com', "boom");
或者,您可以尝试使用扩展XHRfunction:
http://code.google.com/chrome/extensions/xhr.html
var xhr = new XMLHttpRequest(); xhr.open("GET", "http://api.example.com/data.json", true); xhr.onreadystatechange = function() { if (xhr.readyState == 4) { // JSON.parse does not evaluate the attacker's scripts. var resp = JSON.parse(xhr.responseText); } } xhr.send();
语法有点偏。 不需要callback(
位。这可以完美地工作。在这个StackOverflow页面(包括jQuery)上测试Chrome的javascript控制台:
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) { console.log(data); });
很多人都知道,谷歌浏览器目前不支持任何便捷的GM_function。
因此,由于各种沙箱限制(甚至使用像James Padolsey的跨域请求脚本这样的优秀工具), 不可能进行跨站点AJAX请求
我需要一种方法让用户知道我的Greasemonkey脚本何时在Chrome中更新过(因为Chrome不会这样做……)。 我提出了一个解决方案,这里有一个解决方案(并在我的Lighthouse ++脚本中使用),值得一读,以便你想要对你的脚本进行版本检查:
http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script