2009-09-28 23 views
9

मैं jQuery में live() समारोह की एक अजीब व्यवहार देखा है:jQuery रहते हैं ('क्लिक') के लिए फायरिंग राइट क्लिक करें

<a href="#" id="normal">normal</a> 
<a href="#" id="live">live</a> 

$('#normal').click(clickHandler); 
$('#live').live('click', clickHandler); 

function clickHandler() { 
    alert("Clicked"); 
    return false; 
} 

कि "लाइव" पर राइट क्लिक करें ठीक है और आप जब तक dandy है लिंक और यह हैंडलर को फायर करता है, और फिर संदर्भ मेनू नहीं दिखाता है। इवेंट हैंडलर "सामान्य" लिंक पर बिल्कुल (जैसा अपेक्षित) आग नहीं लगाता है।

मैं इस के लिए हैंडलर बदलकर आसपास काम कर लिया है:

function clickHandler(e) { 
    if (e.button != 0) return true; 
    // normal handler code here 
    return false; 
} 

लेकिन इनके अलावा ईवेंट हैंडलर्स है कि जोड़ने के लिए करने के लिए वास्तव में कष्टप्रद है। क्या ईवेंट हैंडलर केवल नियमित क्लिक हैंडलर की तरह आग लगने का कोई बेहतर तरीका है?

+1

भविष्य में आप एक प्रश्न कैसे पूछते हैं? – PetersenDidIt

+0

मैं यहां आपके कामकाज को देखने के लिए उत्साहित था, और तुरंत अपने ऐप पर यह कोशिश की, और हालांकि जिन लिंक पर मैं अभी राइट-क्लिक कर रहा हूं उन्हें पकड़ा और अनदेखा किया जा सकता है, मैं अभी भी अपना राइट-क्लिक संदर्भ मेनू नहीं देख रहा हूं इन। इसके अलावा, मेरा मध्य माउस बटन क्लिक करें (एक नए टैब में खुलता है) या तो काम नहीं करता है। लेकिन, कम से कम हैंडलर जल्दी वापस आ सकता है! – Funka

+0

असल में, ऐसा लगता है कि अगर मैं बार-बार राइट-क्लिक करता हूं, तो मैं कभी-कभी संदर्भ-मेनू प्रकट होने के लिए प्राप्त कर सकता हूं .... हम्म। – Funka

उत्तर

9

यह एक known issue है:

ऐसा लगता है कि Firefox पर तत्व के लिए एक क्लिक करें घटना आग नहीं करता है एक राइट क्लिक करें, हालांकि यह एक mousedown और mouseup सक्रिय करता है। हालांकि, यह document पर एक क्लिक ईवेंट आग लगाता है! चूंकि .live दस्तावेज़ स्तर पर घटनाओं पकड़ता है, यह देखता तत्व के लिए क्लिक करें घटना भी हालांकि तत्व में ही नहीं है। यदि आप mouseup तरह की एक घटना का उपयोग करें, दोनों p तत्व और document घटना देखेंगे।

आपका कामकाज अब आप के लिए सबसे अच्छा कर सकते हैं। ऐसा लगता है कि केवल फ़ायरफ़ॉक्स को प्रभावित करता है (मुझे विश्वास है कि यह वास्तव में फ़ायरफ़ॉक्स में एक बग है, jQuery प्रति से नहीं)।

भी this question कल पूछा देखें।

0

यह live कैसे कार्यान्वित किया जाता है की एक दुर्भाग्यपूर्ण परिणाम है। यह वास्तव में ईवेंट बबलिंग का उपयोग करता है ताकि आप एंकर तत्व के क्लिक ईवेंट से बाध्यकारी न हों, आप दस्तावेज़ के क्लिक ईवेंट पर बाध्यकारी हैं। "ठीक" live() कोड में ही -

+0

नहीं, फ़ायरफ़ॉक्स बुलबुले राइट-क्लिक के तरीके में एक दोष है। Http://unixpapa.com/js/mouse.html –

+0

@crescentfresh देखें: मुझे यकीन नहीं है कि एक लेख में कितना विश्वास है जो कहता है "सफारी के मैकिंतोश संस्करण, निश्चित रूप से, इन समस्याओं से प्रतिरक्षा हैं, क्योंकि मैकिंटोशेस केवल एक माउस बटन है "- आखिरी बार जब मैंने एक बटन के साथ एक मैक का इस्तेमाल किया था तो टीबीएल ने वेब का आविष्कार करने से कुछ समय पहले ;-) – NickFitz

+0

@NickFitz: touché। –

4

मैं एक समाधान मिल गया है।

jQuery का unminified स्रोत में लाइन 2989 के आसपास 1.3.2 एक समारोह liveHandler() कहा जाता है। एक लाइन जोड़ने के लिए कोड संशोधित करें:

2989: function liveHandler(event) { 
2990:  if (event.type == 'click' && event.button != 0) return true; 

यह कुछ भी लेकिन बाएं माउस बटन पर फायरिंग से क्लिक ईवेंट बंद हो जाएगा। यदि आप विशेष रूप से चाहते थे, तो आप "दाएं क्लिक" घटनाओं को भी अनुमति देने के लिए कोड को काफी आसानी से संशोधित कर सकते हैं, लेकिन यह मेरे लिए काम करता है ताकि वह उस पर रह सके।

3

आप वास्तव में यह के रूप में फिर से लिखने कर सकते हैं:

function reattachEvents(){ 
    $(element).unbind('click').click(function(){ 
     //do something 
    }); 
} 

और इसे कहते जब आप एक नया डोम तत्व जोड़, यह उम्मीद परिणाम (दाएं क्लिक करें घटना पर कोई फायरिंग) होनी चाहिए।

+1

हाँ, लेकिन यह 'लाइव()' के उद्देश्य को हरा देता है, है ना? – nickf

+0

सच है, लेकिन लाइव क्लिक()) सामान्य क्लिक() से भिन्न रूप से कार्य करता है जिसे आप निर्धारित कर सकते हैं कि कौन सा बटन दबाया गया था, लेकिन फिर आपको यह जानने की ज़रूरत है कि कौन सा ब्राउज़र उपयोग किया गया था (IE नए संस्करणों की तुलना में पिछले संस्करणों में अलग-अलग कार्य करता है और सभी अन्य ब्राउज़र 'सही' तरीके से कार्य करते हैं)। यह समय के लिए एक और अधिक सुरुचिपूर्ण समाधान है। – SeanJA

0

मैंने इसे mousedown घटनाओं का उपयोग करके हल किया। मेरी स्थिति में mousedown और क्लिक के बीच भेद कोई फर्क नहीं पड़ता।

संबंधित मुद्दे