เหตุการณ์คลิก jQuery ยิงหลายครั้ง


283

ฉันกำลังพยายามเขียนวิดีโอเกมโป๊กเกอร์ใน Javascript เพื่อหาพื้นฐานของเกมนี้และฉันพบปัญหาที่ jQuery click event handler ยิงหลายครั้ง

พวกมันติดอยู่กับปุ่มสำหรับวางเดิมพันและมันใช้งานได้ดีสำหรับการวางเดิมพันในมือแรกระหว่างเกม (ยิงเพียงครั้งเดียว); แต่ในการเดิมพันสำหรับมือสองก็ยิงเหตุการณ์คลิกสองครั้งในแต่ละครั้งที่มีการเดิมพันหรือเดิมพันสถานที่กดปุ่ม (เพื่อให้เป็นสองเท่าของจำนวนเงินที่ถูกต้องเป็นทางออกสำหรับแต่ละกด) โดยรวมก็เป็นไปตามรูปแบบนี้จำนวนครั้งเหตุการณ์คลิกยิงเมื่อกดปุ่มเดิมพันครั้งเดียว - ที่ithระยะเวลาของลำดับคือสำหรับการเดิมพันของithมือจากจุดเริ่มต้นของเกม: 1, 2, 4 , 7, 11, 16, 22, 29, 37, 46 ซึ่งดูเหมือนจะเป็น n (n + 1) / 2 + 1 สำหรับสิ่งที่คุ้มค่า - และฉันไม่ฉลาดพอที่จะเข้าใจสิ่งนั้นได้ฉันใช้OEIS . :)

นี่คือฟังก์ชันที่มีตัวจัดการเหตุการณ์คลิกที่ทำงาน หวังว่ามันจะง่ายต่อการเข้าใจ (แจ้งให้เราทราบหากไม่ฉันต้องการได้รับที่ดีขึ้นเช่นกัน):

/** The following function keeps track of bet buttons that are pressed, until place button is pressed to place bet. **/
function pushingBetButtons() {
    $("#money").text("Money left: $" + player.money); // displays money player has left

    $(".bet").click(function() {
        var amount = 0; // holds the amount of money the player bet on this click
        if($(this).attr("id") == "bet1") { // the player just bet $1
            amount = 1;
        } else if($(this).attr("id") == "bet5") { // etc.
            amount = 5;
        } else if($(this).attr("id") == "bet25") {
            amount = 25;
        } else if($(this).attr("id") == "bet100") {
            amount = 100;
        } else if($(this).attr("id") == "bet500") {
            amount = 500;
        } else if($(this).attr("id") == "bet1000") {
            amount = 1000;
        }
        if(player.money >= amount) { // check whether the player has this much to bet
            player.bet += amount; // add what was just bet by clicking that button to the total bet on this hand
            player.money -= amount; // and, of course, subtract it from player's current pot
            $("#money").text("Money left: $" + player.money); // then redisplay what the player has left
        } else {
            alert("You don't have $" + amount + " to bet.");
        }
    });

    $("#place").click(function() {
        if(player.bet == 0) { // player didn't bet anything on this hand
            alert("Please place a bet first.");
        } else {
            $("#card_para").css("display", "block"); // now show the cards
            $(".card").bind("click", cardClicked); // and set up the event handler for the cards
            $("#bet_buttons_para").css("display", "none"); // hide the bet buttons and place bet button
            $("#redraw").css("display", "block"); // and reshow the button for redrawing the hand
            player.bet = 0; // reset the bet for betting on the next hand
            drawNewHand(); // draw the cards
        }
    });
}

โปรดแจ้งให้เราทราบหากคุณมีความคิดเห็นหรือข้อเสนอแนะหรือหากวิธีการแก้ไขปัญหาของฉันคล้ายกับวิธีแก้ไขปัญหาอื่น ๆ ที่นี่ (ฉันได้ดูหัวข้อหัวข้อที่คล้ายกันจำนวนมากและไม่มีโชคในการหาวิธีแก้ไขปัญหา สำหรับฉัน).


