我认为,如果.getElementById
在所有节点上都可用,将有两个主要优点:
可以选择不属于文档的节点。
例如,我想做类似的事情
function foo(html){ var el = document.createElement('div'); el.innerHTML = html; var target = el.getElementById('target'); /* Do something with `target` */ }
但我不能,因为我得到了
TypeError: el.getElementById is not a function
。然后,我不想使用类而不是 id,我必须这样做
function foo(html){ var el = document.createElement('div'); el.innerHTML = html; document.body.appendChild(el); var target = document.getElementById('target'); document.body.removeChild(el); /* Do something with `target` */ }
但是文档可能已经有一个带有
id="target"
. 那么,我应该做function foo(html){ var iframe = document.createElement('iframe'); iframe.onload = function(){ var doc = iframe.contentDocument || iframe.contentWindow.document, el = document.createElement('div'); el.innerHTML = html; doc.body.appendChild(el); var target = doc.getElementById('target'); document.body.removeChild(iframe); /* Do something with `target` */ }; iframe.src = 'about:blank'; document.body.appendChild(iframe); }
foo
但是如果我想返回与 相关的内容,上面的代码不起作用html
,因为主代码在onload
事件之后运行。如果文档有很多元素并且您知道要搜索的元素是变量中已有元素的后代,则它可以提高性能
例如,如果我有一个具有以下结构的文档:
<body> <div id="div-1"> <div id="div-1-1"> <div id="div-1-1-1"> ... </div> <div id="div-1-1-2"> ... </div> ... </div> <div id="div-1-2"> <div id="div-1-2-1"> ... </div> <div id="div-1-2-2"> ... </div> ... </div> ... </div> <div id="div-2"> <div id="div-2-1"> <div id="div-2-1-1"> ... </div> <div id="div-2-1-2"> ... </div> ... </div> <div id="div-2-2"> <div id="div-2-2-1"> ... </div> <div id="div-2-2-2"> ... </div> ... </div> ... </div> ... </body>
而我...
var el1 = document.getElementById('div-9999999'), el2 = document.getElementById('div-9999999-1-2'), el3 = document.getElementById('div-9999999-1-2-999999'), el4 = document.getElementById('div-9999999-1-2-999999-1-2-3-4-5');
...它可能比
var el1 = document.getElementById('div-9999999'), el2 = el1.getElementById('div-9999999-1-2'), el3 = el2.getElementById('div-9999999-1-2-999999'), el4 = el3.getElementById('div-9999999-1-2-999999-1-2-3-4-5');
(当然,这个例子是一个简化,在这种情况下使用
.childNodes[]
or.children[]
会好很多);
那么,为什么不能.getElementById
在节点上工作?我没有看到任何缺点,只有优点