jQuery $ (“. class”). click (); -여러 요소, 클릭 이벤트 한 번


82

동일한 이름의 페이지에 여러 클래스가 있습니다. 그런 다음 JS에 .click () 이벤트가 있습니다. 내가 원하는 것은 내 페이지의 여러 클래스에 관계없이 클릭 이벤트가 한 번만 발생한다는 것입니다.

시나리오는 AJAX를 사용하여 장바구니에 추가하는 것입니다. 때로는 홈 페이지에 추천 제품과 최고 오퍼가있을 수 있습니다. 즉, 동일한 클래스 .add. # productid #가 있고 클릭하면 장바구니에 추가 AJAX가 두 번 실행됩니다.

.container-name .add. # pid #를 사용하여 고유 한 클릭을 제공하도록 '클릭 영역'을 만드는 것에 대해 생각했습니다.

이것이 유일한 해결책입니까?

<div class="addproduct 151">product info</div>
<div class="addproduct 151">product info</div>
<div class="addproduct 151">product info</div>
<div class="addproduct 151">product info</div>
<div class="addproduct 151">product info</div>


$(".addproduct").click(function(){//do something fired 5 times});

귀하의 코드를 게시하십시오. 귀하가 말하는 내용이 이해가되지 않습니다.
Lazarus 2011

예, 자바 스크립트 코드를 게시하세요.
Yngve B-Nilsen 2011

1
한 번만 실행되어야합니다. HTML 문제 일 수도 있습니다. 하나의 addproduct 클래스가 다른 클래스에 중첩되어 있거나 한 번의 클릭에 대해 두 번 아약스를 실행하는 핸들러에 오류가있을 수 있습니다. 코드를 확인하십시오.
사이먼

3
끔찍한 질문과 대답. 나는 비슷한 문제를 겪고 있지만 초기 포스터에서 광기에 대한 해결책이나 방법을 언급하는 곳은 없습니다 ... 그래서 사람들 이이 사이트를 제대로 사용할 수 없지만 어떤 수준의 개발자가 될 것이라고 기대하지 마십시오.
ocergynohtna

data-id = "151"을 사용한 다음 $ (this) .data ( 'id')
Andres SK

답변:


120

이 오래된 스레드를 부딪쳐서 죄송합니다. 나는 지금 같은 문제가 있었고 내 해결책을 공유하고 싶었습니다.

$(".yourButtonClass").on('click', function(event){
    event.stopPropagation();
    event.stopImmediatePropagation();
    //(... rest of your JS code)
});

event.StopPropagationevent.StopImmediatePropagation()트릭을 할해야합니다.

이벤트 핸들러에 대한 .class 선택기가 있으면 bubbling클릭 이벤트가 발생합니다 (때로는 부모 요소로, 때로는 DOM의 하위 요소로).

event.StopPropagation()method는 이벤트가 Parent 요소로 버블 링되지 않도록하는 반면 event.StopImmediatePropagation()method는 이벤트가 원하는 클래스 선택기의 Children 요소로 버블 링되지 않도록합니다.

출처 : https://api.jquery.com/event.stoppropagation/ https://api.jquery.com/event.stopimmediatepropagation/


1
이것이 올바른 솔루션입니다. jQuery로 클래스 클릭을 호출하면 다른 요소로 버블 링하고 여러 클릭을 등록 할 수 있습니다. 클릭 이벤트의 다른 요소로의 전파를 중지하는 것이이 문제를 해결하는 방법입니다. 나는 다른 답변 중 일부가 여기서 일어날 가능성이 가장 높은 일을 오해했다고 생각합니다.
RATKNUKKL

90
$(document).on('click', '.addproduct', function () {
    // your function here
});

작동합니까? 기능에 톱은 다음과 같이 사용중인 결코
나빌 칸

다른 이벤트에서 주어진 답변을 어떻게 불러야합니까 ??
Murad Hasan 2017

1
모든 것을 시도했지만 이것이 효과가 있었던 유일한 솔루션입니다.
Matt

두 번째 매개 변수에 대한 설명 :A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.
zwlxt 2011

45

클릭 핸들러를 볼 수 있습니까? 5 개의 다른 요소에 5 명의 리스너를 연결하고 있습니다. 그러나 사용자가 요소를 클릭하면 하나의 이벤트 만 발생합니다.

$(".addproduct").click(function(){
  // Holds the product ID of the clicked element
  var productId = $(this).attr('class').replace('addproduct ', '');

  addToCart(productId);
});

이 솔루션이 작동하지 않으면 클릭 핸들러를 살펴보고 싶습니다.


29

addproduct class로 div를 클릭하면 5 개가 아닌 특정 요소에 대해 1 개의 이벤트가 발생합니다. 이벤트가 5 번 발생하면 코드에서 뭔가 잘못하고있는 것입니다.


24
나는이 대답이 명백한 것을 말하는 방법을 좋아하고 querent는 그들이 처음에 할 일이 아닌 것처럼 코드를 확인할 것이라고 말합니다 : D.
KI4JGT

1
이것이 받아 들여지는 대답이라는 것에 놀랐습니다. Ivan Kalafatić가 언급했듯이 문제는 클릭 이벤트가 다른 요소로 전파된다는 것입니다. 해결책은이 전파를 중지하는 것입니다. 이를 수행하는 방법은 Ivan Kalafatić의 답변을 참조하십시오. 편집 : 정답이 실제로 Machavity가 아닌 Ivan Kalafatić가 작성한 것으로 나타났습니다 (편집 한 사람). 내 실수를 고쳤습니다.
RATKNUKKL

14

이 상황에서 나는 시도 할 것이다 :

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

    //your code here

 });

