मैं देखता हूं .on()
कि jQuery 1.7 में एक नई विधि है .live()
जो पहले के संस्करणों में बदल जाती है।
मुझे उनके बीच अंतर जानने में दिलचस्पी है और इस नई पद्धति का उपयोग करने के क्या फायदे हैं।
जवाबों:
डॉक्स में यह बहुत स्पष्ट है कि आप लाइव का उपयोग क्यों नहीं करना चाहेंगे। जैसा कि फेलिक्स ने उल्लेख किया है, .on
घटनाओं को संलग्न करने का एक अधिक कारगर तरीका है।
.Live () विधि का उपयोग अब अनुशंसित नहीं है क्योंकि jQuery के बाद के संस्करण बेहतर तरीके प्रदान करते हैं जिनमें इसकी कमियां नहीं हैं। विशेष रूप से, .live () के उपयोग के साथ निम्नलिखित समस्याएं उत्पन्न होती हैं:
- jQuery
.live()
विधि को कॉल करने से पहले चयनकर्ता द्वारा निर्दिष्ट तत्वों को प्राप्त करने का प्रयास करता है , जो बड़े दस्तावेजों पर समय लेने वाला हो सकता है।- चेनिंग विधियों का समर्थन नहीं किया जाता है। उदाहरण के लिए,
$("a").find(".offsite, .external").live( ... );
है न वैध और अपेक्षा के अनुरूप काम नहीं करता है।- चूंकि सभी
.live()
घटनाओं कोdocument
तत्व में संलग्न किया जाता है, इसलिए घटनाओं को संभाला जाने से पहले सबसे लंबा और सबसे धीमा संभव पथ होता है।event.stopPropagation()
ईवेंट हैंडलर में कॉल करना इवेंट के हैंडलर को दस्तावेज़ में कम संलग्न करने से रोकने में अप्रभावी है; घटना पहले से ही प्रचारित हैdocument
।.live()
तरीके कि आश्चर्य की बात हो सकती है, जैसे में अन्य घटना के तरीकों के साथ विधि सहभागिता करता है,$(document).unbind("click")
सभी क्लिक करने के लिए किसी भी कॉल द्वारा संलग्न संचालकों को हटा.live()
!
live()
इसके व्यवहार को संशोधित किया गया था on()
, तो यह मौजूदा कोड को तोड़ सकता है। JQuery के लोगों ने दिखाया है कि वे जरूरी तौर पर "ब्रेकिंग" विरासत कोड से डरते नहीं हैं, लेकिन मुझे लगता है कि इस मामले में, उन्होंने फैसला किया कि इससे रिग्रेशन शुरू करने का जोखिम नहीं है।
live()
1.7 में हटा दिया गया था और 1.9 में हटा दिया गया था। api.jquery.com/live
एक अंतर जिसे लोग चलते समय रोकते हैं .live()
, .on()
वह यह है कि .on()
तत्वों को बांधने के लिए मापदंडों को थोड़ा अलग किया जाता है जब DOM में तत्वों को जोड़ा जाता है।
यहां हम उस सिंटैक्स का एक उदाहरण है जिसका उपयोग हम .live()
विधि के साथ करते हैं :
$('button').live('click', doSomething);
function doSomething() {
// do something
}
अब .live()
jQuery संस्करण 1.7 में पदावनत किया जा रहा है और संस्करण 1.9 में हटा दिया गया है, आपको .on()
विधि का उपयोग करना चाहिए । यहां .on()
विधि का उपयोग करके एक समान उदाहरण दिया गया है:
$(document).on('click', 'button', doSomething);
function doSomething() {
// do something
}
कृपया ध्यान दें कि हम .on()
बटन के बजाय दस्तावेज़ के खिलाफ कॉल कर रहे हैं । हम उस तत्व के लिए चयनकर्ता को निर्दिष्ट करते हैं जिसकी घटना हम दूसरे पैरामीटर में सुन रहे हैं।
उपरोक्त उदाहरण में, मैं .on()
दस्तावेज़ पर कॉल कर रहा हूं , हालांकि यदि आप अपने चयनकर्ता के करीब एक तत्व का उपयोग करते हैं तो आपको बेहतर प्रदर्शन मिलेगा। कोई भी पूर्वज तत्व आपके द्वारा कॉल करने से पहले पेज पर मौजूद है, तब तक काम करेगा .on()
।
यह यहाँ प्रलेखन में समझाया गया है, लेकिन इसे याद करना काफी आसान है।
आधिकारिक ब्लॉग देखें
[..] नया .on () और .off () एपीआई jQuery में एक दस्तावेज़ में घटनाओं को संलग्न करने के सभी तरीकों को एकजुट करते हैं - और वे टाइप करने के लिए छोटे हैं! [...]
.live()
इस पद्धति का उपयोग सभी तत्वों के लिए एक घटना हैंडलर को जोड़ने के लिए किया जाता है जो वर्तमान चयनकर्ता से मेल खाता है, अभी और भविष्य में।
$( "#someid" ).live( "click", function() {
console.log("live event.");
});
तथा
.on()
इस विधि का उपयोग एक ईवेंट हैंडलर फ़ंक्शन को एक या अधिक ईवेंट के लिए चयनित तत्वों के लिए नीचे दिए गए उदाहरण के लिए किया जाता है।
$( "#someid" ).on( "click", function() {
console.log("on event.");
});
बनाम लाइव के बीच अंतर पर अच्छा ट्यूटोरियल
उपरोक्त लिंक से उद्धरण
क्या गलत है .live ()
.Live () विधि का उपयोग अब अनुशंसित नहीं है क्योंकि jQuery के बाद के संस्करण बेहतर तरीके प्रदान करते हैं जिनमें इसकी कमियां नहीं हैं। विशेष रूप से, .live () के उपयोग के साथ निम्नलिखित समस्याएं उत्पन्न होती हैं:
- jQuery .live () विधि को कॉल करने से पहले चयनकर्ता द्वारा निर्दिष्ट तत्वों को पुनः प्राप्त करने का प्रयास करता है, जो बड़े दस्तावेजों पर समय लेने वाला हो सकता है।
- चेनिंग विधियों का समर्थन नहीं किया जाता है। उदाहरण के लिए, $ ("a")। ढूँढें ("। Offsite, .external")। जियो (…); मान्य नहीं है और अपेक्षा के अनुरूप काम नहीं करता है।
- चूँकि सभी .live () इवेंट्स डॉक्यूमेंट एलिमेंट में अटैच होते हैं, ईवेंट्स हैंडल होने से पहले सबसे लंबा और धीमा संभव रास्ता तय करते हैं।
- ईवेंट हैंडलर में ईवेंट .stopPropagation () को कॉल करना दस्तावेज़ में निचले ईवेंट हैंडलर को रोकने में अप्रभावी है; घटना पहले ही दस्तावेज़ में प्रचारित कर चुकी है।
- .Live () विधि अन्य घटना विधियों के साथ परस्पर क्रिया करती है, जो आश्चर्यजनक हो सकती हैं, जैसे, $ (दस्तावेज़) .unbind ("क्लिक") किसी भी कॉल द्वारा .live () में संलग्न सभी क्लिक हैंडलर को हटाता है!
अधिक जानकारी के लिए इसे देखें .. .live () और .on ()
.live () विधि का उपयोग तब किया जाता है जब आप सामग्री की गतिशील पीढ़ी के साथ व्यवहार करते हैं ... जैसे मैंने प्रोग्राम पर बनाया है जो एक टैब जोड़ता है जब मैं एक जेकरी स्लाइडर का मूल्य बदलता हूं और मैं हर टैब के करीब बटन की कार्यक्षमता को संलग्न करना चाहता हूं। जो उत्पन्न होगा ... कोड मैंने कोशिश की है ..
var tabs = $('#tabs').tabs();
// live() methos attaches an event handler for all
//elements which matches the curren selector
$( "#tabs span.ui-icon-close" ).live( "click", function() {
// fetches the panelId attribute aria-control which is like tab1 or vice versa
var panelId = $( this ).closest( "li" ).remove().attr( "aria-controls" );
$( "#" + panelId ).remove();
tabs.tabs( "refresh" );
});
और यह बहुत अच्छा काम करता है ...
मैं Chrome एक्सटेंशन "टिप्पणी सहेजें" का लेखक हूं , जो jQuery का उपयोग करता है, और जो उपयोग किया जाता है .live()
। जिस तरह से एक्सटेंशन काम करता है वह श्रोता को सभी टेक्स्टारियस का उपयोग करके संलग्न करता है। live()
- यह तब से अच्छी तरह से काम करता है जब भी दस्तावेज़ बदल जाता है तब भी यह श्रोता को सभी नए टेक्स्टारस से जोड़ेगा।
मैं चला गया, .on()
लेकिन यह भी काम नहीं करता है। जब भी दस्तावेज़ बदलता है तो यह श्रोता को संलग्न नहीं करता है - इसलिए मैंने वापस उपयोग करने के लिए वापस कर दिया है .live()
। यह एक बग है जिसमें मुझे लगता है .on()
। बस इसके बारे में सावधान रहना मुझे लगता है।
.live()
विधि के लिए थोड़ा अलग सिंटैक्स है । बराबर .on()
के लिए $('p').live('click', function () { alert('clicked'); });
है $(document).on('click', 'p', function () { alert('clicked'); });
। ध्यान दें कि आप उस .on()
विधि का उपयोग करते हैं document
और फिर उस तत्व को निर्दिष्ट करते हैं जिसे आप इवेंट हैंडलर को उसके दूसरे पैरामीटर में सुनने के लिए संलग्न करना चाहते हैं।
मुझे ब्राउज़र बंद घटना की पहचान करने की आवश्यकता है। अनुसंधान करने के बाद मैं jQuery 1.8.3 का उपयोग कर रहा हूं
हाइपरलिंक पर क्लिक करने के बाद jQuery का उपयोग करके एक झंडे को चालू करें
$ ('ए') लाइव ('क्लिक', फ़ंक्शन () {cleanSession = false;});
जब किसी भी समय इनपुट बटन के प्रकार पर क्लिक करके jQuery का उपयोग करके एक झंडे को चालू करें
$।
$ ('फॉर्म')। जियो ('सबमिट', फंक्शन) () {क्लीनसेशन = गलत;});
अब महत्वपूर्ण बात ... मेरा समाधान केवल तभी काम करता है जब मैं इसके बजाय .live का उपयोग करता हूं। यदि मैं .on का उपयोग करता हूं, तो फॉर्म जमा होने के बाद घटना को निकाल दिया जाता है और जो बहुत देर हो चुकी होती है। कई बार मेरे फॉर्म को जावास्क्रिप्ट कॉल (document.form.submit) का उपयोग करके सबमिट किया जाता है
तो .live और .on के बीच एक महत्वपूर्ण अंतर है। यदि आप उपयोग करते हैं। अपनी घटनाओं को तुरंत निकाल दें, लेकिन यदि आप स्विच करते हैं। तो यह समय पर निकाल नहीं जाता है
.on
गलत तरीके से उपयोग कर रहे होंगे या आपके कोड में कुछ और हो रहा होगा। शायद अपनी .on
विधि के लिए अपना कोड पेस्ट करें ।