javascript - jQuery 以正确的顺序插入元素 vs detach().sort()?

标签 javascript jquery backbone.js underscore.js

假设我有以下 html 结构:

<ul>
  <li>1</li>
  <li>2</li>
  <li>4</li>
</ul>

是否可以(以及如何)插入一个新元素 <li>3</li>以正确的顺序分离元素并求助?原因是,我相信如果你 .detach() 和 .append() 元素,你将导致页面重排(我想如果元素四处移动,无论如何都会发生)。但出于某种原因,将它插入正确的位置似乎比附加/分离/排序/附加更干净。

我在 jQuery 中看到了第 nth-child 选择器,我也在使用 underscore.js 框架(它提供了 _.sortedIndex 告诉我元素的正确位置),但我似乎无法想出把它放在那里的正确方法。

一些背景: 我正在使用 backbone.js 并且我有一个项目集合。然后我假设我需要一个 Collection View (或集合中的每个项目的 View ?)。当我将一个元素添加到集合中时,我设置了比较器,因此集合已正确排序,但页面上的 View 未排序。

对于那些通过谷歌到达这里的人,这是我最终在 backbone.js 中想到的:

Item = Backbone.Model.extend({});

ItemList = Backbone.Collection.extend({
    model: Item,

    comparator: function(item) {
        return item.get('id');
    }
});

ItemView = Backbone.View.extend({
    tagName: 'li',
    className: 'item',

    initialize: function() {
        _.bindAll(this, 'render');
        this.model.bind('change', this.render);
        this.model.view = this;
    },

    render: function() {
        $(this.el).text(this.model.get('name'));
        return this;
    }
});

App = Backbone.View.extend({
    el: $('#mylist'),

    initialize: function() {
        _.bindAll(this, 'add_one', 'add_all', 'render');

        this.items = new ItemList();
        this.items.bind('add', this.add_one);
        this.items.bind('refresh', this.add_all);
        this.items.bind('all', this.render);

        this.items.add(new Item({id: 2, name: 'two'}));
        this.items.add(new Item({id: 5, name: 'five'}));
        this.items.add(new Item({id: 1, name: 'one'}));
        this.items.add(new Item({id: 4, name: 'four'}));
        this.items.add(new Item({id: 3, name: 'three'}));        
        this.items.add(new Item({id: 6, name: 'six'}));
        this.items.add(new Item({id: 5.5, name: 'five.five'}));
    },

    add_one: function(item) {
        var view = new ItemView({model: item});
        var visible = this.$(view.tagName+'.'+view.className);
        var newel = view.render().el;
        var idx = this.items.indexOf(item);
        if (visible.length == idx) {
            $(this.el).append(newel);
        }
        else {
            visible.eq(idx).before(newel);
        }
    },

    add_all: function() {
        this.items.each(this.add_one);
    }
});

app = new App();

在这里运行:http://jsfiddle.net/dlamotte/L4j3b/

最佳答案

你可以使用 jQuery

$('li').eq(1).after('<li>3</li>');

fiddle 页:http://jsfiddle.net/Hrjks/

更好的是:

var myindex = 3;
var insertPoint = myindex -2;
$('li').eq(insertPoint).after('<li>' + myindex +'</li>');

fiddle :http://jsfiddle.net/Hrjks/1/

关于javascript - jQuery 以正确的顺序插入元素 vs detach().sort()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5394075/

相关文章:

javascript - 从ajax中提取数据以更改覆盖层上的div

javascript - 使用切换使图像显示在另一个 div onclick 上

javascript - 如何在asp按钮点击中禁用div标签

javascript - Backbone 事件哈希与 jquery 事件声明

javascript - Javascript 的 MVC 模式的最佳示例?

javascript - 如何使用 jquery .css 应用 "-webkit"css 规则

javascript - reverse() 不是一个函数

jquery - 读取每个div内元素的值

javascript - 如何将文本区域的内容复制到剪贴板?

rest - 在 Backbone 中使用超媒体 (REST) API