ගතිකව සාදන ලද මූලද්‍රව්‍ය මත සිදුවීම් බන්ධනය?


1677

මා සතුව කේතයක් ඇත, එහිදී මම පිටුවක ඇති සියලුම තෝරාගත් පෙට්ටි හරහා .hoverලූපයක් ගසමින් ඒවායේ පළල සමඟ මඳක් විකෘති කිරීමක් කිරීමට සිදුවීමක් ඔවුන්ට බැඳ තබමි mouse on/off.

මෙය සූදානම් පිටුවේ සිදු වන අතර එය හොඳින් ක්‍රියාත්මක වේ.

මට ඇති ගැටළුව නම්, ආරම්භක ලූපයෙන් පසුව මම අජැක්ස් හෝ ඩොම් හරහා එකතු කරන ඕනෑම තෝරාගත් පෙට්ටියකට සිදුවීම බැඳී නොතිබීමයි.

මම මෙම ප්ලගිනය සොයාගෙන ඇත ( jQuery සජීවී විමසුම් ප්ලගිනය ), නමුත් මම ප්ලගිනයක් සමඟ මගේ පිටුවලට තවත් 5k එකතු කිරීමට පෙර, jQuery සමඟ කෙලින්ම හෝ වෙනත් විකල්පයක් මඟින් මෙය කිරීමට ක්‍රමයක් කිසිවෙකු දන්නේ දැයි බැලීමට මට අවශ්‍යය.

Answers:


2271

JQuery 1.7 වන විට ඔබ jQuery.fn.onපුරවා ඇති තේරීම් පරාමිතිය සමඟ භාවිතා කළ යුතුය :

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

පැහැදිලි කිරීම:

මෙය සිදුවීම් නියෝජිත කණ්ඩායම ලෙස හැඳින්වෙන අතර පහත පරිදි ක්‍රියා කරයි. සිද්ධිය staticAncestorsහැසිරවිය යුතු මූලද්‍රව්‍යයේ ස්ථිතික මාපිය ( ) සමඟ අමුණා ඇත. මෙම මූලද්‍රව්‍යය හෝ පැවත එන මූලද්‍රව්‍යයන්ගෙන් සිදුවීමක් අවුලුවන සෑම අවස්ථාවකම මෙම jQuery හසුරුවන්නා අවුලුවන. සිදුවීම අවුලුවන මූලද්‍රව්‍යය ඔබේ තේරීම් කාරකයට ( dynamicChild) ගැලපේදැයි හසුරුවන්නා පරීක්ෂා කරයි . ගැලපීමක් ඇති විට ඔබේ අභිරුචි හසුරුවන්නාගේ ක්‍රියාව ක්‍රියාත්මක වේ.


මෙයට පෙර , නිර්දේශිත ප්‍රවේශය වූයේ 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
සජීවී ක්‍රමය ක්‍රියාත්මක වන්නේ ඇතැම් සිදුවීම් සඳහා පමණක් වන අතර අනෙක් ඒවා ලෝඩ්මෙටා දත්ත වැනි නොවේ. (ප්‍රලේඛනයේ ඇති අවවාද අංශය බලන්න.)
සෑම් ඩටන්

48
සිදුවීම් නියෝජිත කණ්ඩායම ගැන වැඩි විස්තර මෙතැනින් ඉගෙන ගන්න: learn.jquery.com/events/event-delegation .
ෆීලික්ස් ක්ලින්ග්

9
පිරිසිදු ජාවාස්ක්‍රිප්ට් / වැනිලා ජේඑස් සමඟ මෙය ඉටු කර ගැනීමට ක්‍රමයක් තිබේද?
රාම් පත්‍රා

15
QRamswaroop ඔබට jQuery හි කළ හැකි ඕනෑම දෙයක් jQuery නොමැතිව කළ හැකිය. JQuery නොමැතිව සිදුවීම් නියෝජිතයින් සඳහා හොඳ උදාහරණයක් මෙන්න
ඩේව්

5
ave ඩේව් ඔබ පෙන්වා දුන් පිළිතුර මෙහි ලැයිස්තුගත නොවන්නේ මන්දැයි මම කල්පනා කරමි. හැකි නම් කිසිදු ප්ලගිනයක් නොමැතිව ඒලී පැහැදිලිවම විසඳුමක් ඉල්ලා ඇත.
රාම් පත්‍රා

378

හි ප්‍රලේඛනයේ හොඳ පැහැදිලි කිරීමක් තිබේ 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 වතාවක් ක්ලික් කිරීමට සිදුවේ :)
ගොන් කෝඩින්

