调用DOM时Javascript对象/函数不工作
我是个初学者,所以如果有什么不合理的地方,我很抱歉:) 我正在尝试按类名搜索XMLDOM,使用一个自定义函数,它似乎只有在搜索脚本所在的文档时才起作用 这就是功能:调用DOM时Javascript对象/函数不工作,javascript,xmlhttprequest,getelementsbyclassname,Javascript,Xmlhttprequest,Getelementsbyclassname,我是个初学者,所以如果有什么不合理的地方,我很抱歉:) 我正在尝试按类名搜索XMLDOM,使用一个自定义函数,它似乎只有在搜索脚本所在的文档时才起作用 这就是功能: Object.prototype.getElementsByClassName = function(getElementsByClass) { function getElementsByClass(searchClass,node,tag) { var classElements = new Array();
Object.prototype.getElementsByClassName = function(getElementsByClass) {
function getElementsByClass(searchClass,node,tag) {
var classElements = new Array();
if ( node == null )
node = document;
if ( tag == null )
tag = '*';
var els = node.getElementsByTagName(tag);
var elsLen = els.length;
var pattern = new RegExp('(^|\\\\s)'+searchClass+'(\\\\s|$)');
for (i = 0, j = 0; i < elsLen; i++) {
if ( pattern.test(els[i].className) ) {
classElements[j] = els[i];
j++;
}
}
return classElements;
}
xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","somexml.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
var foo = xmlDoc.getElementsByClassName("gridCellAlt");
Object.prototype.getElementsByClassName=函数(getElementsByClass){
函数getElementsByClass(搜索类、节点、标记){
var classElements=新数组();
if(node==null)
节点=文档;
if(标记==null)
标记='*';
var els=node.getElementsByTagName(标记);
var elsLen=els.长度;
var pattern=newregexp(“(^\\\\\s)”+searchClass+”(\\\\s\\\$);
对于(i=0,j=0;i
(随后我将foo输出到下面的某个位置-输出效果良好。)
现在,如果我使用xmlDoc.getElementsByTagName
并使用标记名,那么一切都可以正常工作-但是,我将要访问的页面使用类名,因此我想使用xmlDoc.getElementsByClassName
。如果我使用var foo=document.getElementsByClassName(“gridCellAlt”),上述脚本完全可以正常工作;
并在运行脚本的页面中包含我正在访问的信息,但当我尝试在xmlDoc DOM上使用它时,它不起作用。总之,脚本唯一不起作用的时候是在我使用xmlDoc(而不是文档)时,和getElementsbyClassName
结合使用。如果我使用document和getElementsbyClassName,它就可以了。如果我使用xmlDoc和getelementsByTagName,它就可以了
我认为getElementsByClassName
没有在DOM节点内正确搜索,但是即使我将class=“gridcelllalt”
放在测试DOM的根节点的某个地方,它仍然找不到它。我尝试在foo=xmlDoc.getElementsByClassName(“gridcelllalt”,信息在这里))
但这似乎也不能解决问题。这是一个问题。因为XMLHTTPRequest是异步执行的,所以您需要检查它何时成功返回(readyState 4),然后对XML进行操作(因为届时它将拥有它)。否则,您可能会尝试对尚未初始化的内容进行操作。我认为这不是问题所在,就像我使用xmlDoc.getElementsbyTagName(“sometaghere”)一样;我得到了结果。只有在使用自定义xmlDoc.GetElementsByCassName时,它才找不到任何东西。虽然这可能是一个问题,并且可能适合包含在脚本中,但我不认为这是导致我的问题的原因-而且,在测试中添加它并没有解决问题。
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState == 4){
xmlDoc=xmlhttp.responseXML;
var foo = xmlDoc.getElementsByClassName("gridCellAlt");
}
}