그런 다음 동일한 클래스를 가진 다른 요소에서 하나를 클릭하여 수행해야하는 경우 요소를 반복 할 수 있습니다.

$(document).on('click','.addproduct', function(){
   $('.addproduct').each( function(){

      //your code here
     }
  );
 }
);

11

클릭 이벤트를 5 번 추가 한 것 같습니다. 이 일을 몇 번이나 세어보십시오.

console.log('add click event')
$(".addproduct").click(function(){ });

AngularJS를 사용하여 x 번 테스트하기 위해 스크립트 태그를 복사 한 것을 확인했습니다! 가능한 해결책에 감사드립니다.
Dean Meehan 2015

8

이것은 그것을 고쳐야하고 좋은 습관이어야합니다 : .unbind ()

$(".addproduct").unbind().click(function(){
   //do something 
});

unbind는 더 이상 사용되지 않습니다 ( api.jquery.com/unbind에서 ) : jQuery 3.0부터 .unbind ()는 더 이상 사용되지 않습니다. jQuery 1.7 이후로 .off () 메서드로 대체되었으므로 이미 사용하지 않는 것이 좋습니다.
Tomer

6

인라인 jquery 함수 호출을 사용하여 해결했습니다.

<input type="text" name="testfield" onClick="return testFunction(this)" /> 

<script>
  function testFunction(current){
     // your code go here
  }
</script>

당신은 내 하루를 구해줘 야!
Smaïne

5

나는 단지 같은 문제가 있었다. 제 경우에는 PHP 코드가 동일한 jQuery 코드를 몇 번 생성했으며 다중 트리거였습니다.

<a href="#popraw" class="report" rel="884(PHP MULTIPLE GENERATER NUMBERS)">Popraw / Zgłoś</a>

(PHP MULTIPLE GENERATER NUMBERS도 동일한 코드를 여러 번 생성했습니다.)

<script type="text/javascript">
$('.report').click(function(){...});
</script>

내 해결책은 다른 PHP 파일에서 스크립트를 분리하고 해당 파일을 한 번로드하는 것이 었습니다.


귀하의 의견은 저를 내 솔루션으로 이끌었습니다. 동일한 문제가 발생하여 한 번의 클릭으로 모든 요소에 대한 이벤트가 발생했습니다. 여러 번로드 된 부분보기 (asp mvc)에 스크립트를 고정했기 때문입니다. 감사합니다.
Hanshan 2015

2

여기에 코드를 입력하기 만하면 JQuery에서 ones 이벤트가 트리거됩니다. 파일의 클래스 발생 수를 확인하고 다음 논리에 for 루프를 사용하기 만하면됩니다. JQuery를 통해 클래스, 태그 또는 DOM 요소의 발생 횟수를 식별합니다. var len = $ ( ". addproduct"). length;

 $(".addproduct").click(function(){
       var len = $(".addproduct").length; 
       for(var i=0;i<len;i++){
          ...
        }
 });

1

나는 같은 문제가 있었다. 원인은 동일한 jquery를 여러 번 사용했기 때문입니다. 그는 루프에 배치되었습니다.

$ (". AddProduct"). click (function () {});
$ (". AddProduct"). click (function () {});
$ (". AddProduct"). click (function () {});
$ (". AddProduct"). click (function () {});
$ (". AddProduct"). click (function () {});

이런 이유로 여러 번 발사되었습니다


1

내 프로젝트에서 직접 시도했습니다.

테이블의 모든 행에는 "연락처"클래스가 있습니다.

테이블의 모든 행에는 "연락처"클래스가 있습니다.

내 코드는 다음과 같습니다.

var contactManager = {};

contactManager.showEditTools = function(row) {
  console.debug(row);
}

$('.contact').click(function(event){
  console.log("this should appear just once!");
  alert("I hope this will appear just once!");
  contactManager.showEditTools(event);
});

