getElementsByClassName() 및 querySelectorAll()에 뭔가가 누락 되었습니까?getElementsByClassName 및 AJAX
파이어 폭스 9와 크롬 17 그리고 아마 모든 브라우저에서, AJAX 응답으로 실행될 때이 두 함수가 빈 배열을 반환하는 것으로 보입니다. 예를 보려면 다음 링크를 참조하십시오.
나는 현재 페이지의 DOM 내의 요소에 대한 document.getElementsByClassName ('findme') 또는 anyElement.getElementsByClassName ('findme')를 호출 할 수 있지만, 어떤 이유로 그것을하지 않는 것 AJAX 요청에 대해 반환 된 XML 문서 작업. getElementsByTagName은 AJAX에서 작동하며 Firebug에서는 요소에 "findme"클래스가 있음을 알 수 있습니다.
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>
감사합니다. [this] (http://stackoverflow.com/questions/7615162/getelementsbyclassname-returns-instead-of-asynchronous-appended-node) 질문에 대한 답변으로 추가 정보를 찾았습니다. –
... 저는 실제로 Closure를 사용하고 있으며, HTML을 XML에 삽입하는 것이 효과가 없을 것이라고 생각합니다. Closure Templates에 대한 좋은 후보라고 생각합니다. –