var amount = parseInt(this.id.replace(/[^\d]/g,''),10);และถ้าคุณจะใช้คุณสมบัติเดียวกันขององค์ประกอบมากกว่าหนึ่งครั้งแคชคุณสมบัตินั้นอย่าค้นหามันต่อไป การค้นหามีราคาแพง
เดวิดบอกว่าคืนสถานะโมนิก้า

ขอบคุณสำหรับการตอบสนองและเคล็ดลับในการแคชคุณสมบัติ ฉันตั้ง player.money และ player.bet เป็นเงินในท้องถิ่นและวางเดิมพันในฟังก์ชั่นนั้นและจัดการสิ่งเหล่านั้นแทนและจะเปลี่ยนส่วนที่เหลือของรหัสของฉันให้ทำเช่นนั้น :) ถ้าคุณมีเวลาคุณสามารถอธิบายสิ่งที่คุณแนะนำได้ไหม การเริ่มต้นของจำนวนเงินกำลังทำ; ดูเหมือนว่าจะมีการแสดงออกปกติ แต่ฉันไม่สามารถเข้าใจได้ง่าย
Gregory Fowler

@GregoryFowler - ไม่เกี่ยวข้องกับคำถามของคุณ แต่ ... คำสั่งเปลี่ยนจาวาสคริปต์อาจคุ้มค่าที่จะดู
เคลย์ตัน

2
ฟังก์ชั่นของคุณคือวางตัวจัดการคลิกทุกครั้งที่มีการเรียกใช้ หากคุณเรียกใช้ในแต่ละรอบในรอบที่สองคุณจะมีตัวจัดการสองตัวและอื่น ๆ แต่ละจัดการจะทำงานของมันและในรอบ 100 คุณจะได้รับการแจ้งเตือน 100
Marco Faustinelli

สิ่งนี้เกิดขึ้นเพราะมีบางอย่างในรหัสของคุณคุณกำลัง rebinding ตัวจัดการเหตุการณ์โดยไม่ต้องผูกมันก่อน ดูคำถามนี้สำหรับสถานการณ์ที่คล้ายกันและคำอธิบายที่ดี
jpaugh

คำตอบ:


526

เพื่อให้แน่ใจว่าการคลิกเพียงครั้งเดียวการกระทำที่ใช้นี้

$(".bet").unbind().click(function() {
    //Stuff
});

31
ตกลงที่เป็นคุณเมื่อวานนี้ร็อบ? ;) นั่นคือสิ่งที่ฉันกำลังมองหาไม่รู้ว่าทำไมฉันไม่พบมันมาก่อน แต่มันก็ยังเป็นพรที่อำพรางเพราะฉันเรียนรู้เรื่องอื่น ๆ มากมาย
เกรกอรี่ฟาวเลอร์

1
;) ขอโทษ ฉันหมุนล้อไปรอบ ๆ สองสามวันกับคันนี้เช่นกัน ฉันยังคงค้นหาเหตุผลอย่างมีเหตุผลว่าทำไมมันถึงเกิดขึ้นในตอนแรก
Rob

6
ผู้ชายหลังจากที่หลายสิ่งหลายอย่างนี้ไม่ได้ ยกเว้นในกรณีของฉันฉันใช้เทียบเท่า: $ (". bet"). off (). on ()
MadTurki

7
ตามที่ jroi_web กล่าวไว้ด้านล่างวิธีนี้เลิกใช้แล้ว ดูคำตอบของ @ trolle สำหรับวิธีแก้ปัญหาล่าสุด
ปาสกาล

ตัวจัดการการคลิกไม่ใช่สิ่งที่ถูกโยนทิ้งแบบครั้งเดียว โดยเฉพาะอย่างยิ่งเมื่อมันใหญ่ถ้า - ถ้า - ถ้าแสดงในคำถาม คุณควรจะแนบมันและปล่อยให้มันทำงานตราบเท่าที่หน้าเว็บยังมีชีวิตอยู่
มาร์โก Faustinelli

379

