双击设置表格的文本

时间:2015-10-16 09:16:19

标签: javascript jquery jquery-events

我有几个带有ajax加载内容的表。有时我必须手动更改td的内容,然后再将其导出为PDF,因此我认为最好的方法是使用jQuery td双击为每个.dblclick()创建一个触发器。触发器会打开一个带有input字段的模态,并在提交模式时更改双击td的文本。

这样做有效,但当我更改第二个,第三个等td的内容时,之前点击的每个td也会获得新值。

检查我的小提琴:https://jsfiddle.net/fvoufq07/

到目前为止我的代码:

$( ".sitename" ).dblclick( function() {
    var sitename = $( this );
    $( "#msgBox .modal-title" ).html("Change sitename");
    $( "#msgBox .modal-body" ).html("Enter new sitename:<input type=\"text\" id=\"new_sitename\">");
    $( "#msgBox" ).modal("show");
    $( "#msgBox button.btn" ).click( function() {
    sitename.text( $( "#new_sitename" ).val().trim() );
});

});

4 个答案:

答案 0 :(得分:5)

这是因为你为模态重复使用相同的按钮。因此,每次打开模态时,都会在按钮上添加一个新的侦听器,但不会杀死前一个。

您可以使用off

杀死之前的侦听器
$( ".sitename" ).dblclick( function() {
    var sitename = $( this );

    $( "#msgBox .modal-title" ).html("Change sitename");
    $( "#msgBox .modal-body" ).html("Enter new sitename:<input type=\"text\" id=\"new_sitename\">");
    $( "#msgBox" ).modal("show");
    $( "#msgBox button.btn" ).off('click').click( function() {
        sitename.text( $( "#new_sitename" ).val().trim() );
    });

});

答案 1 :(得分:4)

您看到的问题是您添加到按钮的点击功能

private void OnMenuSourceFileOpening(object sender, ...)
{   // open a context menu with the associated files + ".txt" files
    if (File.Exists(this.SelectedFileName))
    {
        string fileExt = Path.GetExtension(this.SelectedFileNames);
        string[] allowedExtensions = new string[] { fileExt, ".txt" };
        var fileAssociations = allowedExtensions
            .Select(ext => new FileAssociationInfo(ext));
        var progInfos = fileAssociations
            .Select(fileAssoc => new ProgramAssociationInfo (fileAssoc.ProgID));
        var toolstripItems = myProgInfos
            .Select(proginfo => new ToolStripLabel (proginfo.Description) { Tag = proginfo });
        // add also the prog info as Tag, for easy access
        //  when the toolstrip item is selected
        // of course this can also be done in one long linq statement

        // fill the context menu:
        this.contextMenu1.Items.Clear();
        this.contextMenuOpenSourceFile.Items.AddRange (toolstripItems.ToArray());
    }
}

未删除。因此,每次重新打开模型时,都会更改之前单击的$( "#msgBox button.btn" ).click( function() { sitename.text( $( "#new_sitename" ).val().trim() ); }); 以及新单击的文本。

为了避免这种情况,你应该删除click事件,或者更好地使用jQuery的.sitename函数,该函数只会触发第一个触发事件实例的回调:

.one()

更新了小提琴: https://jsfiddle.net/fvoufq07/6/

更新:上述解决方案无法解决打开模式然后关闭而不点击&#34;关闭&#34;保存按钮。

有几种方法可以解决此问题:在添加新的$( "#msgBox button.btn" ).one('click', function() { sitename.text( $( "#new_sitename" ).val().trim() ); }); 回调之前使用.off(),或者再次使用.one(),但有条件地使用bootstap关闭模式&#39 ; s .off()触发器。

hidden.bs.modal

您可能还希望将$( "#msgBox" ).one('hidden.bs.modal', function() { $( "#msgBox button.btn" ).off('click'); }); 侦听器分配给变量,以便您可以专门删除该侦听器,如果您在同一元素上有其他'click'侦听器,这将非常有用。

'click'

https://jsfiddle.net/fvoufq07/7/处的更新小提琴有一个例子。

答案 2 :(得分:3)

试试这个

var sitename;
$( ".sitename" ).dblclick( function() {
    sitename = $(this);
    $( "#msgBox .modal-title" ).html("Change sitename ");
    $( "#msgBox .modal-body" ).html("Enter new sitename:<input type=\"text\" id=\"new_sitename\">");
    $( "#msgBox" ).modal("show");
});

$( "#msgBox button.btn" ).click( function() {
        $(sitename).text( $( "#new_sitename" ).val().trim() );
    });

此处已更新jsfiddle

答案 3 :(得分:2)

试试这个

$( ".sitename" ).dblclick( function() {
sitename = $( this );
$( "#msgBox .modal-title" ).html("Change sitename");
$( "#msgBox .modal-body" ).html("Enter new sitename:<input type=\"text\" id=\"new_sitename\">");
$( "#msgBox" ).modal("show");
$( "#msgBox button.btn" ).click( function() {
    sitename.text( $( "#new_sitename" ).val().trim() );
});

});

Krupesh Kotecha也打败了我;)