我有几个带有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() );
});
});
答案 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也打败了我;)