2
trසුදුසු තේරීම් කාරකයකට වෙනස් කිරීමෙන් පේළියකින් පිරික්සුම් කොටුව හැසිරවීමට මෙම ප්‍රවේශය යොදා 'input[type=checkbox]'ගත හැකි අතර, අලුතින් ඇතුළත් කළ පේළි සඳහා මෙය ස්වයංක්‍රීයව හසුරුවනු ඇත්ද?
ජෝ බ්‍රොක්හවුස්

1
ඔබට ස්තුතියි! මෙය මගේ ගැටලුව විසඳයි. මෙම සරල ප්‍රකාශය මගේ ප්‍රශ්නය විය, "සිදුවීම් හසුරුවන්නන් බැඳී ඇත්තේ දැනට තෝරාගෙන ඇති මූලද්‍රව්‍යයන්ට පමණි; ඔබේ කේතය ඇමතුම ලබා දෙන වේලාවේ ඒවා පිටුවේ තිබිය යුතුය ..."
ඩෙනිස් ෆසෙකාස්

216

මෙය පුස්තකාල හෝ ප්ලගීන නොමැතිව පිරිසිදු ජාවාස්ක්‍රිප්ට් විසඳුමකි:

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

ණය ඩේව් සහ සිම් විදාස්ට හිමිවේ

වඩාත් නවීන JS භාවිතා කරමින්, පහත hasClassපරිදි ක්‍රියාත්මක කළ හැකිය:

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


7
බෙදීම වෙනුවට ඔබට Element.classList භාවිතා කළ හැකිය
ඉයුජන් කොන්කොව්

2
Ug ඉයුජන්කොන්කොව් Element.classListපැරණි බ්‍රව්සර් සඳහා සහය නොදක්වයි. උදාහරණයක් ලෙස, අයිඊ <9
රාම් පත්‍රා


2
කොහොමද බුබුලු දැමීම? ඔබ උනන්දුවක් දක්වන මූලද්‍රව්‍යයේ දරුවෙකු මත ක්ලික් කිරීමේ සිදුවීම සිදුවුවහොත් කුමක් කළ යුතුද?
ඇන්ඩ්‍රියාස් ට්‍රාන්ටිඩිස්

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 () භාවිතා කරනවා වෙනුවට මම .bind () මගේ .load () ඇමතුම් සඳහා භාවිතා කළෙමි. ගැටළුව විසඳා ඇත. ස්තූතියි!
තෝමස් මැකේබ්

42

.live()ඒ වෙනුවට භාවිතා කිරීමට උත්සාහ කරන්න .bind(); මෙම .live()බැඳ ඇත .hoverමෙම Ajax ඉල්ලීම ඉටු කරන පසුව ඔබේ පිරික්සුම් කොටුව කිරීමට.


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 භාවිතා කර ඇත , නමුත් ඔවුන් එය වෙනස් කළේ දැයි මම නොදනිමි.


ඔව් සහ ඔවුන් කියන්නේ නැහැ (document.body) එහි මුතුන්මිත්තන් බොහෝ දේ විය හැකි බව
MadeInDreams

25

ඔන්ක්ලික් සිද්ධිය වැනි සිදුවීම් සහ හසුරුවන්නන් සමඟ මූලද්‍රව්‍ය (අලුතින් සාදන ලද ඒවා පවා) බැඳීමට ඔබට සජීවී () ක්‍රමය භාවිතා කළ හැකිය.

මෙන්න මම ලියා ඇති නියැදි කේතයක්, සජීවී () ක්‍රමය මඟින් තෝරාගත් අංග, අලුතින් සාදන ලද ඒවා පවා සිදුවීම් සමඟ බැඳ තබන ආකාරය ඔබට දැකගත හැකිය:

<!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>

24

මම තේරීම් කාරකය භාවිතා කිරීමට කැමැත්තක් දක්වන අතර මම එය ලේඛනයට අදාළ කරමි.

මෙය ලේඛනය සමඟ බැඳී ඇති අතර පිටු පැටවීමෙන් පසුව විදහා දක්වන මූලද්‍රව්‍යයන්ට අදාළ වේ.

උදාහරණයක් වශයෙන්:

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

2
තේරීම් කාරකය by විසින් කොටු නොකළ යුතුය, එබැවින් නිවැරදි ආකෘතිය $ (ලේඛනය) වනු ඇත .එහි ("ක්ලික් කරන්න", "තේරීම් කාරකය", ශ්‍රිතය () {// ඔබේ කේතය මෙහි});
ස්වයංක්‍රීය ගුවන් නියමු

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");
    });
 });

