दिलचस्प पोस्ट
मैं एक गीथहब विकी कैसे क्लोन करता हूं? जगह में फ़ाइल को संशोधित करें (उसी गंतव्य) Gulp.js और एक ग्लोबिंग पैटर्न का उपयोग कर एक तृतीय तालिका में अपने एफके के साथ 2 तालिकाओं में शामिल होने के लिए आवश्यक है एक फ़ाइल में जावास्क्रिप्ट जेनरेट किए गए SVG कन्वर्ट करें डीजेंगओ साइट में पीडीएफ़ को एचडीएमएल प्रस्तुत करना क्या उनके मूल तत्व के नीचे छद्म तत्वों के ढेर क्रम को सेट करना संभव है? क्रॉस-डोमेन XMLHttpRequest पृष्ठभूमि पृष्ठ का उपयोग कर क्या संख्याओं को मान्य करने के लिए जावास्क्रिप्ट में isNumeric जैसे कोई फ़ंक्शन है? कार्य में UI नियंत्रणों को एक्सेस करना। Async के साथ चलाएं / WinForms पर प्रतीक्षा करें किसी भी जार फ़ाइल के लिए एक्लिप्स में स्रोत या जावाडॉक कैसे संलग्न करें जैसे जावाएफ़एक्स? जावास्क्रिप्ट किसी भी वेब पेज के स्रोत को पढ़ सकता है? Gmail और Google Chrome 12+ में क्लिपबोर्ड कार्यक्षमता से पेस्ट छवि कैसे काम करती है? क्रॉस-थ्रेड विनफॉर्म इवेंट हैंडलिंग में इन्वेक / बीयरइनवोक के संकट से बचना? ब्लॉक को डिफ़ॉल्ट मैसेजिंग ऐप में लॉग इन होने से एसएमएस भेजा गया बिना कठोरता के बिना केक पैटर्न के साथ आप निर्भरता इंजेक्शन कैसे करते हैं?

गतिशील रूप से निर्मित तत्वों पर घटना बाध्यकारी है?

मेरे पास थोड़ा सा कोड है, जहां मैं किसी पृष्ठ पर सभी चुनिंदा बक्से के माध्यम से पाइपिंग कर रहा हूं और बाध्यकारी .hovermouse on/off अपनी चौड़ाई के साथ mouse on/off करने के लिए थोड़ी देर तक .hover लिए उन्हें घटना mouse on/off

यह पेज पर तैयार होता है और सिर्फ ठीक काम करता है।

मेरे पास समस्या यह है कि प्रारंभिक लूप के बाद मैं एजेक्स या डोम के माध्यम से जो भी चयन बॉक्स जोड़ता हूं, उसमें इवेंट बाउंड नहीं होगा।

मुझे यह प्लगइन ( jQuery लाइव प्रश्न प्लगइन ) मिला है, लेकिन इससे पहले कि मैं किसी प्लगइन के साथ अपने पृष्ठों पर एक और 5k जोड़ूं, मैं यह देखना चाहता हूं कि कोई भी ऐसा करने का एक तरीका जानता है, या तो jQuery के साथ या किसी दूसरे विकल्प से।

Solutions Collecting From Web of "गतिशील रूप से निर्मित तत्वों पर घटना बाध्यकारी है?"

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(){} ); 

उदाहरण के लिए, यदि आपका पेज गतिशील रूप से क्लास नाम के साथ तत्व बना रहा है, तो आप उस घटना को उस अभिभावक से बाँध लेंगे जो पहले से मौजूद है, अक्सर 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> 

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 पंक्तियों के साथ डेटा तालिका पर, पहला कोड उदाहरण 1,000 तत्वों के लिए एक हेन्डलर को जोड़ता है।

एक प्रत्यायोजित-घटनाओं का दृष्टिकोण (दूसरा कोड उदाहरण) एक ईवेंट हैंडलर को केवल एक तत्व, tbody में tbody , और घटना को केवल एक स्तर को बबल करने की आवश्यकता होती है (क्लिक किए गए tr से tbody )।

नोट: सौंपी गई घटनाएं एसवीजी के लिए काम नहीं करतीं

यह बिना किसी लाइब्रेरी या प्लगिन के शुद्ध जावास्क्रिप्ट समाधान है:

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

लाइव डेमो

श्रेय डेव और सिमे विदा को जाता है