.unbind()เลิกใช้แล้วและคุณควรใช้.off()วิธีการแทน เพียงโทร.off()ขวาก่อนที่คุณเรียก.on()ขวาก่อนที่คุณเรียก

สิ่งนี้จะลบตัวจัดการเหตุการณ์ทั้งหมด:

$(element).off().on('click', function() {
    // function body
});

หากต้องการลบตัวจัดการเหตุการณ์ 'คลิก' ที่ลงทะเบียนแล้วเท่านั้น:

$(element).off('click').on('click', function() {
    // function body
});

9
สิ่งนี้ควรใช้ใน jQuery เวอร์ชันใหม่เนื่องจากยกเลิกการผูกตายหรือมีชีวิตเลิกใช้แล้ว
jroi_web

ทำงานเหมือนจับใจ! ฟังก์ชั่นของฉันจะทำงานครั้งเดียวเมื่อคลิกจากนั้นสองครั้งสี่ครั้ง ... . off () ก่อน. on () แก้ปัญหานี้ได้
jumpOnCommand

146

.หนึ่ง()

ตัวเลือกที่ดีกว่าคือ.one():

ตัวจัดการดำเนินการได้มากที่สุดหนึ่งครั้งต่อองค์ประกอบต่อประเภทเหตุการณ์

$(".bet").one('click',function() {
    //Your function
});

ในกรณีที่มีหลายคลาสและแต่ละคลาสจะต้องคลิกหนึ่งครั้ง

$(".bet").on('click',function() {
    //Your function
    $(this).off('click');   //or $(this).unbind()
});

8
คำตอบที่ดีที่สุดคุณช่วยฉันจากการแฮ็คโง่นี่ดีกว่ามากเพราะถ้าคุณมีหลายonclickเหตุการณ์ในองค์ประกอบเดียวกัน แต่ในสถานที่ต่าง ๆ สิ่งนี้จะไม่ส่งผลกระทบต่อส่วนที่เหลือในขณะที่unbind()และoff()จะทำลายonclickขอบคุณอีกครั้ง
Fanckush

3
หลังจากลองใช้คำตอบทั้งหมดคำตอบนี้เป็นคำเดียวที่เหมาะกับฉัน
neversion

10
สิ่งหนึ่งที่ควรทราบหากคุณต้องการให้ฟังก์ชั่นยิงเพียงครั้งเดียวต่อคลิก แต่ยังคงใช้งานเมื่อมีการคลิกครั้งต่อไปฟังก์ชันนี้จะเริ่มทำงานเพียงครั้งเดียวสำหรับชีวิตของหน้าเว็บ ดังนั้นคำตอบของ mtl ด้วยวิธี off (). on () จะต้องมีการใช้
Derek Hewitt

1
@munchschair สามารถมีได้หลายเหตุผลสำหรับเรื่องนี้ องค์ประกอบหลายอย่างที่มีระดับเดียวกันภายในซึ่งกันและกัน หรือตัวจัดการการคลิกถูกลงทะเบียนหลายครั้งในการทำซ้ำ
Shaunak D

3
ไม่ทำงานสำหรับฉัน - ยังคงมีการคลิกหลายครั้ง - ไม่สมเหตุสมผลเนื่องจากมีองค์ประกอบปุ่มเพียงปุ่มเดียวที่มี ID และเหตุการณ์ 1 เหตุการณ์ติดอยู่เท่านั้น (เหตุการณ์คลิก) ฉันคิดว่านี่เป็นข้อผิดพลาด jQuery แต่อาจเป็นข้อผิดพลาด Bootstrap-modal-dialog
MC9000

78

หากคุณพบว่า .off () .unbind () หรือ .stopPropagation () ยังคงไม่สามารถแก้ไขปัญหาเฉพาะของคุณลองใช้.stopImmediatePropagation ()ใช้งานได้ดีในสถานการณ์เมื่อคุณต้องการเพียงแค่กิจกรรมของคุณที่จะจัดการได้โดยไม่ต้องเดือดใด ๆ และไม่มี ที่มีผลต่อการจัดกิจกรรมอื่น ๆ แล้วจะถูกจัดการ สิ่งที่ต้องการ:

