addEventListener用immediate函数模式调用函数两次
addEventListener calling function twice with in immediate function pattern
我在用addEventListener调用immediate函数时遇到问题,该函数调用了两次。试图从冒泡变为捕捉,但没有成功。这是我的代码
一些描述:我正试图在它点击的地方添加文本框。
var mod = (function(){
var sEventType = 'click',
labelObj = document.getElementsByTagName('label');
return {
createTextBox : function(targetId,inputVal){
alert('hi');
var elemInput = document.createElement('input');
},
addEvents : function(){
for (var i = 0; i < labelObj.length; i++) {
if (window.addEventListener) //Firefox, Chrome, Safari, IE 10
labelObj[i].addEventListener(sEventType,function(){ mod.createTextBox(this,this.innerHTML);}, false);
else if (window.attachEvent) //IE < 9
labelObj[i].attachEvent(sEventType, function(){ mod.createTextBox(this,this.innerHTML);});
}
}
}
}());
//Intialise Event
mod.addEvents();
查看正在调用createTextBox的addEventListener,在弹出窗口中发出两次警报。
这是HTML部分
<body>
<div id='tableMain'>
<div id='exlTopHd'>
<div id='loginData'>
<div id='yourName'><label id='mNam'>type your name here</label></div>
<div id='yourEmail'><label>your email address</label></div>
</div>
<div id='exlCtr'>
<div id='exlTitle'><label>add title<lable></div>
<div id='addRow'>+row</div>
<div id='addColomn'>+colomn</div>
<div id='saveExl'>saving...</div>
</div>
</div>
<div id='exlTb'></div>
</div>
可能您在label
中嵌套了一个input
,如下所示:
<label>Check 1: <input type="checkbox" /></label>
当使用嵌套元素时,单击label
也会触发单击input
。为了避免这种情况,您可以使用for
属性:
<label for="check1">Check 1: </label><input id="check1" type="checkbox" />
jsFiddle的现场演示。
编辑
看起来你在我写答案的同时编辑了你的问题。不管怎样,上面写的内容仍然有效,即使input
是动态添加的。请检查一下这把小提琴,如果你需要的话,请告诉我。该代码段动态创建input
,并将它们插入到label
之后。
以下是修改后的代码片段:
var mod = (function () {
var sEventType = 'click',
labelObj = document.getElementsByTagName('label');
return {
createTextBox: function (e) {
var target = e.target || e.srcElement,
parent = target.parentElement,
elemInput = document.createElement('input');
inpId = parent.id + 'Inp';
elemInput.value = target.innerHTML;
elemInput.id = inpId;
target.setAttribute('for', inpId);
parent.insertBefore(elemInput, target.nextSibling);
},
addEvents: function () {
for (var i = 0; i < labelObj.length; i++) {
if (window.addEventListener) //Firefox, Chrome, Safari, IE 10
labelObj[i].addEventListener(sEventType, function (e) {
mod.createTextBox(e);
}, false);
else if (window.attachEvent) //IE < 9
labelObj[i].attachEvent('on' + sEventType, function (e) {
mod.createTextBox(e);
});
}
}
}
}());
相关文章:
- 调用一个函数两次
- 在一个页面中使用相同的javascript函数两次
- matchMedia调用函数两次
- 在 javascript 中调用命名函数两次
- jQuery:调用一个函数两次
- 具有层次结构的网格自定义命令正在调用 javascript 函数两次
- 调用 JS 函数两次时出现问题
- 调用 Javascript 函数两次
- addEventListener用immediate函数模式调用函数两次
- 烦恼node.js为一个页面刷新调用httpserver回调函数两次
- Javascript启动函数两次,4个函数中的1个不起作用
- 为闭包声明函数两次
- IE在ajaxized网站上调用函数两次
- Node.js,快速调用函数两次,一次带有完整的req.body,一次具有空的body
- 在同一页上使用js函数两次
- AngularJS运行函数两次,尽管控制器只被初始化一次
- 使用javascript的Onclick函数两次切换可见性
- 调用函数两次
- 调用同一个函数两次,第二次不调用;不要开火
- Ctrl+V ( 粘贴 ) 触发 jQuery 的键函数两次