जब आप उन्हें बनाते हैं तो आप वस्तुओं में ईवेंट जोड़ सकते हैं। यदि आप एक ही ईवेंट को कई बार विभिन्न वस्तुओं पर जोड़ रहे हैं, तो नाम का फ़ंक्शन बनाकर जाने का तरीका हो सकता है

 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 */ ) ; 

आप आसानी से अपने ईवेंट को एक समारोह में बाँध कर कॉल कर सकते हैं और फिर इसे दो बार दोहरा सकते हैं: एक बार दस्तावेज़ तैयार हो जाने पर और एक बार अपने ईवेंट के बाद जो नए DOM तत्वों को जोड़ता है यदि आप ऐसा करते हैं तो आप मौजूदा तत्वों पर दो बार एक ही घटना बाध्य नहीं करना चाहेंगे, इसलिए आपको मौजूदा ईवेंट को अन्तराल करने की आवश्यकता होगी या (बेहतर) केवल नए तत्व बनाए गए DOM तत्वों से बाध्य करें। कोड ऐसा कुछ दिखाई देगा:

 function addCallbacks(eles){ eles.hover(function(){alert("gotcha!")}); } $(document).ready(function(){ addCallbacks($(".myEles")) }); // ... add elements ... addCallbacks($(".myNewElements")) 

.live() बजाय। .live() का उपयोग करने का प्रयास करें; .hover .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> 

एक और समाधान तत्व बनाने के दौरान श्रोता को जोड़ना है शरीर में श्रोता को डाल देने के बजाय, आपने उस तत्व में श्रोता को उस क्षण में रखा है जिसे आप बनाते हैं:

 var myElement = $('<button/>', { text: 'Go to Google!' }); myElement.bind( 'click', goToGoogle); myElement.append('body'); function goToGoogle(event){ window.location.replace("http://www.google.com"); } 

गतिशील रूप से निर्मित तत्वों पर ईवेंट बाध्यकारी

एकल तत्व:

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

बाल तत्व:

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

नोटिस जोड़ा * उस तत्व के सभी बच्चों के लिए एक घटना शुरू हो जाएगी

मैंने नोटिस किया है कि:

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

यह अब और काम नहीं कर रहा है, लेकिन यह पहले काम कर रहा था। मैं Google CDN से jQuery का उपयोग कर रहा हूं, लेकिन मुझे नहीं पता कि क्या उन्होंने इसे बदल दिया है।

मैं चयनकर्ता पर उपयोग करना पसंद करता हूं और मैं इसे दस्तावेज़ पर लागू करता हूं।

यह दस्तावेज़ पर खुद को बांधता है और वह उन तत्वों पर लागू होगा जो पेज लोड के बाद प्रदान किए जाएंगे।

उदाहरण के लिए:

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

जब आप गतिशील रूप से 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> 

उदाहरण के लिए "मेन" कक्षा का ध्यान रखें, तत्व रखा गया है,

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

उपर्युक्त परिदृश्य में, जेएनएल को देखने वाला मेन ऑब्जेक्ट "कंटेनर" है

उसके बाद आप मूल रूप से कंटेनर के अंतर्गत तत्व, जैसे कि ul , li , और select :

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

आप उपयोग कर सकते हैं

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

या

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

ये दो विधियां समान हैं लेकिन मापदंडों का एक अलग क्रम है।

देखें: jQuery प्रतिनिधि कार्यक्रम

कोई भी पी नहीं है जो उस समय मौजूद है जब ईवेंट बाध्य है और यदि आपका पृष्ठ गतिशील रूप से क्लास नाम बटन के साथ तत्वों का निर्माण कर रहा है, तो आप उस घटना को उस अभिभावक के साथ बाँध लेंगे जो पहले से मौजूद है

 $(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> 

इस तरह से कोशिश करो –

 $(document).on( 'click', '.click-activity', function () { ... }); 

.on() तत्व के लिए ईवेंट हैंडलर्स को संलग्न करने के लिए jQuery के http: .on() .

इसके अलावा संस्करण 1.9 .live() विधि के रूप में हटा दिया गया है।

यहां क्यों गतिशील रूप से बनाए गए तत्व क्लिक पर प्रतिक्रिया नहीं देते हैं:

 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> 

तत्वों को बनाने और घटनाओं को बाध्य करने के लिए सबसे लचीला समाधान

 // 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); 

JQuery के साथ एक नया तत्व बनाने का पसंदीदा तरीका

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