15

මෙය සිදු කරනු ලබන්නේ සිදුවීම් නියෝජිත කණ්ඩායම විසිනි. සිදුවීම එතීෙම් පංතියේ මූලද්‍රව්‍යය මත බැඳී ඇති නමුත් තේරීම් පන්තියේ මූලද්‍රව්‍යයට පවරනු ලැබේ. එය ක්‍රියාත්මක වන ආකාරය මෙයයි.

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

සටහන:

එතීමේ පන්තියේ මූලද්‍රව්‍යය ඕනෑම දෙයක් විය හැකිය. ලේඛනය, ශරීරය හෝ ඔබේ එතීම. රැපර් දැනටමත් පැවතිය යුතුය . කෙසේ වෙතත්, selectorපිටු පැටවීමේ වේලාවේදී ඉදිරිපත් කිරීම අවශ්‍ය නොවේ. එය පසුව පැමිණිය හැකි අතර සිදුවීම selector නොවරදවාම බැඳී ඇත .


14

ඔබට භාවිතා කළ හැකිය

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

හෝ

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

මෙම ක්‍රම දෙක සමාන නමුත් වෙනස් පරාමිති අනුපිළිවෙලක් ඇත.

බලන්න: jQuery නියෝජිත සිදුවීම


2
delegate()දැන් අතහැර දමා ඇත. එය භාවිතා නොකරන්න.
රෝරි මැක්ක්‍රොසන්

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>


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 ස්ථානයක් නොමැති අතර ඔබේ පිටුව පන්ති නාම බොත්තම සමඟ ගතිකව මූලද්‍රව්‍ය නිර්මාණය කරන්නේ නම්, ඔබ දැනටමත් සිදුවීම දෙමාපියෙකුට බැඳ තබයි.

$(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/ ක්‍රමය භාවිතා කරන්නසිදුවීම් හසුරුවන්නන් සජීවී මූලද්‍රව්‍යයට ඇමිණීමට .

1.9 අනුවාදය අනුව .live()ක්‍රමය ඉවත් කරනු ලැබේ.


3

documentමට්ටමේ සිදුවීම් සවන්දෙන්නෙකු ස්ක්‍රිප්ට් කරනවාට වඩා සිදුවීම් සවන්දෙන්නන් මොඩියුලර් ක්‍රියාකාරීත්වයකින් යෙදවීමට මම කැමැත්තෙමි . ඉතින්, මම පහතින් කැමතියි. සටහන, ඔබට එකම සිදුවීම් සවන්දෙන්නෙකු සමඟ මූලද්‍රව්‍යයක් අධි දායකත්වයක් ලබා ගත නොහැක, එබැවින් එක් වරකට වඩා සවන්දෙන්නෙකු ඇමිණීම ගැන කරදර නොවන්න - එක් සැරයටියක් පමණි.

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
මෙම කේත ස්නිපටය ගැටළුව විසඳිය හැකි නමුත්, එය ප්‍රශ්නයට පිළිතුරු දෙන්නේ ඇයි හෝ කෙසේද යන්න පැහැදිලි නොකරයි. කරුණාකර ඔබගේ කේතය සඳහා පැහැදිලි කිරීමක් ඇතුළත් කරන්න, එය ඔබගේ තනතුරේ ගුණාත්මකභාවය වැඩි දියුණු කිරීමට සැබවින්ම උපකාරී වේ. අනාගතයේදී ඔබ පා readers කයන් සඳහා වන ප්‍රශ්නයට පිළිතුරු සපයන බව මතක තබා ගන්න, ඔබේ කේත යෝජනාවට හේතු එම පුද්ගලයින් නොදැන සිටිය හැකිය.
පලෙක්

0

මම ගතිකව එකතු කරන ලද මූලද්‍රව්‍යවල ගැටළු නොමැතිව ලබා ගැනීමට $.bindසහ $.unbindවැඩ කිරීමට විසඳුමක් සොයමින් සිටියෙමි .

ලෙස මත () මෙම උපක්රමය මා ආවේ අය මත unbind ව්යාජ නිර්මාණය කිරීම සඳහා, සිදුවීම් අනුයුක්ත කිරීමට කරයි:

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

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

බන්ධනය ක්‍රියා නොකරයි, මෙය සරල ශ්‍රිතයක් වෙත යොමු වන තවත් සිදුවීමක් එක් කරයි ...
ෆේබියන් බිග්ලර්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.