浅谈jquery点击label触发2次的问题
今天写问卷的时候遇到个label点击的时候,监听的click事件被执行两次;产生这个的原因么。。。事件冒泡
<divclass="questionBoxcheckBox"> <divclass="title">2.你如何理解创新意识的重要性?</div> <divclass="checkBoxList"data-more="2"> <label> <inputtype="checkbox"/> <span>创新意识是工作必须的</span></label> <label> <inputtype="checkbox"/> <span>创新意识是工作必须的</span></label> <label> <inputtype="checkbox"/> <span>创新意识是工作必须的</span></label> <label> <inputtype="checkbox"/> <span>创新意识是工作必须的</span></label> <label> <inputtype="checkbox"/> <span>创新意识是工作必须的</span></label> </div> <inputtype="text"class="text"placeholder="在此输入其它的意见"/> </div>
$(".checkBoxListlabel").click(function(){ varmore=$(this).parent(".checkBoxList").attr("data-more"); varlength=$(this).parent(".checkBoxList").find("label").length; varNowCheck=0; for(i=0;i<length;i++){ if($(this).parent(".checkBoxList").find("label").eq(i).find("input").prop("checked")==true){ pass="1" NowCheck=NowCheck+1 } } if(NowCheck>more){ alert("本题最多选取"+more+"个") } })
然后么找了下方法。。。
方法一:把label扔了。。。
然后方法二
只认input,判断事件源为input(这是网上有人贴出来的解决方法)
/** *是否包含某id的input后代元素 *@param{Element}elm要判断的元素 *@param{String}id要匹配的id *@return{Boolean} */ functionhasInput(elm,id){ for(vari=0,inputs=elm.getElementsByTagName("input"),len=inputs.length;i<len;i++){ if(inputs[i].id===id){returntrue;} } returnfalse; } /** *判断某元素下的label是否有关联的input *@param{Element}elm要判断的元素 *@param{Element}labellabel元素 *@return{Boolean} */ functionisLabelhasRelativeInput(elm,label){ if(label.getElementsByTagName("input").length){ returntrue; } varforT=label.getAttribute("for"); varisIE6=!-[1,]&&!window.XMLHttpRequest;//IE6不支持for属性 if(forT&&hasInput(elm,forT)&&!isIE6){ returntrue; } returnfalse; } document.getElementById("test").onclick=function(e){ varev=e||window.event; varsrcElm=ev.target||ev.srcElement; if(srcElm.tagName==='LABEL'&&isLabelhasRelativeInput(this,srcElm)){return;} //dosomething; }
。。。反正我是看的有点醉了
然后方法三。。。
通过事件触发的时间戳来判断,其实和事件冒泡有关的问题都可以通过该方法去处理。安全无公害
varevTimeStamp=0; document.getElementById("test").onclick=function(e){ varnow=+newDate(); if(now-evTimeStamp<100){ return; } evTimeStamp=now; console.log(2); }
好了讨论到最后。。。我还是吧label给扔了。。。HOHOHO
$(".checkBoxListlabelinput").click(function(){ varmore=$(this).parents(".checkBoxList").attr("data-more"); varlength=$(this).parents(".checkBoxList").find("label").length; varNowCheck=0; for(i=0;i<length;i++){ if($(this).parents(".checkBoxList").find("label").eq(i).find("input").prop("checked")==true){ pass="1" NowCheck=NowCheck+1 } } if(NowCheck>more){ alert("本题最多选取"+more+"个") } })
以上这篇浅谈jquery点击label触发2次的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。