$(".bet").click(function(event) {
  event.stopImmediatePropagation();
  //Do Stuff
});

หลอกลวง!


สิ่งนี้ช่วยฉันได้มากเท่ากับการหยุดกิจกรรมไม่ให้ยิงสองครั้ง แต่ก็ทำให้ฉันยุ่งมาก ปรากฎว่าถ้าคุณใช้ event.stopImmediatePropagation () ในตัวจัดการเหตุการณ์ที่แนบกับฟิลด์ jQuery UI Dialog ดังนั้นด้วยเหตุผลบางประการกล่องโต้ตอบไม่สามารถอ้างอิงอินสแตนซ์ใหม่ล่าสุดของตัวแปรโกลบอลได้และใช้เวอร์ชันของตัวแปรทั่วโลกแทน ก่อนที่จะมีการแสดงผล jQuery UI การโต้ตอบ ตัวอย่างเช่นถ้าตัวแปรโกลบอลของคุณถูกประกาศ แต่ไม่ได้เริ่มต้นในขณะที่การเรนเดอร์ UI ของ jQuery UI มันจะแสดงเป็นตัวจัดการเหตุการณ์ jQuery UI Dialog ที่ไม่มีการกำหนด
UkraineTrain

1
หรือถ้าคุณกำหนดตัวแปรโกลบอลให้กับค่า 16 ก่อนที่จะเรนเดอร์ jQuery UI Dialog ซึ่งต่อมาเปลี่ยนเป็น 55 แล้ว 16 จะปรากฏขึ้นสำหรับตัวแปรโกลบอลนั้นใน jQuery UI Dialog event handler แม้ว่าในเวลานั้น ไม่ใช่ 16 อีกต่อไปดูเหมือนว่า jQuery UI bug ที่ผู้คนควรระวัง
UkraineTrain

สำหรับสถานการณ์ที่เฉพาะเจาะจงซึ่งยากที่จะอธิบาย มันทำงานได้ตรงตามที่คุณกล่าวว่า "การทำงานโดยไม่ต้องมีผลกระทบต่อการจัดกิจกรรมอื่น ๆ" ขอบคุณ! :)
Toms Bugna

ทำงานได้ดีอย่างสมบูรณ์สำหรับฉัน ขอบคุณ!
Somnath Pawar

18

หากคุณกำลังเรียกฟังก์ชั่นนั้นใน "คลิก" แต่ละครั้งมันก็เป็น เพิ่มตัวจัดการอีกคู่หนึ่งในการโทรแต่ละครั้ง

การเพิ่มตัวจัดการด้วย jQuery ไม่เหมือนกับการตั้งค่าของแอตทริบิวต์ "onclick" หนึ่งสามารถเพิ่มตัวจัดการได้มากเท่าที่ต้องการ


4
คำตอบของคุณทำให้ฉันไปในทิศทางที่ถูกต้องและฉันเรียนรู้มากมาย แต่ไม่เพียงพอที่จะแก้ปัญหาของฉันโดยใช้ jQuery :) ฉันลองใช้เปิด / ปิดสด (และผู้รับมอบสิทธิ์) / ตายและหนึ่งและจากนั้น addEventListener / removeEventListener แต่สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือชะลอการเติบโตแบบทวีคูณของตัวจัดการ ในที่สุดฉันก็แก้ปัญหาของฉันกับ onclick ในขณะนี้ แต่ผมก็ยังได้เรียนรู้มากเกี่ยวกับรูปแบบของเหตุการณ์ Javascript เช่นการจับภาพ / ฟองจากคำตอบของคุณดังนั้นฉันขอบคุณมัน ขอบคุณ. :)
เกรกอรี่ฟาวเลอร์

ขอบคุณมากฉันไม่สามารถเชื่อว่าฉันไม่รู้สิ่งนี้!
Lenny

12

กิจกรรมจะเริ่มทำงานหลายครั้งเมื่อมีการลงทะเบียนหลายครั้ง (แม้ว่าจะใช้งานกับเครื่องจัดการเดียวกัน)

