เหตุการณ์ที่มีผลผูกพันกับองค์ประกอบที่สร้างขึ้นแบบไดนามิก?


1677

ฉันมีบิตของรหัสที่ฉันกำลังบ่วงผ่านทุกช่องเลือกบนหน้าเว็บและผูกพัน.hoverเหตุการณ์ที่พวกเขาทำบิตของ twiddling mouse on/offที่มีความกว้างของพวกเขาใน

สิ่งนี้เกิดขึ้นในหน้าพร้อมและใช้งานได้ดี

ปัญหาที่ฉันมีคือกล่องที่ฉันเลือกผ่าน Ajax หรือ DOM หลังจากวนลูปเริ่มต้นจะไม่มีเหตุการณ์ผูกไว้

ฉันได้พบปลั๊กอินนี้ ( jQuery Live Query Plugin ) แต่ก่อนที่ฉันจะเพิ่มอีก 5k ลงในหน้าของฉันด้วยปลั๊กอินฉันต้องการดูว่าใครรู้วิธีการทำเช่นนี้กับ jQuery โดยตรงหรือโดยตัวเลือกอื่น

คำตอบ:


2249

ตั้งแต่ jQuery 1.7คุณควรใช้jQuery.fn.on:

$(staticAncestors).on(eventName, dynamicChild, function() {});

ก่อนหน้านี้แนวทางที่แนะนำคือการใช้live():

$(selector).live( eventName, function(){} );

อย่างไรก็ตามlive()ถูกคัดค้านใน 1.7 เพื่อสนับสนุนon()และถูกลบอย่างสมบูรณ์ใน 1.9 live()ลายเซ็น:

$(selector).live( eventName, function(){} );

... สามารถแทนที่ด้วยon()ลายเซ็นต่อไปนี้:

$(document).on( eventName, selector, function(){} );

ตัวอย่างเช่นหากหน้าของคุณสร้างองค์ประกอบแบบไดนามิกด้วยชื่อคลาสdosomethingคุณจะผูกเหตุการณ์กับผู้ปกครองที่มีอยู่แล้ว (นี่คือปัญหาของที่นี่คุณต้องมีสิ่งที่มีอยู่เพื่อผูกไม่ผูกกับ เนื้อหาแบบไดนามิก) นี้สามารถ (และตัวเลือกที่ง่ายที่สุด) documentเป็น แม้ว่าหมีในใจอาจจะไม่ได้เป็นตัวเลือกที่มีประสิทธิภาพมากที่สุดdocument

$(document).on('mouseover mouseout', '.dosomething', function(){
    // what you want to happen when mouseover and mouseout 
    // occurs on elements that match '.dosomething'
});

ผู้ปกครองใด ๆ ที่มีอยู่ในเวลาที่เหตุการณ์ถูกผูกไว้ก็ใช้ได้ ตัวอย่างเช่น

$('.buttons').on('click', 'button', function(){
    // do something here
});

จะนำไปใช้กับ

<div class="buttons">
    <!-- <button>s that are generated dynamically and added here -->
</div>

7
โปรดทราบว่าวิธีการถ่ายทอดสดใช้งานได้เฉพาะกับเหตุการณ์บางอย่างเท่านั้นและไม่ใช่วิธีอื่น ๆ เช่น loadmetadata (ดูส่วนคำเตือนในเอกสารประกอบ)
Sam Dutton

48
เรียนรู้เพิ่มเติมเกี่ยวกับคณะผู้แทนเหตุการณ์ที่นี่: learn.jquery.com/events/event-delegation
เฟลิกซ์คลิง

9
วิธีใดบ้างที่จะทำให้สำเร็จด้วย javascript / vanilla js
Ram Patra

15
@Ramswaroop ทุกสิ่งที่คุณสามารถทำได้ใน jQuery สามารถทำได้โดยไม่ต้อง jQuery นี่เป็นตัวอย่างที่ดีของการมอบหมายกิจกรรมโดยไม่มี jQuery
เดฟ

5
@ เดฟฉันสงสัยว่าทำไมคำตอบที่คุณชี้ไม่ปรากฏอยู่ที่นี่ Eli ได้ขอวิธีการแก้ปัญหาอย่างชัดเจนโดยไม่มีปลั๊กอินหากเป็นไปได้
Ram Patra

