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



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

 $.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控制台中的一切都很好,但在userscript中,我收到了这样的错误

未捕获引用错误: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访问它一样

{"error":"not_found","documentation_url":"http://openkeyval.org/"}

我包括jQuery,它可以很好地使用此代码
// @require http://code.jquery.com/jquery-latest.min.js

我尝试使用Greasemonkey/jQuery XHR桥,而不更改其他代码,如下所示
// @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多个小时
非常感谢。

看起来$.ajax总是触发错误事件函数
但是GM_xmlhttpRequest可以检索错误类型的数据,
所以我尝试在GM_xmlhttpRequest中查找dataType: "jsonp",我得到jsonp头内容类型是"application/javascript""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);
    }
});

并使用CCD_ 11检索数据,即使它总是触发错误事件功能,但它仍然发送数据
我在GM_xmlhttpRequest上尝试了两种内容类型,但仍然无法工作。

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

$.ajax({    /*   send data    */
        url: "http://api.openkeyval.org/store/",
        data: "test-key-data=" + JSON.stringify(myVarObject),
        dataType: "jsonp"
 }); 

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

crossDomain: true;

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

编辑:

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

scriptCharset: "utf-8";

另外,看看JQuery AJAX并没有向我的服务器发送UTF-8,只是在IE 中

详细阐述我的评论

引用是指jquery生成的回调函数。在我看来,调用用户脚本的方式是在执行回调之前卸载jquery函数。也许你使用了一个链接,却忘记了preventDefault?

如果你有ajax和

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

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

必须继续这样做:

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

否则,链接被跟踪或表单被提交,这可能没有任何可见的效果,但异步脚本已经(部分)卸载,除非表单和链接的目标不是当前窗口

相关内容

  • 没有找到相关文章

最新更新