เช่น $("ctrl").on('click', somefunction)หากมีการประมวลโค้ดส่วนนี้ทุกครั้งที่มีการรีเฟรชหน้าบางส่วนเหตุการณ์จะถูกลงทะเบียนทุกครั้งเช่นกัน ดังนั้นแม้ว่าจะมีการคลิก ctrl เพียงครั้งเดียวมันอาจเรียกใช้ "somefunction" หลายครั้ง - จำนวนครั้งที่เรียกใช้จะขึ้นอยู่กับจำนวนครั้งที่ลงทะเบียน

นี้เป็นจริงสำหรับเหตุการณ์ใด ๆ ที่จดทะเบียนในจาวาสคริปต์

สารละลาย:

ให้แน่ใจว่าได้โทร "เปิด" เพียงครั้งเดียว

และด้วยเหตุผลบางอย่างถ้าคุณไม่สามารถควบคุมสถาปัตยกรรมให้ทำดังนี้

$("ctrl").off('click'); $("ctrl").on('click', somefunction);


คุณต้องการพูดอะไร
Somnath Kharat

แต่นั่นไม่ได้อธิบายสิ่งที่เกิดขึ้นในกรณีนี้ ปุ่มนี้มี ID ที่ไม่ซ้ำใครและมีเพียง 1 เหตุการณ์เท่านั้น (มันไม่ได้ถูกเรียกหลายครั้งเพราะมันสามารถคลิกได้เพียงครั้งเดียวเท่านั้น) นี่เป็นจุดบกพร่องที่ปรากฏเฉพาะในกล่องโต้ตอบ jQuery (และง่ายมากที่จะทำซ้ำ)
MC9000

2
เราไม่ทราบว่าฟังก์ชั่น "pushingBetButtons" ถูกเรียกเพียงครั้งเดียวหรือหลายครั้ง .. ถ้ามันถูกเรียกมากกว่าหนึ่งครั้งกว่าเหตุการณ์ที่มีการลงทะเบียนหลายครั้งและด้วยเหตุนี้มันก็จะยิง multipletimes .. ถ้าปุ่มถูกคลิกเพียงครั้งเดียว .
Kalpesh Popat

4

ฉันมีปัญหาเนื่องจากมาร์กอัป

HTML:

<div class="myclass">
 <div class="inner">

  <div class="myclass">
   <a href="#">Click Me</a>
  </div>

 </div>
</div>

jQuery

$('.myclass').on('click', 'a', function(event) { ... } );

คุณสังเกตเห็นว่าฉันมีคลาส 'myclass' สองครั้งใน html ดังนั้นมันจึงเรียกคลิกสำหรับแต่ละอินสแตนซ์ของ div


3

ตัวเลือกที่ดีกว่าจะใช้ปิด

<script>
function flash() {
  $("div").show().fadeOut("slow");
}
$("#bind").click(function() {
  $( "body" )
    .on("click", "#theone", flash)
    .find("#theone")
      .text("Can Click!");
});
$("#unbind").click(function() {
  $("body")
    .off("click", "#theone", flash)
    .find("#theone")
      .text("Does nothing...");
});
</script>

3

ทุกสิ่งเกี่ยวกับ. on () และ. one () นั้นยอดเยี่ยมและ jquery นั้นยอดเยี่ยม

แต่บางครั้งคุณต้องการให้ชัดเจนยิ่งขึ้นว่าผู้ใช้ไม่ได้รับอนุญาตให้คลิกและในกรณีเหล่านั้นคุณสามารถทำสิ่งนี้:

function funName(){
    $("#orderButton").prop("disabled", true);
    //  do a bunch of stuff
    // and now that you're all done
    setTimeout(function(){
        $("#orderButton").prop("disabled",false);
        $("#orderButton").blur();
    }, 3000);
}

และปุ่มของคุณจะมีลักษณะดังนี้:

<button onclick='funName()'>Click here</button>

