1

我正在运行GM_xmlhttpRequest(在 Greasemonkey 脚本中)并将其存储responseText到新创建的 HTML 元素中:

var responseHTML = document.createElement('HTML');
...
onload: function() { responseHTML.innerHTML = response.responseText; }


然后我试图找到一个元素responseHTML

console.log(responseHTML.getElementsByTagName('div'));
console.log(responseHTML.getElementById('result_0'));


第一个工作正常,但不是第二个。有任何想法吗?

4

3 回答 3

7

用于DOMParser()转换responseText为可搜索的 DOM 树。
此外,您尝试搜索/使用从responseText, 派生的任何内容都必须发生在onload函数内部。

使用这样的代码:

GM_xmlhttpRequest ( {
    ...
    onload:     parseAJAX_ResponseHTML,
    ...
} );

function parseAJAX_ResponseHTML (respObject) {
    var parser      = new DOMParser ();
    var responseDoc = parser.parseFromString (respObject.responseText, "text/html");

    console.log (responseDoc.getElementsByTagName('div'));
    console.log (responseDoc.getElementById('result_0'));
}


当然,还要验证一个带有 id 的节点result_0实际上是否在返回的 HTML 中。(使用 Firebug、Wireshark 等)

于 2012-11-20T05:53:08.213 回答
4

getElementById不是 HTML 元素的方法。它是文档节点的一种方法。因此你不能这样做:

div.getElementById('foo'); // invalid code

您可以实现自己的函数来通过递归遍历 DOM 来搜索children. 在较新的浏览器上,您甚至可以使用该querySelector方法。对于最小的开发,您可以使用 jQuery 或 sizzle.js(jQuery 背后的查询引擎)之类的库。

于 2012-11-20T06:21:05.350 回答
-1

无需将响应存储在元素中,也无需使用 DOMParser()

只需将 responseType 设置为'document',响应将被自动解析并存储在 responseXML

例子:

var ajax = new XMLHttpRequest();
ajax.open('get','http://www.taringa.net');
ajax.responseType = 'document';
ajax.onload = function(){
    console.log(ajax.responseXML); //And this is a document which may execute getElementById
};
ajax.send();
于 2014-03-08T06:21:13.770 回答