javascript - 按左侧值和顶部值对包含 DOM 标签和属性的数组进行排序

标签 javascript

我有一个带有 DOM 标签的数组(div -> children img -> div closed)。这些标签具有属性(左值和上值)。我将 em 添加为 nodeList,这样我就可以访问元素 offsetLeft 和 offsetTop 来确定这些值,但我无法弄清楚如何按左值或上值升序重新排列数组中的这些标签。

HTML

<body>
    <div style="left:40px;top:10px;position:absolute">
        <img src="assets/images/text1.png" />
    </div>
    <div style="left:200px;top:88px;position:absolute">
        <img src="assets/images/text2.png" />
    </div>
    <div style="left:85px;top:166px;position:absolute">
        <img src="assets/images/text3.png" />
    </div>
</body>

JavaScript

var unsortedElements = [];
        var sortedElements = [];

        var elements = document.querySelectorAll("body > div");
        for (var i = 0; i < elements.length; i++) {
            var element = elements[i];
            if (element != null) {
                unsortedElements.push(element);

                var x = element.offsetLeft;
                var y = element.offsetTop;
                customSort(unsortedElements[i]);
            }
        }

function customSort(element){
var left = element.offsetLeft;

sortedElements.push(left);
console.log(sortedElements); -> will return the left values (40,85,200) BUT i need this array sorted with div tags (like [<div style="left: 40px;">img child</div>, <div style="left: 85px;">img child</div>, <div style="left: 200px;">img child</div>])

}

注意

请使用纯 Javascript!

谢谢你:)

最佳答案

使用 ES6,您可以获得一组新函数,可以更优雅地完成工作。 出于该更新的目的,我将对左侧属性进行排序。 我想从现在开始替换比较器函数很简单。

HTML

<caption>Sorting by left offset</caption>
<div id="container" style="position:relative">
    <div class="candidate" style="left:200px;top:88px;position:absolute">
        <span>3 was 1 before sorting</span>
    </div>
    <div class="candidate" style="left:40px;top:10px;position:absolute">
        <span>1 was 2 before sorting</span>
    </div>    
    <div class="candidate" style="left:85px;top:166px;position:absolute">
        <span>2 was 3 before sorting</span>
    </div>
</div>

纯 JavaScript/EcmaScript 2015

Array.from(document.querySelectorAll("div.candidate")).sort(function(a, b){
    let aLeft = a.style.left.replace("px","");
    let bLeft = b.style.left.replace("px","");
    return aLeft-bLeft;
}).forEach(function(el){
    document.querySelectorAll("#container")[0].appendChild(el);
});

JSFiddle http://jsfiddle.net/a4e41pmr/

我使用 appendChild 作为一个技巧,在排序后移动节点。

关于javascript - 按左侧值和顶部值对包含 DOM 标签和属性的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256644/

相关文章:

javascript - 谷歌地图 - 缩放时保持居中

JavaScript : Split string using function and returning it

javascript - 如何从 HTML 标签获取属性值

javascript - Node.js 文件系统保存文件错误 56 EROFS,同时每 2 秒保存一次

javascript - 在 Canvas 中随机生成对象,没有重复或重叠

javascript - 是否可以改编以下 jQuery?

javascript - 使用 Axios 克服 Pending Promise 并在 Node.js 中完成 JSON 构建

javascript - Bootstrap slider 更改最大值

javascript - 如何从表体点击事件中捕获行ID

javascript - JQuery Mobile 创建了错误的 HTML 代码