如何顺序 .append() 创建的元素到先前添加的元素

How to sequentially .append() created elements to the previously added element

代码

JavaScript:

var recurringF = (function(){
   this.$el = $("#target");
   this.arg = arguments[0];
   this.spl = (!_.isEmpty(this.arg)) ? this.arg.split(" ") : false;
   if(this.spl){
       for(var i=0;i<this.spl.length;i++){
          if(i===0){
              this.$el.append(document.createElement(this.spl[i]));
          }else{
              this.$el.children().last().append(document.createElement(this.spl[i]));
          }
       }
   }
   return {
       "$":this.$el
   }
});

var t = new recurringF("div h1 span");

HTML-正文:

<body>
    <div id="target"></div>
</body>

目标

我想将元素按顺序追加到父元素 $("#target") 以便 HTML 中的最终结果如下:

<body>
    <div id="target">
        <div>
            <h1>
                <span></span>
            </h1>
        </div>
    </div>
</body>

循环不会将创建的元素追加到最后一个追加的元素,而是追加到in循环循环1创建的元素'div',如下所示:

    <div id="target">
        <div>
            <h1></h1>
            <span></span>
        </div>
    </div>

我错过了什么?

您可以尝试使用常规 javascript 功能,因为它内置了子附加功能:

const recurseElement = (elementString, target) => {
    const elements = elementString.split(' ');
    elements.forEach(function(ele) {
        const domElement = document.createElement(ele); // create the element
        target.appendChild(domElement); // append to the target
        target = domElement; // this element is the new target
    });
}

所以现在你可以像这样使用它了:

recurseElement('div h1 span', document.getElementById('target'));

const recurseElement = (elementString, target) => {
  const elements = elementString.split(' ');
  elements.forEach(function(ele) {
    const domElement = document.createElement(ele); // create the element
    target.appendChild(domElement); // append to the target
    target = domElement; // this element is the new target
  });
};

recurseElement('div h1 span', document.getElementById('target'));
#target div {
  background: green;
  height: 16px; width: 128px; padding: 10px;
}

#target div h1 {
  background: red;
  height: 16px; width: 64px; padding: 10px;
}

#target div h1 span {
  background: purple; display: block;
  height: 16px; width: 32px; padding: 10px;
}
<div id="target"></div>

需要注意的是,Chrome45+、Firefox 22.0+、Edge 和 Opera 都可以使用箭头功能。它们在 IE 或 Safari 中不起作用。或者如果你有一个转译器(比如 babel),它们就会工作

通过使用 .children(),您只会在第一次迭代后的每次迭代中立即获得 div,从而导致

<div id="target">
  <div>
    <h1></h1>
    <span></span>
    <alltherest></alltherest>
  </div>
</div>

因为.children只看children,不看所有后代。你想要的是 .find(*) 这样它将在每次迭代中获得最深的嵌套后代。

this.$el.find('*').last().append(document.createElement(this.spl[i]));

https://jsfiddle.net/f3fb997h/

也就是说,如果您只存储对最后创建的元素的引用并附加到它,而不是每次迭代都必须重新选择它会更好。

var $tempEl = this.$el, newEl;
if(this.spl){
    for(var i=0;i<this.spl.length;i++){
        newEl = document.createElement(this.spl[i]);
        $tempEl.append(newEl);
        $tempEl = $(newEl);  
    }
}

https://jsfiddle.net/f3fb997h/1/

请注意,此时您并没有真正从 jQuery 中受益,所以稍微调整一下,您就不会依赖它了。

var recurringF = (function(){
   this.el = document.getElementById('target');
   this.arg = arguments[0];
   this.spl = (!_.isEmpty(this.arg)) ? this.arg.split(" ") : false;
   console.log(this.spl);
   var tempEl = this.el, newEl;
   if(this.spl){
       for(var i=0;i<this.spl.length;i++){
          newEl = document.createElement(this.spl[i]);
          tempEl.appendChild(newEl);
          tempEl = newEl;  
       }
   }
   return {
       "el":this.el
   }
});