查询、排序和替换 DOM 元素

用户6776038

我正在尝试对我查询的 nodeList 的顺序进行排序并将它们替换到 DOM 上,但是使用下面的解决方案我在 HTML 中变得未定义。有人知道这是怎么回事吗?

const container = elem[0].childNodes[1];
let graphs = container.querySelectorAll('visualization-container[data-graph]');

const sorted = [].slice.call(graphs).sort((a, b) => {
    const first = a.getAttribute('data-graph');
    const second = b.getAttribute('data-graph');

    return scope.visualizationsOrder[first] > scope.visualizationsOrder[second] ? 1 : -1;
});

console.log(sorted); // Sorted is correct
container.replaceWith(sorted); // error here

这是一个说明问题的 jsfiddle https://jsfiddle.net/ejdq1xyz/

安德烈亚斯

这里的“问题”是,这sorted是一个Nodes数组

我不太确定为什么要用其排序的子项替换容器...
如果不应移除容器,则必须使用.appendChild(),.append().insertAdjacentElement()代替.replaceWith().

并且因为sorted是一个数组,您必须使用for循环.forEach()以下方式一个一个地添加节点

sorted.forEach(n => container.appendChild(n));
sorted.forEach(n => container.append(n));
sorted.forEach(n => container.insertAdjacentElement("beforeEnd", n));

如果.append()您还可以使用.apply()(ES5 版本)或 ES6扩展运算符/语法,...因为它也将接受一组Nodes / DOMStrings

container.append.apply(container, sorted);
container.append(...sorted);

const order = {
  identifierOne: 4,
  identifierTwo: 3,
  identifierThree: 1,
  identifierFour: 2
};

const container = document.querySelector('.container');
const graphs = container.querySelectorAll('.graph[data-graph]');

const sorted = [].slice.call(graphs).sort((a, b) => {
    const first = a.getAttribute('data-graph');
    const second = b.getAttribute('data-graph');

    return order[first] > order[second] ? 1 : -1;
});

sorted.forEach(n => container.appendChild(n));
<div class='container'>
<div class='graph' data-graph='identifierOne'>4</div>
<div class='graph' data-graph='identifierTwo'>3</div>
<div class='graph' data-graph='identifierThree'>1</div>
<div class='graph' data-graph='identifierFour'>2</div>
</div>

如果容器应该被替换而不是你可以使用.replaceWith().apply()或者扩展运算符/语法...

container.replaceWith.apply(container, sorted);
container.replaceWith(...sorted);

const order = {
  identifierOne: 4,
  identifierTwo: 3,
  identifierThree: 1,
  identifierFour: 2
};

const container = document.querySelector('.container');
const graphs = container.querySelectorAll('.graph[data-graph]');

const sorted = [].slice.call(graphs).sort((a, b) => {
    const first = a.getAttribute('data-graph');
    const second = b.getAttribute('data-graph');

    return order[first] > order[second] ? 1 : -1;
});

container.replaceWith.apply(container, sorted);
//container.replaceWith(...sorted);
<div class='container'>
<div class='graph' data-graph='identifierOne'>4</div>
<div class='graph' data-graph='identifierTwo'>3</div>
<div class='graph' data-graph='identifierThree'>1</div>
<div class='graph' data-graph='identifierFour'>2</div>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

排序大量DOM元素

来自分类Dev

禁用对嵌套DOM元素的排序

来自分类Dev

DOM元素对象和样式

来自分类Dev

在视觉上和DOM中对元素进行重新排序

来自分类Dev

用DOM元素替换字符串

来自分类Dev

拆分后在Vue中替换DOM元素

来自分类Dev

替换dom元素中的占位符

来自分类Dev

jQuery-在加载时替换Dom元素

来自分类Dev

dom4j:替换元素

来自分类Dev

用jQuery替换DOM中的元素

来自分类Dev

替换不在 DOM 元素内的文本

来自分类Dev

查询 dom 元素的属性 Angular 4

来自分类Dev

使用CsQuery将DOM元素替换为其他元素

来自分类Dev

如何使用Polymer查询元素DOM的Selector元素

来自分类Dev

Velocity JS和动态添加的DOM元素

来自分类Dev

AngularJS和DOM:在视图内获取元素

来自分类Dev

PHP解析HTML dom和目标元素

来自分类Dev

动画移除和附加 DOM 元素

来自分类Dev

Javascript:向dom添加和删除元素

来自分类Dev

隐藏和显示 DOM 中的嵌套元素

来自分类Dev

JavaScript:检测DOM元素是否与DOM元素重叠,内部重叠或被替换?

来自分类Dev

如何使用JavaScript查找和替换HTML DOM元素中的字符串

来自分类Dev

用新构建的DOM结构替换小部件元素

来自分类Dev

可以在javascript中替换DOM中的根元素HTML

来自分类Dev

DOM替换元素上的整个样式属性(CSSStyleDeclaration)

来自分类Dev

如何替换jQuery DOM元素中的字符串

来自分类Dev

使用Java DOM替换/更改XSD文件中的元素类型

来自分类Dev

将字符串替换为DOM元素

来自分类Dev

如何替换jQuery DOM元素中的字符串