1

我跑GM_xmlhttpRequest(在Greasemonkey的腳本)和存儲responseText到一個新創建的HTML元素:「getElementById不是函數」當試圖解析AJAX響應?

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


然後我試圖在responseHTML找到一個元素:

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


第一個很好,但不是第二個。有任何想法嗎?

回答

2

getElementById不是HTML元素的方法。它是文檔節點的一種方法。因此你不能做:

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

您可以實現自己的功能,通過children遞歸去搜索DOM。在較新的瀏覽器上,您甚至可以使用querySelector方法。對於最小的開發,你可以使用像jQuery或sizzle.js(jQuery後面的查詢引擎)這樣的庫。

4

使用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。 (使用螢火蟲,Wireshark的等)

+0

他的代碼工作和你的一樣:這意味着你的代碼不出於同樣的原因工作 - 的getElementById不是HTML元素的方法,它的文檔的方法。 – slebetman

+0

@slebetman:不,我的代碼確實有效,responseDoc **是**文檔。 ...你可以看到它在http://fiddle.jshell.net/UEuKZ/show/上工作。 (代碼是** Firefox only,這是可以的,因爲這是一個Greasemonkey問題)。 –

+0

啊,錯過了greasemonkey標籤。抱歉。 – slebetman

-1

沒有必要的響應存儲在一個元件既不使用的DOMParser()

只需設置的responseType到「文檔」和響應將被自動解析和存儲在所述的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();