2013-02-08 5 views
9

레이블에 하나의 select를 추가하고 click 이벤트에 바인딩하면 jquery가 두 번 실행됩니다.jquery binding 레이블을 두 번 클릭하면 클릭

http://jsfiddle.net/d8Ax7/

HTML :

<label class="lol"> 
    <div> 
     bla 
    </div> 
    <div style="display:none;"> 
     <select></select> 
    </div> 
</label> 

자바 스크립트 :

$("label.lol").on({ 
    click : function() 
    { 
     alert(1); 
    } 
}) 

가 어떻게 라벨 속성 "에 대한"추가하지 않고이 버그를 해결할 수 있습니까?

+0

흥미로운. div가 포함되지 않은 라벨 태그 내에서 프레이밍 콘텐츠 만 사용할 수있는 것처럼 보입니다. [소스] (https://developer.mozilla.org/en-US/docs/HTML/Content_categories#Phrasing_content) –

+0

우분투/firefox가 한 번 귀하의 바이올린에서 트리거 – mikakun

+0

'$ 내부에서 첫 번째 div 만 선택하면 예상대로 작동합니다 ("label.lol div : first")' – sofl

답변

5

나는이 질문에 이미 많은 답변을 알고 있지만 막연합니다.

$("label.lol").on({ 
    click : function() 
    { 
     alert(1); 
     return false; 
    } 
}); 

모두에게 감사드립니다. 문제 해결됨. 그러나 질문이 생기는 이유는 return false;입니다.

대답 간단한 단어 : 이것은 컴퓨터에서 사용자가 수행 한 작업에서 돌아 오면 작업이 완료되었음을 알리는 한 방법입니다. 이제 더 이상 혼란스러워하지 마라.

+0

감사합니다 Aspiring Aquib; 그것은 효과가 있었다. 그게 버그라고 생각하니? –

+0

클릭 이벤트가 DOM을 전파 또는 버블 업하여 두 번 실행합니다. 그것들 사이에 또 ​​하나의 선택 태그 (또는 다른 폼 요소)가 있습니다. 이 수수께끼를 볼 수 있습니다 : http://jsfiddle.net/5QAS2/ ** 그것에 무엇입니까 ** ** 입력 또는 다른 태그가 레이블 요소 사이에있을 때 함수가 두 번 실행되는 것을보십시오. 그리고 양식 요소가 없을 때. 나는 이것에 대한 연구를하지 않았다. 그래서 더 설명 할 수 없거나 그것이 버그라고 말할 수 없습니다. 네! –

+0

또 다른 한가지는 두 입력이 있는지 세 번 경고해야하는 경우입니다. 어느 쪽이 아니야.보기 : http://jsfiddle.net/5QAS2/1/ 그래서 버그라고 생각합니다. DOM을 버블 링한다고 말할 수는 없습니다. 글쎄, 나는 당신이 프로그램을 작성할 때'false를 돌려 준다 '고 제안한다. –

0
$("label.lol").off("click").on(//... 

하지만 두 번 발사 않다면 그것은 확실히 .OFF는이 이벤트를 두 번 바인딩을 끝낼 방법을 이해하는 것입니다 문제에 대한 최적의 솔루션보다 해킹 사용하여 두 번 그렇게 바인딩 것을 의미 .. . &은 확실히 당신이 보여주는 코드는이 이중 속박을 설명하지 않습니다

편집 : 그것은 참으로 한 번만 트리거 않는 바이올린의 & ...

2

당신은 라벨의이 "를"그것을 연결 속성을 사용하여 시도 할 수 그것의 밖의 선택에. 이 방법은 너무 작동하지만 나는 완전히 당신이 ... 을하려고하는지있어 이해가 안 그리고 레이블 만의 레이블 텍스트를 포함해야 내 예를

<label for="test" class="lol"> 
    <div> 
     bla 
    </div> 
</label> 

<div style="display:none;"> 
    <select id="test"></select> 
</div> 

http://jsfiddle.net/d8Ax7/1/

+0

인용구 : "이 속성을 레이블에 추가하지 않고이 버그를 어떻게 해결할 수 있습니까?" – sofl

+0

아, 미안하지만, 처리기에서 false를 돌려 주면됩니다. http://jsfiddle.net/d8Ax7/3/ –

+0

글쎄, 아 남자가 대답을 업데이트하고 있습니까? 그것의 좋은. 그리고 @sofl은 항상 코드에서'return false; '를 사용합니다. –

0

를 참조하십시오

$("label.lol div:first").on({ 
     click : function() 
     { 
      alert(1); 
     } 
    }) 
0

두 가지 옵션이 무시 있습니다 .. 선택과 자신을 선택 포함하지 클릭 ... 더 상세이 stack overflow 질문을 확인하지만,가 이것을 시도 합계

$("label.lol").click(function() { 
     alert(1); 
     return false; 
}); 
0

귀하의 마크 업은 끔찍합니다 .. 귀하의 문제는 jquery가 라벨 기능 내에서 각 div에 대해 click 이벤트를하고 있다는 것입니다. 즉 두 번을 의미합니다. 당신은 UR 마크 업을 깨끗이해야하고 div에 직접 클릭 할 수 있도록하고 싶습니다. 그렇지 사용 : 먼저 확인하는 이벤트 한 번 해고 전용 :

$('.lol div:first').click(function() 
{ 
    alert("1"); 
}) 
+0

마크 업에 대해 당신이 맞습니다. 그러나 행사는 라벨에서 시작됩니다. 'alert ("1")'을'alert (this)'로 대체하면'[object HTMLLabelElement]'가 두 번 표시된다는 것을 알 수 있습니다. – fragmentedreality

0

당신은 e.preventDefault()를 추가해야합니다;

$("label.lol").on({ 
    click : function (e) 
    { 
    alert(1); 
    e.preventDefault(); 
    } 
}); 
0

귀하의 문제는 요소들 사이의 구별에 달려 있습니다 .e.g 당신은 :first-child 선택과 라벨의 첫 번째 자식을 선택하거나에게 id 제공해야합니다 :

HTML :

<label class="lol"> 
    <div id="first-child"> 
     bla 
    </div> 
    <div style="display:none;"> 
     <select></select> 
    </div> 
</label> 

JS :

$("#first-child").on('click',function(){ 
     alert(1); 
}); 

http://jsfiddle.net/d8Ax7/5/

0

을 CSS로 필터링 해 봅니다 : int 추가 두 번째 경고 (또는 다른 동작)를 방지하고 .clicked을 제거하여 다음 라운드를 준비 할 수있는 clicked 클래스.

$("label.lol").on({ 
    click : function() 
    { 
     if (! $(this).hasClass('clicked')) 
      alert(1); 
     $(this).toggleClass('clicked'); 
    } 
}) 
관련 문제