377

jQuery.fn.onมีคำอธิบายที่ดีในเอกสารคือ

ในระยะสั้น:

ตัวจัดการเหตุการณ์ถูกผูกไว้กับองค์ประกอบที่เลือกในปัจจุบันเท่านั้น .on()พวกเขาจะต้องอยู่บนหน้าเว็บได้ตลอดเวลารหัสของคุณจะทำให้การเรียกร้องให้

ดังนั้นในตัวอย่างต่อไปนี้#dataTable tbody trจะต้องมีอยู่ก่อนที่จะสร้างรหัส

$("#dataTable tbody tr").on("click", function(event){
    console.log($(this).text());
});

หากมีการแทรก HTML ใหม่ลงในหน้าก็ควรใช้เหตุการณ์ที่ได้รับมอบหมายเพื่อแนบตัวจัดการเหตุการณ์ดังที่อธิบายไว้ถัดไป

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

$("#dataTable tbody").on("click", "tr", function(event){
    console.log($(this).text());
});

นอกเหนือจากความสามารถในการจัดการเหตุการณ์ในองค์ประกอบที่สืบทอดซึ่งยังไม่ได้สร้างความได้เปรียบอีกอย่างของกิจกรรมที่มอบหมายคือศักยภาพของพวกเขาสำหรับค่าใช้จ่ายที่ต่ำกว่ามากเมื่อต้องตรวจสอบองค์ประกอบจำนวนมาก บนตารางข้อมูลที่มี 1,000 แถวในtbodyนั้นตัวอย่างรหัสแรกแนบตัวจัดการกับ 1,000 องค์ประกอบ

วิธีการมอบหมายกิจกรรม (ตัวอย่างรหัสที่สอง) แนบตัวจัดการเหตุการณ์กับองค์ประกอบเดียวเท่านั้นtbodyและเหตุการณ์จะต้องเพิ่มขึ้นหนึ่งระดับเท่านั้น (จากการคลิกtrไปtbody)

หมายเหตุ:การจัดกิจกรรมรับมอบสิทธิ์ไม่ทำงานสำหรับSVG


11
นี่จะเป็นคำตอบที่ดีกว่าเพราะจะเร็วกว่าที่จะมอบหมายจากตารางที่เฉพาะเจาะจงมากกว่าที่จะมาจากเอกสาร (พื้นที่การค้นหาจะเล็กกว่า)
msanjay

5
@msanjay: แม้ว่าการกำหนดเป้าหมายการค้นหาใกล้กับองค์ประกอบนั้นเป็นสิ่งที่ต้องการ แต่ความแตกต่างของการค้นหา / ความเร็วนั้นน้อยมากในทางปฏิบัติ คุณจะต้องคลิก 50,000 ครั้งต่อวินาทีเพื่อสังเกตอะไร :)
Gone Coding

2
วิธีการนี้สามารถนำไปใช้กับการจัดการช่องทำเครื่องหมายคลิกในแถวโดยเปลี่ยนtrเป็นตัวเลือกที่เหมาะสมเช่น'input[type=checkbox]'และวิธีนี้จะถูกจัดการโดยอัตโนมัติสำหรับแถวที่แทรกใหม่
JoeBrockhaus

1
ขอบคุณ! นี่เป็นการแก้ปัญหาของฉัน คำสั่งง่ายๆนี้เป็นปัญหาของฉัน "ตัวจัดการเหตุการณ์ถูกผูกไว้กับองค์ประกอบที่เลือกในปัจจุบันเท่านั้นพวกเขาจะต้องมีอยู่ในหน้าในเวลาที่รหัสของคุณโทรไปที่ ... "
Dennis Fazekas

216

นี่เป็นโซลูชันJavaScript ที่ไม่มีไลบรารีหรือปลั๊กอิน:

document.addEventListener('click', function (e) {
    if (hasClass(e.target, 'bu')) {
        // .bu clicked
        // Do your thing
    } else if (hasClass(e.target, 'test')) {
        // .test clicked
        // Do your other thing
    }
}, false);

ที่hasClassเป็น

