0

我正在尝试巧妙地打包一些将编辑控件添加到表格单元格的功能。下面是我想要实现的一个例子。

我想知道的是这是否是正确的方法。当我清空单元格时,我最终不得不重新绑定事件处理程序。我认为 jquery 删除了它们,但我不确定。我希望它们会保留下来,因为我已将 dom 元素保存在 ScoreManager 对象中。

<div id="main">
 <table id="points-table">
    <thead>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Points</th>
    </thead>
    <tr>
        <td>Joe</td>
        <td>Bloggs</td>
        <td class="points">
            <span>100</span>
            <button>edit</button>
        </td>
    </tr>
    <tr>
        <td>Jiminy</td>
        <td>Cricket</td>
        <td class="points">
            <span>77</span>
            <button>edit</button>
        </td>
    </tr>
 </table>
 </div>

 <script type="text/javascript" src="js/jquery.js"></script>
 <script type="text/javascript">
window.onload = init;

var ScoreManagers = [];

function init() {
    $('#points-table .points').each(function(){
        ScoreManagers.push( new ScoreManager(this) );
    });
}

var ScoreManager = function(cell) {
    this.cell = $(cell);
    this.edit = $('button', this.cell);
    this.points = $('span', this.cell);
    this.scoreInput = $('<input>');
    this.submit = $('<button>Submit</button>');
    this.cancel = $('<button>Cancel</button>');

    this.init();
};

ScoreManager.prototype.init = function() {
    this.edit.bind('click', $.proxy(this.showEditControls, this));
};

ScoreManager.prototype.showEditControls = function(e) {
    this.cell.empty();
    this.cell.append(this.scoreInput, this.submit, this.cancel);
    this.submit.bind('click', $.proxy(this.savePoints, this));
    this.cancel.bind('click', $.proxy(this.cancelEdit, this));
};

ScoreManager.prototype.cancelEdit = function() {
    this.cell.empty();
    this.cell.append(this.points, this.edit);
    this.edit.bind('click', $.proxy(this.showEditControls, this));
}

ScoreManager.prototype.savePoints = function() {
    this.cell.empty();
    this.points.text(this.scoreInput.val());
    this.cell.append(this.points, this.edit);
    this.edit.bind('click', $.proxy(this.showEditControls, this));
}

 </script>
4

2 回答 2

1

您应该看看浏览器中的事件委托和事件冒泡,PPK 博客是一个好地方。

然后看一下jQuery on方法,它以一种优雅的方式实现委托。

现在将事件绑定到考虑中的顶部元素,该元素不会被添加到 DOM,它也可以是 body,并委托给您想要的元素。

$('#points-table').on('click', '.points', function(){
  //what should be done when you click a point element
  });
于 2012-08-26T23:29:30.557 回答
0

bind删除元素后将不起作用。它会将一个事件附加到所有已经可用的元素,但如果你删除该元素 - binidng 将丢失。新添加的元素也没有绑定。您可能会发现有用的jQuery.live允许将事件绑定到具有指定选择器的元素,无论它是否已经存在或稍后将被添加。但是如果您使用的是最新的 jQuery,您可能需要使用替代品,因为它已被贬低。此外,您可能会发现使用它.detach()而不是.empty()因为 detach 保留事件处理程序绑定很有用。但是您将需要修改您的代码,因为这this.cell.detach();将删除整个单元格)而不是仅删除其子单元格。

于 2012-08-26T22:48:09.290 回答