将内容包装在 div 中的纯 javascript 方法

IT技术 javascript html word-wrap
2021-01-31 08:18:29

我想#slidesContainer用 JavaScript包装div 中的所有节点我知道这在 jQuery 中很容易完成,但我有兴趣知道如何使用纯 JS 来完成。

这是代码:

<div id="slidesContainer">
    <div class="slide">slide 1</div>
    <div class="slide">slide 2</div>
    <div class="slide">slide 3</div>
    <div class="slide">slide 4</div>
</div>

我想用id="slideInner".

6个回答

如果您的“幻灯片”始终在 slidesContainer 中,您可以这样做

org_html = document.getElementById("slidesContainer").innerHTML;
new_html = "<div id='slidesInner'>" + org_html + "</div>";
document.getElementById("slidesContainer").innerHTML = new_html;
@Squadrons:你也在使用 jQuery 吗?如果是这样,你真的不应该这样做。(即使不是,您也在不必要地破坏和重新创建 DOM 的这一部分。)
2021-03-21 08:18:29
我的回答比在节点级别上操作要慢一些,但是除非您有很多节点(幻灯片),否则差异应该是察觉不到的。如果您正在使用 jquery/或将任何事件连接到幻灯片,您将需要重新扫描 dom。然而,此方法将在大多数浏览器中工作,而无需处理 getElementsByClass 名称不兼容问题。因此,对于简单的功能(而不是太复杂的 DOM),这可能更好....重要的是,如果您动态生成幻灯片,则使用 innerHtml 而不是逐节点构建 DOM 树节点会更快。
2021-03-26 08:18:29
这将取消任何事件处理程序或元素上的内容,并且速度相当慢。我更喜欢@user113716 的回答
2021-04-07 08:18:29
请注意,替换 innerHTML 将从所有包含的节点中删除事件。
2021-04-09 08:18:29
我没有使用 jquery。在我转向框架之前,我试图对 JS 感到有些熟悉。但是,我正在尝试此线程中的所有答案。你推荐罗斯的答案吗?如果是这样,为什么要超过这个?
2021-04-11 08:18:29

和 BosWorth99 一样,我也喜欢直接操作 dom 元素,这有助于维护节点的所有属性。但是,我想保持元素在 dom 中的位置,而不仅仅是在有兄弟姐妹的情况下追加结尾。这是我所做的。

var wrap = function (toWrap, wrapper) {
    wrapper = wrapper || document.createElement('div');
    toWrap.parentNode.appendChild(wrapper);
    return wrapper.appendChild(toWrap);
};
我通常使用函数表达式而不是声明来保持一致的编码风格并简化提升行为。javascriptweblog.wordpress.com/2010/07/06/...
2021-03-28 08:18:29
如果toWrap不是最后一个孩子,则wrapper最终成为错误的孩子(它最终成为最后一个孩子)。更好地使用insertBefore()例如替换toWrap.parentNode.appendChild(wrapper);toWrap.parentNode.insertBefore(wrapper, toWrap);
2021-03-30 08:18:29
这并没有回答这个问题。OP 想要包装所有子元素而不是单个元素。
2021-04-04 08:18:29
我确定这是一个糟糕的问题,我不像 CSS 那样熟悉 javascript/query,但是为什么要将其设置为变量而不是将其分配为函数?例如function wrap(toWrap, wrapper) {
2021-04-09 08:18:29

如果您为 IE 修补 document.getElementsByClassName,您可以执行以下操作:

var addedToDocument = false;
var wrapper = document.createElement("div");
wrapper.id = "slideInner";
var nodesToWrap = document.getElementsByClassName("slide");
for (var index = 0; index < nodesToWrap.length; index++) {
    var node = nodesToWrap[index];
    if (! addedToDocument) {
        node.parentNode.insertBefore(wrapper, node);
        addedToDocument = true;
    }
    node.parentNode.removeChild(node);
    wrapper.appendChild(node);
}

示例:http : //jsfiddle.net/GkEVm/2/

@patrick - 更简洁,但如果没有元素与`getElementsByclassName 匹配,修改后的版本不会出错?
2021-03-17 08:18:29
@patrick - 是的,操作顺序似乎就是一切。现在应该修好了。
2021-03-25 08:18:29
您可能想要测试您的答案。有一些错误。
2021-04-03 08:18:29
@aroth:是的,现在可以使用了。如果您只是管理在循环外添加包装器,则可以简化一些。另外,记住一个 DOM 节点一次只能在一个地方,所以你真的不需要执行removeChildthen an appendChild只需执行appendChild,它就会将其从当前位置移除。jsfiddle.net/GkEVm/3 ;o)
2021-04-03 08:18:29
@Squadrons - 该addedToDocument变量只是一个标志,表明包装器元素是否已添加到 DOM。原因是1)包装器div的插入位置取决于匹配的节点,2)可能没有匹配的节点,在这种情况下根本不应该将包装器添加到DOM中,并且3)当有多个节点匹配包装器应该只添加到 DOM 一次,在第一个匹配之前。该标志只是确保满足这些条件。
2021-04-08 08:18:29

我认为这是非常好的代码示例 - 该解决方案保留了绑定事件

// element that will be wrapped
var el = document.querySelector('div.wrap_me');
// create wrapper container
var wrapper = document.createElement('div');
// insert wrapper before el in the DOM tree
el.parentNode.insertBefore(wrapper, el);
// move el into wrapper
wrapper.appendChild(el);

或者

function wrap(el, wrapper) {
    el.parentNode.insertBefore(wrapper, el);
    wrapper.appendChild(el);
}
// example: wrapping an anchor with class "wrap_me" into a new div element
wrap(document.querySelector('div.wrap_me'), document.createElement('div'));

参考

https://plainjs.com/javascript/manipulation/wrap-an-html-structure-around-an-element-28/

@redfox05 肯定是因为这是常见的模式 - 请参阅参考链接
2021-03-14 08:18:29
这与 2013 年 user1767210 的答案基本相同:stackoverflow.com/a/18453767/339803,但可能更清楚一些。
2021-04-09 08:18:29

我喜欢直接操作 dom 元素 - createElement、appendChild、removeChild 等,而不是像element.innerHTML. 该策略确实有效,但我认为本机浏览器方法更直接。此外,它们返回一个新节点的值,使您免于另一个不必要的getElementById调用。

这真的很简单,需要附加到某种类型的事件才能使用。

wrap();
function wrap() {
    var newDiv = document.createElement('div');
    newDiv.setAttribute("id", "slideInner");
    document.getElementById('wrapper').appendChild(newDiv);
    newDiv.appendChild(document.getElementById('slides'));
}

js小提琴

也许这有助于您理解 vanilla js 的这个问题。

附加 - 只是为了让您可以控制它,就像您调用的 onLoad 事件一样。我的意思是 - 您也可以调用它,我只是假设存在幻灯片未包装的状态,并且您需要在运行时更改元素列表。只需在任何函数上运行,只要您的元素 ID 名称对齐,它就应该可以工作...
2021-04-06 08:18:29
为什么需要附上这个?我尝试通过附加到名为 prepareSlideshow() 的函数来运行它,并在加载时运行它,但似乎无法更改 DOM 以使其显示所需的节点
2021-04-12 08:18:29