그리고 코드를 실행할 때 Firebug 콘솔에서 결과로 전체 행을 보는 것이 처음 무서웠습니다.

코드 실행 후 Firebug 콘솔 스크린 샷

그러나 경고 대화 상자가 나타나지 않았기 때문에 클릭 이벤트가 발생하지 않았 음을 깨달았습니다. Firebug는 클릭 오버라이드의 영향을받는 요소 만 보여줍니다. 따라서 걱정할 것이 없습니다.


1

.off()핸들러를 사용해보십시오 .

$(function () {
    $(".archive-link").click(function (e) {
        var linkObj = $(this);
        var cb = $("#confirm-modal");
        cb.find(".modal-body").append("<p>Warning message.</p>");
        cb.modal('show'); 
        cb.find(".confirm-yes").click(function () {
            $(this).off(); //detach this event
            //ajax call yada yada..
        }

OK 모달 버튼에 클릭 이벤트 핸들러를 첨부하여 click클래스가있는 객체의 이벤트에 대해 작동합니다..archive-link .

첫 번째 클릭에서 이벤트 .archive-link는 내가 함수가 작동하도록 요청한 객체 에서만 발생합니다 ( var linkObj). 그러나 동일한 링크를 두 번 클릭하고 모달에서 확인을 누르면 .archive-link이전에 클릭 한 모든 개체에서 이벤트가 발생합니다 .

위의 솔루션을 사용했지만 안타깝게도 작동하지 않았습니다. 전파가 중지 된 것은 모달 OK 버튼 클릭 함수 내에서 .off ()를 호출했을 때였습니다. 이게 도움이 되길 바란다.


1

이 질문은 해결되었고 많은 답변을 받았지만 뭔가 추가하고 싶습니다. 내 클릭 요소가 한 번이 아닌 77 번 실행되는 이유를 알아 내려고했습니다.

내 코드에서 json 응답을 실행하고 버튼이있는 div로 표시하는 각각이 있습니다. 그런 다음 각각 내부에서 클릭 이벤트를 선언했습니다.

$(data).each(function(){
    button = $('<button>');
    button.addClass('test-button');
    button.appendTo("body");

    $('.test-button').click(function(){
        console.log('i was clicked');
    })
})

이와 같이 코드를 작성하면 .test-button 클래스가 여러 클릭 이벤트를 가져옵니다. 예를 들어, 내 데이터에는 77 줄이 있으므로 각 줄은 77 번 실행됩니다. 즉, 클래스의 클릭 이벤트를 77 번 거부합니다. 요소를 클릭하면 77 번 발생합니다.

하지만 다음과 같이 쓰면 :

$(data).each(function(){
    button = $('<button>');
    button.addClass('test-button');
    button.appendTo("body");
})

    $('.test-button').click(function(){
        console.log('i was clicked');
    })

각각 뒤에 클릭 요소를 선언합니다. 즉, 각각 77 번 실행되고 클릭 요소는 한 번만 선언됩니다. 따라서 요소를 클릭하면 한 번만 실행됩니다.


1

코드 아래에서 절대적으로 잘 작동합니다.

$(".addproduct").on('click', function(event){
    event.stopPropagation();
    event.stopImmediatePropagation();
    getRecord();
});


function getRecord(){
   $(".addproduct").each(function () {
       console.log("test");
       });

}

0

안녕하세요이 게시물 이이 문제에 직면 해 죄송합니다. 제 경우를 보여주고 싶습니다.

내 코드는 다음과 같습니다.

<button onClick="product.delete('1')" class="btn btn-danger">Delete</button>
<button onClick="product.delete('2')" class="btn btn-danger">Delete</button>
<button onClick="product.delete('3')" class="btn btn-danger">Delete</button>
<button onClick="product.delete('4')" class="btn btn-danger">Delete</button>

자바 스크립트 코드

<script>
 var product = {
     //  Define your function
     'add':(product_id)=>{
          //  Do some thing here
     },

     'delete':(product_id)=>{
         //  Do some thig here
     }
 }
</script>

0

$(document).ready(function(){

    $(".addproduct").each(function(){
          $(this).unbind().click(function(){
               console.log('div is clicked, my content => ' + $(this).html());
           });
     });
}); 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="addproduct 151">product info 1</div>
<div class="addproduct 151">product info 2</div>
<div class="addproduct 151">product info 3</div>
<div class="addproduct 151">product info 4</div>
<div class="addproduct 151">product info 5</div>


-5

이벤트는 한 번만 트리거되므로이 코드가 작동 할 수 있습니다.

    $(".addproduct,.addproduct,.addproduct,.addproduct,.addproduct").click(function(){//do     something fired 5 times});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.