如何在userscript中发送和检索跨域ajax数据

时间:2013-08-08 04:12:55

标签: ajax jquery cross-domain jsonp userscripts

我使用此代码通过http://openkeyval.org/

存储和检索ajax数据
 $.ajax({    /*   send data    */
        url: "http://api.openkeyval.org/store/",
        data: "test-key-data=" + JSON.stringify([123,456]),
        dataType: "jsonp",
        success: function(data){
            console.log(data);
        }
 }); 

$.ajax({     /*   retrieve data     */
        url: "http://api.openkeyval.org/test-key-data",
        dataType: "jsonp",
        success: function(data){
            console.log(data);
        }
 }); 

Chrome浏览器javascript控制台中的一切正常,但在用户脚本中我收到类似的错误

  

未捕获的ReferenceError:jQuery110208458673823624849_1375932537303是   未定义

我尝试使用 GM_xmlhttpRequest 来检索此类数据

GM_xmlhttpRequest({
    method: "GET",
    url: "http://api.openkeyval.org/test-key-data",
    onload: function(response) {
        console.log(response.responseText);
    }
});

但似乎openkeyval不接受来自POST / GET方法的数据,并且日志结果就像您直接从浏览器的URL访问它一样this

  

{ “错误”: “NOT_FOUND”, “documentation_url”: “http://openkeyval.org/”}

我包含 jQuery ,它可以正常使用此代码 // @require http://code.jquery.com/jquery-latest.min.js

我尝试使用Greasemonkey/jQuery XHR bridge而不是像这样更改其他代码  // @require http://courses.ischool.berkeley.edu/i290-4/f09/resources/gm_jq_xhr.js

并尝试使用 openkeyval官方javascript库,代码如下所示 // @require http://cdn.openkeyval.org/statics/openkeyval.packed.js
用这样的代码检索数据

var ourCallback = function(value, key) {
  console('The value of ' + key ' + is ' + value);
};
window.remoteStorage.getItem('test-key-data', ourCallback);

仍然出现错误ERROR: Unexpected string

请帮助,我把它弄得超过10个小时。
非常感谢你。

3 个答案:

答案 0 :(得分:3)

看起来$.ajax始终触发错误事件功能
GM_xmlhttpRequest可以检索错误数据,所以我尝试在dataType: "jsonp"中查找GM_xmlhttpRequest,我得到的jsonp标头内容类型为"application/javascript"或{{1第一个很好用。

我检索数据的新代码如下所示

"application/json"

并使用GM_xmlhttpRequest({ method: "GET", url: "http://api.openkeyval.org/test-key-data?nocache=" + new Date(), headers: { "Content-Type": "application/javascript" }, onload: function(response) { console.log(response.responseText); } }); 检索数据,即使它始终触发错误事件功能,但它仍然会发送数据 我在$.ajax上尝试了两种内容类型,但仍无法正常工作。

我存储数据的代码看起来像这样

GM_xmlhttpRequest

答案 1 :(得分:0)

将其添加到$ .ajax({...})

crossDomain: true;

这是因为默认禁用跨域功能。见http://api.jquery.com/jQuery.ajax/

编辑:

有时本地脚本和远程脚本之间会出现不同的charset问题。尝试使用:

scriptCharset: "utf-8";

另请参阅JQuery AJAX is not sending UTF-8 to my server, only in IE

答案 2 :(得分:0)

阐述我的评论

引用是由jquery生成的回调函数。 听起来你调用你的用户脚本的方式在执行回调之前卸载了jquery函数。 也许您使用链接并忘记了preventDefault?

如果你是ajax并且有

 $("#linkid").on("click"

 $("#formid").on("submit"

继续这样做是强制性的:

           ,function(e) {
    e.preventDefault();

否则,将遵循链接或提交表单,这可能没有任何明显的效果,但异步脚本已被(部分)卸载,除非表单和链接具有除当前窗口之外的目标