问题
Am I missing something with getElementsByClassName() and querySelectorAll()?
In Firefox 9 and Chrome 17 and probably all browsers, it seems that both of these functions return an empty array when executed on an AJAX response. See the following link for an example.
http://jsfiddle.net/r8ryr/5/
I can call document.getElementsByClassName('findme') or anyElement.getElementsByClassName('findme') for any element within the DOM of the current page, but for some reason it doesn't seem to work on the XML Document returned for an AJAX request. Note that getElementsByTagName works for AJAX and in Firebug you can see that the elements have the "findme" class.
var inMem = document.createElement('div');
var findme1 = document.createElement('div');
var findme2 = document.createElement('div');
findme1.className = 'findme';
findme2.className = 'findme';
inMem.appendChild( findme1 );
inMem.appendChild( findme2 );
$('#inMem').html( 'found ' + inMem.getElementsByTagName('div').length +
' divs in the detached div<br/>' +
'found ' + inMem.getElementsByClassName('findme').length +
' findme elements by ClassName<br/>' +
'found ' + inMem.querySelectorAll('.findme').length +
' findme elements using querySelectorAll()');
var inDoc = document.getElementById('inDoc');
inDoc.innerHTML = 'found ' + inDoc.getElementsByTagName('div').length +
' divs in the doc<br/>' +
'found ' + inDoc.getElementsByClassName('findme').length +
' findme elements by ClassName<br/>' +
'found ' + inDoc.querySelectorAll('.findme').length +
' findme elements using querySelectorAll()';
$.post( '/echo/xml/',
{xml:'<div id="wrapper"><div class="findme" id="findme1">findme 1</div><div class="findme">findme 2</div></div>'},
function(data, textStatus, jqXHR) {
data = jqXHR.responseXML.documentElement;
var msg = 'found ' + data.getElementsByTagName('div').length +
' divs in the AJAX response, <br/>' +
'found ' + data.getElementsByClassName('findme').length +
' findme elements by ClassName<br/>' +
'found ' + data.querySelectorAll('.findme').length +
' findme elements using querySelectorAll()<br/>' +
'The class name of the first div: ' + data.firstElementChild.className +
' (className) or ' + data.firstElementChild.attributes['class'].value + ' (attributes["class"].value)';
$('#ajax').html(msg);
}
);
<h2>In-Memory</h2>
<div id="inMem"></div>
<h2>In HTML Document</h2>
<div id="inDoc">
<div class="findme"></div>
<div class="findme"></div>
</div>
<h2>AJAX XML Response</h2>
<div id="ajax">wait...</div>
回答1:
Since you're working with an xml document, the standard DOM methods dealing with attributes don't apply. One option is to use XPath, like so:
data.evaluate("count(//div[@class='findme'])", data.documentElement, null, XPathResult.NUMBER_TYPE, null).numberValue
In your code:
$.post( '/echo/xml/',
{xml:'<div id="wrapper"><div class="findme" id="findme1">findme 1</div><div class="findme">findme 2</div></div>'},
function(data, textStatus, jqXHR) {
data = jqXHR.responseXML;
var msg = 'found ' + data.getElementsByTagName('div').length + ' divs in the AJAX response, <br/>' +
'found ' + data.evaluate("count(//div[@class='findme'])", data.documentElement, null, XPathResult.NUMBER_TYPE, null).numberValue + ' findme elements by ClassName<br/>'
$('#ajax').html(msg);
}
);
But it may just be easier to convert from XML or use Sizzle. Since you're using jQuery elsewhere, you could just do $(jqXHR.responseXML.documentElement).find('.findme').length
.
来源:https://stackoverflow.com/questions/9396354/getelementsbyclassname-and-ajax