【问题标题】:jQuery onClick only runs once on table celljQuery onClick 只在表格单元格上运行一次
【发布时间】:2018-10-06 21:57:38
【问题描述】:

我有一个表中的行列表,当用户单击表中的单元格时,我试图使其可编辑。然后我的计划是发出 AJAX 请求来更新这些数据。

这是我的 HTML 示例:

<tr>
    <td>3</td>
    <td class="textFieldCell"><span class="textField" data-question-id="3">Is the instructor aware of their self development and self improvement areas they are working toward as part of their planned delivery and self peer or tutor assessment?</span></td>
    <td class="sortOrderFieldCell"><span class="sortOrderField" data-question-id="3">3</span></td>
    <td><a href="#" class="deleteQuestion" data-questionid="3">Delete Question</a></td>
</tr>

所以这里的想法是当用户点击表格中的跨度时,它被一个输入框替换,用户可以在其中更改数据,然后在模糊上进行 AJAX 调用。我对编写 AJAX 调用非常满意,但我遇到了一个问题,即框表单元格仅允许 jQuery 将其更改为输入字段一次。以下是该问题的分步说明:

  1. 用户在表格单元格上单击,工作正常,跨度被输入框替换。
  2. 然后用户单击输入框,这会将输入框变成没有问题的跨度。
  3. 问题出在此处,如果用户尝试单击返回到同一个表格单元格以再次对其进行编辑,则 jQuery 不会运行。

这是我的 jQuery:

jQuery('.sortOrderField').click(function() {
        var input = jQuery('<input />', {'type': 'text', 'class': 'sortOrderField', 'name': 'aname', 'value': jQuery(this).html()});
        jQuery(this).parent().append(input);
        jQuery(this).remove();
        input.focus();
        jQuery('.sortOrderFieldCell input').blur(function() {
            var html = "<span class='sortOrderField' data-question-id='3'>" + jQuery(this).val() + "</span>";
            jQuery(this).parent().append(html);
            jQuery(this).remove();
        });
    });

有人知道为什么这个 jQuery 只在表格单元格上运行一次吗?

【问题讨论】:

  • 您需要委托该事件,因此它也将绑定到进一步添加的 .sortOrderField 元素。 $(document).on('click','.sortOrderField',function(){...。那么您可以对输入模糊事件执行相同的操作。您不需要在每次点击时都调用它。 $(document).on('blur','.sortOrderFieldCell input',function(){.. 在点击块之外
  • 太棒了。整理好了!谢谢!
  • @nubinub 提供答案作为答案而不是评论如何?
  • 因为我没有阅读整篇文章,也不确定这是整个问题的根源,抱歉。

标签: jquery html-table


【解决方案1】:

这里需要使用事件委托

jQuery(document).on('click', '.sortOrderField', function() {
    var input = jQuery('<input />', {'type': 'text', 'class': 'sortOrderField', 'name': 'aname', 'value': jQuery(this).html()});
    jQuery(this).parent().append(input);
    jQuery(this).remove();
    input.focus();
});
jQuery(document).on('blur', '.sortOrderFieldCell input', function() {
    var html = "<span class='sortOrderField' data-question-id='3'>" + jQuery(this).val() + "</span>";
    jQuery(this).parent().append(html);
    jQuery(this).remove();
});

演示:Fiddle

【讨论】:

    【解决方案2】:

    您正在将您的事件附加到页面中当前具有类 sortOrderField 的所有项目。

    但是,当您执行jQuery(this).remove(); 时,您会从页面中删除该元素,触发器也会随之发生。

    为了保留触发器,您应该使用选择器参数将其附加到父元素。这是一个例子:

    jquery('table.editableTable').on( 'click', '.sortOrderField', function() {
        var input = jQuery('<input />', {'type': 'text', 'class': 'sortOrderField', 'name': 'aname', 'value': jQuery(this).html()});
        jQuery(this).parent().append(input);
        jQuery(this).remove();
        input.focus();
    });
    jQuery('table.editableTable').on('blur', '.sortOrderFieldCell input', function() {
        var html = "<span class='sortOrderField' data-question-id='3'>" + jQuery(this).val() + "</span>";
        jQuery(this).parent().append(html);
        jQuery(this).remove();
    });
    

    此示例假定您的行位于一个具有类 editableTable 的表中。此代码还假定您没有动态地向页面添加新表。

    出于性能原因,我建议您将这些事件放在触发器将触发的元素的最接近的父元素上,以最大程度地减少事件冒泡和元素搜索的工作,但这当然取决于页面有多大,您对性能的要求有多大。

    查看jquery .on() documentation 了解更多信息。

    【讨论】:

    • 感谢您的解释。说得通! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多