jQuery load()使用Greasemonkey给出空结果

时间:2012-01-05 00:41:27

标签: jquery greasemonkey

我正在尝试加载外部页面并解析HTML:

var $f = jQuery().load("http://google.com");
alert($f.text());

但是警告框没有显示任何内容,长度为零。

我正在使用Greasemonkey 0.9.13和jQuery 1.7.1

我做错了什么?


来自OP评论的注释,如下:"script is executed from same domain. google is only an example"

3 个答案:

答案 0 :(得分:2)

由于same origin policy,大多数AJAX请求无法从其他域成功检索数据。 (必须设置外部服务器以专门促进跨域请求。)。 .load()的API规范中的See the notes

编辑:如果遵循某些原始政策,您的JS仍然不太正确。 .load()不返回AJAX结果,它将其插入到链中的前一个元素中。所以:

var $f = $('div');
    $f.load("/somepath", function() {
        // do something with the subtree of $f
    });

答案 1 :(得分:0)

除非您使用gm_xmlhttprequest,否则它根本不会起作用,除非您使用$.get('http://google.com', function(data) { alert($(data).text()); }); 但是如果不是,您可以通过以下方式完成您尝试的操作:

{{1}}

答案 2 :(得分:0)

正如其他人所指出的,jQuery load()(和大多数其他jQuery AJAX)不能跨域工作。你说这不是一个因素,但它将来会或其他人。

该代码更直接的问题:

var $f = jQuery().load("http://google.com");
alert($f.text());

load()是不是同步的。第一行代码启动一个进程,但执行会立即下降到alert()语句 - 很久load()进程完成。

使用GM_xmlhttpRequest() 解决这两个问题。

所以你的代码会变成:

var pageText;

GM_xmlhttpRequest ( {
    method:         'GET',
    url:            'http://google.com',
    onload:         function (responseDetails) {
                        pageText = responseDetails.responseText;

                        //-- This will alert the page contents.
                        alert (pageText);
                    }
} );

//--- This will alert nothing.
alert (pageText);


请务必在onload处理程序中处理文本。



如果你真的必须让代码等待加载的页面(推荐),你可以使用synchronous标志,如下所示:

var pageText;

GM_xmlhttpRequest ( {
    method:         'GET',
    url:            'http://google.com',
    onload:         function (responseDetails) {
                        pageText = responseDetails.responseText;

                        //-- This will alert the page contents.
                        alert (pageText);
                    },
    synchronous:    true
} );

/*--- This will also alert the text, but the page/GM script can appear 
    to "freeze" for a bit.
*/
synchronous:    true
alert (pageText);