我正在尝试加载外部页面并解析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"
答案 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);