function hasClass(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Live demo

เครดิตไปที่ Dave และ Sime Vidas

การใช้ JS ที่ทันสมัยกว่าhasClassสามารถนำไปใช้เป็น:

function hasClass(elem, className) {
    return elem.classList.contains(className);
}


6
คุณสามารถใช้Element.classListแทนการแยกได้
Eugen Konkov

2
@EugenKonkov Element.classListไม่รองรับเบราว์เซอร์รุ่นเก่า ตัวอย่างเช่น IE <9.
Ram Patra

2
บทความดี ๆ เกี่ยวกับวิธีทำให้สิ่งต่าง ๆ เสร็จสิ้นโดยใช้สคริปต์วานิลลาแทนที่จะเป็น jQuery - toddmotto.com/ ..
Ram Patra

2
แล้วฟองล่ะจะเป็นยังไง? จะเกิดอะไรขึ้นถ้าเหตุการณ์คลิกเกิดขึ้นกับองค์ประกอบที่คุณสนใจ
Andreas Trantidis

73

คุณสามารถเพิ่มกิจกรรมไปยังวัตถุเมื่อคุณสร้าง หากคุณกำลังเพิ่มเหตุการณ์เดียวกันในหลาย ๆ วัตถุในเวลาที่ต่างกันการสร้างฟังก์ชั่นที่ตั้งชื่ออาจเป็นวิธีที่จะไป

var mouseOverHandler = function() {
    // Do stuff
};
var mouseOutHandler = function () {
    // Do stuff
};

$(function() {
    // On the document load, apply to existing elements
    $('select').hover(mouseOverHandler, mouseOutHandler);
});

// This next part would be in the callback from your Ajax call
$("<select></select>")
    .append( /* Your <option>s */ )
    .hover(mouseOverHandler, mouseOutHandler)
    .appendTo( /* Wherever you need the select box */ )
;

49

คุณสามารถตัดการเชื่อมโยงเหตุการณ์ของคุณเข้าสู่ฟังก์ชันและเรียกใช้สองครั้ง: ครั้งเดียวบนเอกสารพร้อมและอีกครั้งหลังจากเหตุการณ์ที่เพิ่มองค์ประกอบ DOM ใหม่ หากคุณทำเช่นนั้นคุณจะต้องหลีกเลี่ยงการผูกเหตุการณ์เดียวกันสองครั้งในองค์ประกอบที่มีอยู่ดังนั้นคุณจะต้องยกเลิกการผูกกิจกรรมที่มีอยู่หรือ (ดีกว่า) ผูกเฉพาะกับองค์ประกอบ DOM ที่สร้างขึ้นใหม่ รหัสจะมีลักษณะดังนี้:

function addCallbacks(eles){
    eles.hover(function(){alert("gotcha!")});
}

$(document).ready(function(){
    addCallbacks($(".myEles"))
});

// ... add elements ...
addCallbacks($(".myNewElements"))

2
โพสต์นี้ช่วยให้ฉันเข้าใจปัญหาที่ฉันกำลังโหลดแบบฟอร์มเดียวกันและได้รับ 1,2,4,8,16 ... การส่ง แทนที่จะใช้. live () ฉันเพิ่งใช้. ผูก () ในการโทรกลับ. load () ของฉัน แก้ไขปัญหา. ขอบคุณ!
โทมัส McCabe

42

พยายามที่จะใช้.live()แทน.bind(); .live()จะผูก.hoverจะทำเครื่องหมายในช่องของคุณหลังจากที่อาแจ็กซ์รันคำขอ


32
วิธีการlive()ถูกเลิกใช้ในรุ่น 1.7 เพื่อสนับสนุนonและลบในเวอร์ชัน 1.9
chridam

27

การเชื่อมโยงเหตุการณ์บนองค์ประกอบที่สร้างขึ้นแบบไดนามิก

องค์ประกอบเดียว:

$(document.body).on('click','.element', function(e) {  });

องค์ประกอบย่อย:

 $(document.body).on('click','.element *', function(e) {  });

*ขอให้สังเกตที่เพิ่ม เหตุการณ์จะถูกเรียกใช้สำหรับเด็กทุกคนขององค์ประกอบนั้น

ฉันสังเกตเห็นว่า:

$(document.body).on('click','.#element_id > element', function(e) {  });

มันไม่ทำงานอีกต่อไป แต่มันเคยทำงานมาก่อน ฉันใช้ jQuery จาก Google CDNแต่ฉันไม่รู้ว่าพวกเขาเปลี่ยนหรือไม่


Yeap และพวกเขาไม่ได้พูด (document.body) บอกว่าบรรพบุรุษของมันซึ่งอาจจะเป็นอะไรที่สวยมาก
MadeInDreams

25

คุณสามารถใช้วิธี live () เพื่อผูกองค์ประกอบ (แม้กระทั่งสิ่งที่สร้างขึ้นใหม่) กับเหตุการณ์และตัวจัดการเช่นเหตุการณ์ onclick

นี่คือตัวอย่างโค้ดที่ฉันเขียนซึ่งคุณสามารถดูว่าวิธี live () ผูกองค์ประกอบที่เลือกไว้ได้อย่างไรแม้กระทั่งสิ่งที่สร้างขึ้นใหม่กับเหตุการณ์:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Untitled Document</title>
    </head>

    <body>
        <script src="http://code.jquery.com/jquery-latest.js"></script>
        <script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.16/jquery-ui.min.js"></script>

        <input type="button" id="theButton" value="Click" />
        <script type="text/javascript">
            $(document).ready(function()
                {
                    $('.FOO').live("click", function (){alert("It Works!")});
                    var $dialog = $('<div></div>').html('<div id="container"><input type ="button" id="CUSTOM" value="click"/>This dialog will show every time!</div>').dialog({
                                                                                                         autoOpen: false,
                                                                                                         tite: 'Basic Dialog'
                                                                                                     });
                    $('#theButton').click(function()
                    {
                        $dialog.dialog('open');
                        return('false');
                    });
                    $('#CUSTOM').click(function(){
                        //$('#container').append('<input type="button" value="clickmee" class="FOO" /></br>');
                        var button = document.createElement("input");
                        button.setAttribute('class','FOO');
                        button.setAttribute('type','button');
                        button.setAttribute('value','CLICKMEE');
                        $('#container').append(button);
                    });
                    /* $('#FOO').click(function(){
                                                     alert("It Works!");
                                                 }); */
            });
        </script>
    </body>
</html>

22

ฉันชอบการใช้ตัวเลือกและฉันก็ใช้มันกับเอกสาร

สิ่งนี้จะผูกตัวเองบนเอกสารและจะสามารถใช้ได้กับองค์ประกอบที่จะแสดงผลหลังจากโหลดหน้าเว็บ

ตัวอย่างเช่น:

$(document).on("click", 'selector', function() {
    // Your code here
});

2
ตัวเลือกไม่ควรอยู่ในเครื่องหมาย $ ดังนั้นรูปแบบที่ถูกต้องจะเป็น $ (document) .on ("คลิก", ​​"selector", function () {// รหัสของคุณที่นี่});
autopilot

1
นอกจากนี้ยังไม่มีจุดหมายที่จะห่อวัตถุ jQuery รอบ ๆselectorตัวแปรเมื่อมันจะต้องมีสตริงหรือวัตถุองค์ประกอบซึ่งคุณสามารถส่งโดยตรงไปยังอาร์กิวเมนต์ของon()
Rory McCrossan

20

อีกวิธีหนึ่งคือการเพิ่มฟังเมื่อสร้างองค์ประกอบ แทนที่จะใส่ผู้ฟังไว้ในร่างกายคุณวางผู้ฟังไว้ในองค์ประกอบในช่วงเวลาที่คุณสร้างมันขึ้นมา

var myElement = $('<button/>', {
    text: 'Go to Google!'
});

myElement.bind( 'click', goToGoogle);
myElement.append('body');


function goToGoogle(event){
    window.location.replace("http://www.google.com");
}

รหัสของคุณมีความผิดพลาด 1: ต้องmyElement.append('body'); myElement.appendTo('body');ในทางตรงกันข้ามหากไม่จำเป็นต้องใช้ตัวแปรเพิ่มเติมอีกต่อไปmyElementมันจะง่ายขึ้นและสั้นลงด้วยวิธีนี้:$('body').append($('<button/>', { text: 'Go to Google!' }).bind( 'click', goToGoogle));
ddlab


16

จดคลาส "MAIN" ที่มีองค์ประกอบอยู่ตัวอย่างเช่น

<div class="container">
     <ul class="select">
         <li> First</li>
         <li>Second</li>
    </ul>
</div>

ในสถานการณ์ข้างต้นวัตถุหลักที่ jQuery จะรับชมคือ "คอนเทนเนอร์"

จากนั้นคุณโดยทั่วไปจะมีชื่อองค์ประกอบภายใต้ภาชนะเช่นul, liและselect:

$(document).ready(function(e) {
    $('.container').on( 'click',".select", function(e) {
        alert("CLICKED");
    });
 });

14

คุณสามารถใช้

$('.buttons').on('click', 'button', function(){
    // your magic goes here
});

หรือ

$('.buttons').delegate('button', 'click', function() {
    // your magic goes here
});

ทั้งสองวิธีนี้มีความเท่าเทียมกัน แต่มีลำดับพารามิเตอร์ต่างกัน

ดู: jQuery Delegate Event


2
delegate()เลิกใช้แล้ว อย่าใช้มัน
Rory McCrossan

14

jQuery(html, attributes)คุณสามารถแนบเหตุการณ์ที่องค์ประกอบเมื่อสร้างแบบไดนามิกโดยใช้

ในฐานะของ jQuery 1.8วิธีการอินสแตนซ์ jQuery ใด ๆ (วิธีการjQuery.fn) สามารถใช้เป็นคุณสมบัติของวัตถุที่ส่งผ่านไปยังพารามิเตอร์ที่สอง:

function handleDynamicElementEvent(event) {
  console.log(event.type, this.value)
}
// create and attach event to dynamic element
jQuery("<select>", {
    html: $.map(Array(3), function(_, index) {
      return new Option(index, index)
    }),
    on: {
      change: handleDynamicElementEvent
    }
  })
  .appendTo("body");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>


14

นี้จะกระทำโดยคณะผู้แทนเหตุการณ์ เหตุการณ์จะผูกกับอิลิเมนต์ wrapper-class แต่จะถูกมอบหมายให้กับอิลิเมนต์ selector-class นี่คือวิธีการทำงาน

$('.wrapper-class').on("click", '.selector-class', function() {
    // Your code here
});

บันทึก:

องค์ประกอบ wrapper ระดับสามารถเป็นอะไรก็ได้ เอกสารร่างกายหรือเสื้อคลุมของคุณ Wrapper ควรมีอยู่แล้ว อย่างไรก็ตามselectorไม่จำเป็นต้องแสดงเวลาโหลดหน้าเว็บ มันอาจจะมาในภายหลังและเหตุการณ์จะผูกบนโดยไม่ต้องล้มเหลวselector


11

นี่คือสาเหตุที่องค์ประกอบที่สร้างขึ้นแบบไดนามิกไม่ตอบสนองต่อการคลิก:

var body = $("body");
var btns = $("button");
var btnB = $("<button>B</button>");
// `<button>B</button>` is not yet in the document.
// Thus, `$("button")` gives `[<button>A</button>]`.
// Only `<button>A</button>` gets a click listener.
btns.on("click", function () {
  console.log(this);
});
// Too late for `<button>B</button>`...
body.append(btnB);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

คุณต้องรับฟังการคลิกทั้งหมดและตรวจสอบองค์ประกอบต้นทาง:

var body = $("body");
var btnB = $("<button>B</button>");
var btnC = $("<button>C</button>");
// Listen to all clicks and
// check if the source element
// is a `<button></button>`.
body.on("click", function (ev) {
  if ($(ev.target).is("button")) {
    console.log(ev.target);
  }
});
// Now you can add any number
// of `<button></button>`.
body.append(btnB);
body.append(btnC);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>

สิ่งนี้เรียกว่า "การมอบหมายกิจกรรม" ข่าวดีมันเป็นคุณสมบัติในตัวใน jQuery :-)

var i = 11;
var body = $("body");
body.on("click", "button", function () {
  var letter = (i++).toString(36).toUpperCase();
  body.append($("<button>" + letter + "</button>"));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button>A</button>


10

p arentใด ๆที่มีอยู่ในเวลาที่เหตุการณ์ถูกผูกไว้และถ้าหน้าของคุณถูกสร้างองค์ประกอบด้วยปุ่มชื่อคลาสคุณจะผูกเหตุการณ์กับผู้ปกครองที่มีอยู่แล้ว

$(document).ready(function(){
  //Particular Parent chield click
  $(".buttons").on("click","button",function(){
    alert("Clicked");
  });  
  
  //Dynamic event bind on button class  
  $(document).on("click",".button",function(){
    alert("Dymamic Clicked");
  });
  $("input").addClass("button");  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="buttons">
  <input type="button" value="1">
  <button>2</button>
  <input type="text">
  <button>3</button>  
  <input type="button" value="5">  
  </div>
<button>6</button>


7

ผูกเหตุการณ์กับผู้ปกครองที่มีอยู่แล้ว:

$(document).on("click", "selector", function() {
    // Your code here
});

5

ใช้.on()วิธีการของ jQuery http://api.jquery.com/on/เพื่อแนบตัวจัดการเหตุการณ์เข้ากับองค์ประกอบสด

เช่นเดียวกับ.live()วิธีเวอร์ชัน 1.9 จะถูกลบออก


3

ฉันชอบที่จะให้ผู้ฟังเหตุการณ์ปรับใช้ในฟังก์ชั่นแบบแยกส่วนแทนที่จะเขียนสคริปต์documentผู้ฟังเหตุการณ์ระดับ ดังนั้นฉันชอบด้านล่าง หมายเหตุคุณไม่สามารถสมัครสมาชิกองค์ประกอบที่มี listener เหตุการณ์เดียวกันได้ดังนั้นไม่ต้องกังวลกับการแนบ listener มากกว่าหนึ่งครั้ง - มีแท่งเดียวเท่านั้น

var iterations = 4;
var button;
var body = document.querySelector("body");

for (var i = 0; i < iterations; i++) {
    button = document.createElement("button");
    button.classList.add("my-button");
    button.appendChild(document.createTextNode(i));
    button.addEventListener("click", myButtonWasClicked);
    body.appendChild(button);
}

function myButtonWasClicked(e) {
    console.log(e.target); //access to this specific button
}


ฉันชอบการนำไปใช้นี้ ฉันแค่ต้องโทรกลับ
วิลเลียม

3

อีกโซลูชันที่ยืดหยุ่นในการสร้างองค์ประกอบและผูกเหตุการณ์ ( ต้นฉบับ )

// creating a dynamic element (container div)
var $div = $("<div>", {id: 'myid1', class: 'myclass'});

//creating a dynamic button
 var $btn = $("<button>", { type: 'button', text: 'Click me', class: 'btn' });

// binding the event
 $btn.click(function () { //for mouseover--> $btn.on('mouseover', function () {
    console.log('clicked');
 });

// append dynamic button to the dynamic container
$div.append($btn);

// add the dynamically created element(s) to a static element
$("#box").append($div);

หมายเหตุ: สิ่งนี้จะสร้างอินสแตนซ์ตัวจัดการเหตุการณ์สำหรับแต่ละองค์ประกอบ (อาจมีผลต่อประสิทธิภาพเมื่อใช้เป็นลูป)


0
<html>
    <head>
        <title>HTML Document</title>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
    </head>

    <body>
        <div id="hover-id">
            Hello World
        </div>

        <script>
            jQuery(document).ready(function($){
                $(document).on('mouseover', '#hover-id', function(){
                    $(this).css('color','yellowgreen');
                });

                $(document).on('mouseout', '#hover-id', function(){
                    $(this).css('color','black');
                });
            });
        </script>
    </body>
</html>

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

0

ฉันกำลังมองหาวิธีที่จะได้รับ$.bindและ$.unbindทำงานได้อย่างไม่มีปัญหาในองค์ประกอบที่เพิ่มเข้ามาแบบไดนามิก

ในฐานะที่เป็น()ทำให้เคล็ดลับในการแนบเหตุการณ์เพื่อที่จะสร้างการผูกมัดปลอมในสิ่งที่ฉันมาถึง:

const sendAction = function(e){ ... }
// bind the click
$('body').on('click', 'button.send', sendAction );

// unbind the click
$('body').on('click', 'button.send', function(){} );

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