【分享】深入挖掘document.getElementsByTagName()方法的返回值
最近天气好热,一只蚊子落到了我身上,被烫死了,悲天悯人的我太伤心了……
天气虽然炎热,但工作依然不能停歇,整日在代码堆里摸爬滚打,却不见救世主降临,来赐我一个和谐的浏览器世界。OMG,生命不止,兼容问题不歇。无论我活着,还是我死了,我都会在兼容性问题堆里,吹着嗡嗡的祖拉嗡嗡的飞来飞去。
前些日子,碰到过一个比较麻烦的问题。想从 document.getElementsByTagName()方法的返回值中取出某个特定的元素。一开始以为它的返回值是一个数组,结果,大错特错。它返回的是一个 DOM 对象,可以遍历,有 length 属性,但不是数组。
证据在这里:
<script> window.onload = function() { var divs = document.getElementsByTagName("div"); document.getElementById("info").innerHTML = !!(divs instanceof Array); }</script><div></div><div id="info"></div>
<script> window.onload = function() { var divs = document.getElementsByTagName("div"); document.getElementById("info").innerHTML = Object.prototype.toString.call(divs); }</script><div></div><div id="info"></div>
interface Element : Node { ... NodeList getElementsByTagName(in DOMString name); ...}
<script type="text/javascript"> window.onload = function() { var spans = document.getElementsByTagName("span"); var span2 = spans[1]; var span3 = spans["span3"]; document.getElementById("info").innerHTML = "<br/>NodeList[index].id : " + span2.id + "<br/>NodeList[id].id : " + span3.id; }</script><span id="span1"></span><span id="span2"></span><span id="span3"></span><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var inputs = document.getElementsByTagName("input"); var input_1 = inputs["input1"]; document.getElementById("info").innerHTML += "<br/>NodeList[name].id : " + input_1.id; }</script><input id="ipt1" name="input1"><input id="ipt2" name="input2"><input id="ipt3" name="input3"><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var inputs = document.getElementsByTagName("input"); var input_1 = inputs["input1"]; document.getElementById("info").innerHTML += "NodeList[name].id : " + input_1.id+ "<br/>NodeList[name].length : " + input_1.length; }</script><input id="ipt1" name="input1"><input id="ipt2" name="input1"><input id="ipt3" name="input3"><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var spans = document.getElementsByTagName("span"); try { var span2 = spans(1); document.getElementById("info").innerHTML = "NodeList(index).id: " + span2.id; } catch(err) { document.getElementById("info").innerHTML = "NodeList(index) : " + err; } }</script><span id="span1"></span><span id="span2"></span><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var spans = document.getElementsByTagName("span"); try { var span2 = spans("span2"); document.getElementById("info").innerHTML = "NodeList(id).id: " + span2.id; } catch(err) { document.getElementById("info").innerHTML = "NodeList(id) : " + err; } }</script><span id="span1"></span><span id="span2"></span><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var inputs = document.getElementsByTagName("input"); var input_1 = inputs("input1"); document.getElementById("info").innerHTML += "NodeList(name).id : " + input_1.id+ "<br/>NodeList(name).length : " + input_1.length; }</script><input id="ipt1" name="input1"><input id="ipt2" name="input1"><input id="ipt3" name="input3"><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var spans = document.getElementsByTagName("span"); try { var span2 = spans.item(1); document.getElementById("info").innerHTML = "NodeList.item(idx).id: " + span2.id; } catch(err) { document.getElementById("info").innerHTML = "NodeList.item(idx) : " + err; } }</script><span id="span1"></span><span id="span2"></span><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var spans = document.getElementsByTagName("span"); try { var span2 = spans.namedItem("span2"); document.getElementById("info").innerHTML = "NodeList.namedItem(name).id: " + span2.id; } catch(err) { document.getElementById("info").innerHTML = "NodeList.namedItem(name) : " + err; } }</script><span id="span1"></span><span id="span2"></span><div id="info"></div>
<script type="text/javascript"> window.onload = function() { var inputs = document.getElementsByTagName("input"); var input_1 = inputs.namedItem("input1"); document.getElementById("info").innerHTML += "inputs.namedItem(name).id : " + input_1.id+ "<br/>inputs.namedItem(name).length : " + input_1.length; }</script><input id="ipt1" name="input1"><input id="ipt2" name="input1"><input id="ipt3" name="input3"><div id="info"></div>