gpt4 book ai didi

javascript - jquery点击事件递归

转载 作者:行者123 更新时间:2023-12-01 02:21:09 26 4
gpt4 key购买 nike

我正在尝试添加新行并在选择前一行时绑定(bind)单击事件。问题在于,这会创建一个递归逻辑,因为单击函数本身是绑定(bind)的。因此,目前第一个更新适用于点击绑定(bind),但不适用于以下新行。代码如下

$('.new').click(function ()
{
var newrow =" <div class='controls controls-row'><div id='div_id_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span1 m-wrap input-icon' >"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"</div><div id='div_rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span5 m-wrap input-icon' ><input type='text' onchange='updateRecord(this)' id='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' name='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='m-wrap span11 new' value=''/></div></div>";
var Parent = document.getElementById('tablediv');
var NewDiv = document.createElement("DIV");
NewDiv.innerHTML = newrow;
Parent.appendChild(NewDiv);
$('.new').click(function ()
{
var newrow =" <div class='controls controls-row'><div id='div_id_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span1 m-wrap input-icon' >"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"</div><div id='div_rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span5 m-wrap input-icon' ><input type='text' onchange='updateRecord(this)' id='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' name='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='m-wrap span11 new' value=''/></div></div>";
var Parent = document.getElementById('tablediv');
var NewDiv = document.createElement("DIV");
NewDiv.innerHTML = newrow;
Parent.appendChild(NewDiv);

});

});

如何创建它,以便单击事件创建一个新行并将相同的功能单击事件添加到新行。谢谢

最佳答案

您可以使用 on() 来使用事件委托(delegate)对于 jquery >=1.7 和 live()对于早期版本。

$(document).on('click', '.new', function (){

var newrow =" <div class='controls controls-row'><div id='div_id_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span1 m-wrap input-icon' >"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"</div><div id='div_rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span5 m-wrap input-icon' ><input type='text' onchange='updateRecord(this)' id='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' name='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='m-wrap span11 new' value=''/></div></div>";
var Parent = document.getElementById('tablediv');
var NewDiv = document.createElement("DIV");
NewDiv.innerHTML = newrow;
Parent.appendChild(NewDiv);

});

将事件绑定(bind)到任意给定时间点存在于 DOM 中的另一个父容器,而不是 document。这利用 event bubbling实际上,您将事件绑定(bind)到父元素或文档头,如我的示例所示,当您单击与选择器及其父元素匹配的元素时,事件会冒泡到事件绑定(bind)的位置并触发该元素上的事件

通过使用通用选择器 .new 在内部绑定(bind)事件的方式,每次单击时,它都会将 click 事件再次绑定(bind)到现有的 .new 元素,因此您最终会得到事件执行多次。

您还可以这样做:

$(function(){
$('.new').click(handleClick);
});

function handleClick(){
var newrow =" <div class='controls controls-row'><div id='div_id_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span1 m-wrap input-icon' >"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"</div><div id='div_rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='control-group control span5 m-wrap input-icon' ><input type='text' onchange='updateRecord(this)' id='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' name='rules_"+this.id.split('_')[1]+'_'+new String(parseInt(this.id.split('_')[2])+1)+"' class='m-wrap span11 new' value=''/></div></div>";
var Parent = document.getElementById('tablediv');
var NewDiv = document.createElement("DIV");
NewDiv.innerHTML = newrow;
$(Parent).append($(NewDiv).find('.new').click(handleClick).end());

}

您也可以考虑使用templating绑定(bind)数据并克隆元素,而不是使用字符串连接并在单击事件中动态创建 html。

关于javascript - jquery点击事件递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18903762/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com