从Safari扩展创建JSONP回调
Creating a JSONP Callback From Safari Extension
我正试图通过Safari扩展从Reddit加载一些数据。我使用JSONP模式来创建回调函数,并将新的src附加到脚本中。但是,看起来有两个窗口名称空间,并且我动态创建的函数对于动态添加的脚本的上下文不可用。
这个链接似乎详细说明了chrome的问题,我猜它与Safari中的类似。
chrome扩展中的JSONP请求,回调函数不';不存在?
这是代码(在扩展之外工作):
function jsonp(url, callback) {
var callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());
window[callbackName] = function(data) {
delete window[callbackName];
callback(data);
};
console.log('about to create script');
var script = document.createElement('script');
script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'jsonp=' + callbackName;
document.body.appendChild(script);
console.log('script should be appended');
}
function getImages(){
jsonp('http://www.reddit.com/r/cats/.json', function(data) {
data.data.children.forEach(function(el){
console.log(el.data.url);
});
});
}
有什么想法,解决办法吗?
谢谢!
您说得对,在同一个窗口中有两个名称空间。注入的脚本无法访问网页的全局变量,反之亦然。当您在注入的脚本中启动JSONP时,插入的<script>
标记的脚本会在网页的命名空间中运行。
我知道有两种方法可以在Safari扩展中绕过这个限制。
可能更好的方法是使用扩展的全局页面通过标准XHR或jQueryAjax方法(在全局页面脚本中支持这些方法)与外部API通信,并使用消息将提取的数据传递给注入的脚本。
另一种方法是继续使用注入的脚本中的JSONP,但让JSONP回调函数将提取的数据添加到页面的DOM中,注入的脚本可以访问DOM。例如,您可以将数据放在隐藏的<pre>
元素中,然后使用该元素的innerHTML
属性来检索它。当然,这种技术确实会使内容对页面自己的脚本可见,所以要小心。
相关文章:
- 如何在原生 JavaScript Promise 中包装 jsonP 回调
- 如何在 jsonp 回调中返回跨域 html
- JSONP 回调顺序不对
- jsonp 回调(stripe.js)中延迟承诺的 Karma 单元测试
- 清理 jsonp 回调的最佳方法
- JSONP回调-当使用jQuery调用时,数据到达时未被捕获
- AngularJS http.jsonp回调未定义
- 没有用jQuery调用jsonp回调函数
- 从Safari扩展创建JSONP回调
- 将附加参数传递给JSONP回调
- 如何创建JSONP回调
- jsonp回调错误
- 角度jsonp回调只执行一次
- 从ajax jsonp回调中获取列表
- 文档.写jsonp回调
- 将JSONP回调的结果保存到外部对象
- JSONP回调未定义
- JSONP回调不能从这个电影院url工作
- 使用javascript jsonp回调函数
- JQueryAJAX的JSONP回调函数