有没有办法在documentFragment中找到一个元素?

pka*_*rio 18 javascript dom documentfragment

var oFra = document.createDocumentFragment();
// oFra.[add elements];
document.createElement("div").id="myId";
oFra.getElementById("myId"); //not in FF
Run Code Online (Sandbox Code Playgroud)

如何在将片段附加到文档之前获取"myId"?

Ste*_*her 26

所有这些答案都相当陈旧,从现在开始querySelectorAll并且querySelector没有广泛可用.应该注意的是,接受CSS选择器作为参数的这两个函数DocumentFragment在现代浏览器中对s有效,并且应该是处理问题中情况的首选方法.某些答案中提供的备用解决方案对于不支持querySelectorAll或不支持的旧版浏览器来说是一种很好的方法querySelector.

以下是一个示例用法:

var df = document.createDocumentFragment();
var div = document.createElement('div');
div.id = 'foo';
df.appendChild(div);
var result = df.querySelector('#foo'); // result contains the div element
Run Code Online (Sandbox Code Playgroud)

一个好的实现应首先使用对象检测来查看浏览器是否支持此功能.例如:

function getElementByIdInFragment(fragment, id) {
    if (fragment.querySelector) {
        return fragment.querySelector('#' + id);
    } else {
        // your custom implementation here
    }
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*itz 8

不,DocumentFragmentAPI至少可以说是最小的:它没有定义任何属性或方法,这意味着它只支持NodeAPI中定义的属性和方法.作为APIgetElementById中定义的方法,它们不能与a一起使用.DocumentDocumentFragment

  • @Olivvv:这是预期的:`getElementById`是`HTMLDocument`的方法http://www.w3.org/TR/REC-DOM-Level-1/level-one-html.html#ID-36113835,而`getElementsByTagName`是'Document`的方法http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#i-Document和`Element` http:/ /www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-745549614因此,当尝试在一个对象上调用它时,`getElementById`将始终抛出异常.输入`Element`是否该元素是否附加到DOM. (2认同)

bob*_*nce 7

NickFitz是对的,DocumentFragment没有你期望的API,Document或者Element在标准或浏览器中(这是一种耻辱;能够设置片段是非常方便的innerHTML.

甚至框架在这里也没有帮助,因为它们往往要求节点在文档中,或者在上下文节点上使用片段上不存在的方法.你可能要写自己的,例如:

 function Node_getElementById(node, id) {
      for (var i= 0; i<node.childNodes.length; i++) {
          var child= node.childNodes[i];
          if (child.nodeType!==1) // ELEMENT_NODE
              continue;
          if (child.id===id)
              return child;
          child= Node_getElementById(child, id);
          if (child!==null)
              return child;
      }
      return null;
 }
Run Code Online (Sandbox Code Playgroud)

随着时间的推移跟踪引用几乎肯定会更好,而不是依赖于如上所述的天真,表现不佳的功能.

var frag= document.createDocumentFragment();
var mydiv= document.createElement("div");
mydiv.id= 'myId';
frag.appendChild(mydiv);
// keep reference to mydiv
Run Code Online (Sandbox Code Playgroud)


rob*_*rtc 2

关于什么:

var oFra = document.createDocumentFragment();
var myDiv = document.createElement("div");
myDiv.id="myId";
oFra.appendChild(myDiv);
oFra.getElementById("myId"); //not in FF
Run Code Online (Sandbox Code Playgroud)

除非您已将创建的内容添加div到文档片段中,否则我不确定为什么getElementById会找到它?

- 编辑

如果您愿意推出自己的 getElementById 函数,那么您应该能够获得所需的引用,因为此代码有效:

var oFra = document.createDocumentFragment();
var myDiv = document.createElement("div");
myDiv.id = "myId";
oFra.appendChild(myDiv);
if (oFra.hasChildNodes()) {
    var i=0;
    var myEl;
    var children = oFra.childNodes;
    for (var i = 0; i < children.length; i++) {
        if (children[i].id == "myId") {
            myEl = children[i];
        }
    }
}
window.alert(myEl.id);
Run Code Online (Sandbox Code Playgroud)

  • IE 的 `createDocumentFragment` 实际上并不创建一个 `DocumentFragment`,它创建一个 `Document`:http://msdn.microsoft.com/en-us/library/ms536387(VS.85).aspx (我喜欢这种方式他们说“这是在 DOM Level 1 中定义的”,但没有解释他们实际上并没有在 HTML 中实现 DocumentFragment,因此该方法返回错误类型的对象...) (4认同)