Javascript 请求DOM对象时,XMLHttpRequest.send()引发异常

Javascript 请求DOM对象时,XMLHttpRequest.send()引发异常,javascript,firefox,xmlhttprequest,greasemonkey,Javascript,Firefox,Xmlhttprequest,Greasemonkey,我想在Firefox/Greasemonkey用户脚本中检索HTML页面作为文档 编辑:这不是跨域请求 下面是我的示例代码: var r = new XMLHttpRequest(); r.open("GET", document.location.href, true); r.responseType = "document"; r.send(null); 这看起来就像中的示例, 但是r.sendnull会导致类型错误。原因,而不是投掷!在try…catch中包装该行不会改变任何内容,似乎回

我想在Firefox/Greasemonkey用户脚本中检索HTML页面作为文档

编辑:这不是跨域请求

下面是我的示例代码:

var r = new XMLHttpRequest();
r.open("GET", document.location.href, true);
r.responseType = "document";
r.send(null);
这看起来就像中的示例, 但是r.sendnull会导致类型错误。原因,而不是投掷!在try…catch中包装该行不会改变任何内容,似乎回调或事件处理程序会引发异常:

TypeError: document.location is null
回溯指的是Firefox内部event.js文件,而不是我的脚本

删除设置responseType的行会消除异常,添加回调则不会。 但是,响应是有效的,responseXML提供了一个DOM树。 我使用的是FF 13.0.1

我是遗漏了什么还是这是一个错误


解决方案:这与Mozilla的插件生成器(而不是Firefox)创建的扩展有关。

不幸的是,您无法从一个域到另一个域执行Ajax:

您可以读入CORS:

或JSONP作为可能的解决方案:

然而,浏览器的设计方式是这样的,因为这是一个安全问题,所以人们不能在域之间随机创建Ajax请求

如果您确实需要从另一个域获取内容,我会考虑使用创建您自己的服务器API,在同一个域上提供您自己的内容,然后在那里使用Ajax。否则,您必须查看Google是否会授予CORS访问权限或是否有某种内置的JSONP请求。

脚本正在Google.com上运行,您正在尝试获取Google.de,对吗?这是一个跨域请求。此外,问题代码不是XMLHttpRequest的有效同步或异步使用

要在Greasemonkey脚本或Chrome中执行跨域或非AJAX,请使用。 请注意,GM_xmlhttpRequest当前不允许您指定responseType,但在本例中无论如何都不需要这样做。如果您想要一个好的解析文档,请使用DOMParser

总而言之:

GM_xmlhttpRequest ( {
    method:     'GET',
    //url:        'https://www.google.de/',
    url:        location.href,  // self get, checking for updates
    onload:     function (respDetails) {
                    processResponse (respDetails);
                }
} );

function processResponse (respDetails) {
    // DO ALL RESPONSE PROCESSING HERE...
    var parser  = new DOMParser ();
    var doc     = parser.parseFromString (respDetails.responseText, "text/html");

    //--- Example showing that the doc is fully parsed/functional...
    console.log (doc.querySelectorAll ("p") );
}
PS:因为这毕竟不是跨域的,所以更正后的原始代码是:

var r           = new XMLHttpRequest();

r.onload        = function () {
    // DO ALL RESPONSE PROCESSING HERE...
    console.log (this.response.querySelectorAll ("div") );
}
r.open ("GET", location.href, true);
r.responseType  = "document";
r.send (null);

对于异步请求。

我在Chrome上遇到以下错误:XMLHttpRequest无法加载https://www.google.de/. 起源http://fiddle.jshell.net 访问控制允许原点不允许。看起来很清楚。。。这是一个完全不同的问题。当然,当脚本源于jshell.net时,对google.com的http请求是不允许的。将其作为用户脚本尝试,此错误将消失。Firefox中没有event.js文件。听起来您安装了一些扩展,可以查看所有XHR,但不知怎么搞砸了。。。。有问题的event.js文件的完整URI是什么?你是对的。这不是Firefox,而是用Mozilla的插件生成器创建的Hello World扩展。很抱歉,这是一个误导性的示例代码。事实上,我正在从脚本的域中请求。它被设置为google.com的用户脚本。请求甚至成功了,但在进程中抛出了一个异常。@trion。。。我可以发誓位置对象是window.location而不是document.location。试着使用window.location,也许吧?它们都是一样的。另外,传递给open的URL并不重要,无论我在哪个网站上测试,都会出现完全相同的错误。@trion我正在查看我编写的一些旧代码,我省略了responseType行,也没有在send方法中包含null。是的,responseType行显然是这里的问题。但是,如果我省略它,请求的响应类型是纯文本,但是我需要一个DOM树来从中提取HTML元素。这不是跨域请求,我调整了原始帖子。那么请求document.location.href有什么意义?这是当前页面,您已经拥有了它!此外,此答案的代码将毫无顾忌地工作。在不刷新整个浏览器窗口的情况下,检查页面的更新并将其添加到当前视图。我可以在GM_xmlhttpRequest中指定responseType吗?不,您不能设置responseType,但在本例中,您也不需要这样做。查看更新的答案。除了不忽略响应之外,我看不到我的原始代码与您的更正之间的差异。不管怎样,结果证明这个问题与Ajax和Greasemonkey无关;感谢您对DOMParser的提示。