1
นั่นจะช่วยแก้ไขกรณีของผู้ใช้จริง ๆ การคลิกหลายครั้ง แต่ ... ฉันได้รับเหตุการณ์การคลิกหลายครั้งด้วยการประทับเวลาเดียวกัน ไม่มีทางที่ฉันจะสามารถคลิกได้ 3 ครั้งในเสี้ยววินาทีเดียวกันแม้ว่าฉันจะเร็วมากๆ (และไม่รู้ว่ากี่ครั้งที่ฉันกดปุ่ม)
jpaugh

2

มันเกิดขึ้นเนื่องจากเหตุการณ์เฉพาะผูกพันหลายครั้งกับองค์ประกอบเดียวกัน

ทางออกสำหรับฉันคือ:

ฆ่าเหตุการณ์ทั้งหมดที่แนบมาโดยใช้ .die()วิธีการ

จากนั้นแนบผู้ฟังวิธีการของคุณ

ดังนั้น

$('.arrow').click(function() {
// FUNCTION BODY HERE
}

ควรจะเป็น:

$('.arrow').die("click")
$('.arrow').click(function() {
// FUNCTION BODY HERE
}

2

เราจะต้องstopPropagation()เพื่อหลีกเลี่ยงการคลิกทริกเกอร์เหตุการณ์หลายครั้งเกินไป

$(this).find('#cameraImageView').on('click', function(evt) {
   evt.stopPropagation();
   console.log("Camera click event.");
});

มันป้องกันเหตุการณ์จากการทำให้เดือดดาลต้นไม้ DOM ป้องกันไม่ให้ตัวจัดการผู้ปกครองใด ๆ จากการได้รับแจ้งของเหตุการณ์ วิธีนี้ไม่ยอมรับข้อโต้แย้งใด ๆ

เราสามารถใช้ event.isPropagationStopped()เพื่อตรวจสอบว่าวิธีนี้เคยถูกเรียกว่า (บนวัตถุเหตุการณ์นั้น)

วิธีนี้ใช้ได้กับเหตุการณ์ที่กำหนดเองที่ถูกทริกเกอร์ด้วยทริกเกอร์ () เช่นกันโปรดทราบว่านี่จะไม่ป้องกันตัวจัดการอื่น ๆ ในองค์ประกอบเดียวกันไม่ให้ทำงาน


2

ในกรณีของฉันฉันใช้ 'ผู้รับมอบสิทธิ์' ดังนั้นจึงไม่มีวิธีแก้ไขปัญหาเหล่านี้ทำงาน ฉันเชื่อว่าเป็นปุ่มที่ปรากฏหลายครั้งผ่านการโทร ajax ที่ทำให้เกิดปัญหาการคลิกหลายครั้ง โซลูชันใช้การหมดเวลาดังนั้นจึงมีการจดจำการคลิกครั้งสุดท้ายเท่านั้น:

var t;
$('body').delegate( '.mybutton', 'click', function(){
    // clear the timeout
    clearTimeout(t);
    // Delay the actionable script by 500ms
    t = setTimeout( function(){
        // do something here
    },500)
})



1

. เพียงหนึ่งครั้งเท่านั้นที่อายุการใช้งานของหน้ากระดาษ

ดังนั้นในกรณีที่คุณต้องการตรวจสอบความถูกต้องนี่ไม่ใช่ทางออกที่ถูกต้องเพราะเมื่อคุณไม่ออกจากหน้าหลังจากการตรวจสอบความถูกต้องคุณจะไม่กลับมา ดีกว่าที่จะใช้

$(".bet").on('click',function() 
{ //validation 
   if (validated) { 
      $(".bet").off('click'); //prevent to fire again when we are not yet off the page
      //go somewhere
    }
});

1

เมื่อฉันจัดการกับปัญหานี้ฉันมักจะใช้:

$(".bet").unbind("click").bind("click", function (e) {
  // code goes here
}

วิธีนี้ฉันจะผูกและผูกในจังหวะเดียวกัน


0

https://jsfiddle.net/0vgchj9n/1/

เพื่อให้แน่ใจว่าเหตุการณ์จะเกิดขึ้นเพียงครั้งเดียวคุณสามารถใช้ Jquery .one () JQuery one ทำให้แน่ใจได้ว่าตัวจัดการเหตุการณ์ของคุณเรียกเพียงครั้งเดียว นอกจากนี้คุณสามารถสมัครใช้งานตัวจัดการเหตุการณ์ด้วยการอนุญาตให้คลิกเพิ่มเติมเมื่อคุณเสร็จสิ้นกระบวนการประมวลผลการคลิกปัจจุบัน

<div id="testDiv">
  <button class="testClass">Test Button</button>
</div>

...

var subscribeClickEvent = function() {$("#testDiv").one("click", ".testClass", clickHandler);};

function clickHandler() {
  //... perform the tasks  
  alert("you clicked the button");
  //... subscribe the click handler again when the processing of current click operation is complete  
  subscribeClickEvent();
}

subscribeClickEvent();


0

ในกรณีของฉันเหตุการณ์ onclick ถูกยิงหลายครั้งเพราะฉันได้ทำการจัดการเหตุการณ์ทั่วไปเมื่อเทียบกับ

  `$('div').on("click", 'a[data-toggle="tab"]',function () {
        console.log("dynamic bootstrap tab clicked");
        var href = $(this).attr('href');
        window.location.hash = href;
   });`

เปลี่ยนไปเป็น

    `$('div#mainData').on("click", 'a[data-toggle="tab"]',function () {
        console.log("dynamic bootstrap tab clicked");
        var href = $(this).attr('href');
        window.location.hash = href;
    });`

และยังต้องสร้างตัวจัดการแยกต่างหากสำหรับการคลิกแบบคงที่และแบบไดนามิกสำหรับการคลิกแท็บแบบคงที่

    `$('a[data-toggle="tab"]').on("click",function () {
        console.log("static bootstrap tab clicked");
        var href = $(this).attr('href');
        window.location.hash = href;
    });`

0

ในกรณีของฉันฉันได้โหลด*.jsไฟล์เดียวกันบนหน้าสองครั้งใน<script>แท็กดังนั้นไฟล์ทั้งสองติดกับตัวจัดการเหตุการณ์กับองค์ประกอบ ฉันลบการประกาศที่ซ้ำกันและที่แก้ไขปัญหา


0

อีกวิธีที่ฉันพบคือถ้าคุณมีหลายคลาสและจัดการกับปุ่มตัวเลือกในขณะที่คลิกที่ป้ายกำกับ

$('.btn').on('click', function(e) {
    e.preventDefault();

    // Hack - Stop Double click on Radio Buttons
    if (e.target.tagName != 'INPUT') {
        // Not a input, check to see if we have a radio
        $(this).find('input').attr('checked', 'checked').change();
    }
});

0

ฉันมีปัญหานี้ด้วยลิงก์ที่สร้างขึ้นแบบไดนามิก:

$(document).on('click', '#mylink', function({...do stuff...});

ฉันพบว่าการแทนที่documentพร้อม'body'แก้ไขปัญหาสำหรับฉัน:

$('body').on('click', '#mylink', function({...do stuff...});


0

Unbind () ใช้งานได้ แต่อาจทำให้เกิดปัญหาอื่นในอนาคต ตัวจัดการทริกเกอร์หลายครั้งเมื่ออยู่ภายในตัวจัดการอื่นดังนั้นให้จัดการกับตัวนอกและถ้าคุณต้องการค่าของตัวจัดการที่ซ้อนกันให้กำหนดให้กับตัวแปรทั่วโลกที่จะสามารถเข้าถึงตัวจัดการของคุณได้



-1

รหัสด้านล่างใช้สำหรับฉันในแอปพลิเคชันการแชทของฉันเพื่อจัดการการคลิกเมาส์หลายครั้งเพื่อกระตุ้นกิจกรรมมากกว่าหนึ่งครั้ง if (!e.originalEvent.detail || e.originalEvent.detail == 1) { // Your code logic }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.