2009-04-20 14 views
19

जब मैं replaceWith डोम से बाहर लाने के लिए एक तत्व, तो replaceWith इसे वापस लेता है, इसमें पंजीकृत घटनाएं आग नहीं होती हैं। मुझे बरकरार रहने के लिए घटनाओं की आवश्यकता है।घटनाओं के बाद पंजीकरण नहीं कर रहा है

var replacement = $(document.createElement('span')); 
var original = $(this).replaceWith(replacement); 

replacement 
    .css('background-color', 'green') 
    .text('replacement for ' + $(this).text()) 
    .click(function() { 
     replacement.replaceWith(original); 
    }); 

Live demo

डेमो में, जब आप एक तत्व पर क्लिक करें, यह replaceWith का उपयोग कर एक और तत्व साथ बदल दिया है:

यहाँ मेरी जावास्क्रिप्ट है। जब आप नए तत्व पर क्लिक करते हैं, तो इसे replaceWith का उपयोग करके मूल तत्व के साथ प्रतिस्थापित किया जाता है। हालांकि, क्लिक हैंडलर अब और काम नहीं करता है (जहां मुझे लगता है कि यह चाहिए)।

+1

क्या आपने ईवेंट रीटैचमेंट का उपयोग करके समाप्त किया था, या क्या आप कभी भी लाइव इवेंट्स काम करने में सक्षम थे? मैं वही काम कर रहा हूं, और आपके अनुभव से सीखना अच्छा लगेगा। –

+0

@ एरिक टी, मुझे खेद है, लेकिन मैं ईमानदारी से याद नहीं कर सकता। मैंने लगभग दो साल पहले इस सवाल से पूछा था। मुझे लगता है कि '$ .fn.live' का उपयोग नहीं किया गया क्योंकि मैं वास्तविक तत्वों से निपट रहा था, चयनकर्ता नहीं। ('$ .fn.delegate' (जो तब अस्तित्व में नहीं था) आपके लिए 'लाइव' विकल्प के रूप में काम कर सकता है।) मेरे द्वारा चुने गए उत्तर के कारण, मुझे लगता है कि मैंने इवेंट हैंडलर को दोबारा जोड़ दिया है। आप तत्व को गहराई से क्लोन करने का प्रयास कर सकते हैं (जो आईआईआरसी नवीनतम jQuery में इवेंट हैंडलर रख सकता है)। – strager

उत्तर

11

क्योंकि जब आप मूल तत्व को प्रतिस्थापित करते हैं, तो इसके लिए बाध्य घटनाएं हटा दी जाती हैं। आप replacement.replaceWith(original) करने के लिए कॉल के बाद original पर click ईवेंट हैंडलर फिर से संलग्न करना होगा: live() और bind() पदावनत किया गया है, में:

$(function() 
{ 
    function replace() 
    { 
     var replacement = $(document.createElement('span')); 
     var original = $(this).replaceWith(replacement); 

     replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .click(function() 
     { 
      replacement.replaceWith(original); 
      original.click(replace); 
     }); 
    } 

    $('.x').click(replace); 
}); 
+2

मेरी इच्छा है कि ऐसा करने का एक स्वचालित/सुरुचिपूर्ण तरीका हो। मुझे लगता है कि इस समाधान को करना होगा। – strager

+1

@strager: आप मैट के लाइव इवेंट सुझाव का प्रयास कर सकते हैं, या अपने उद्देश्यों के लिए एक लक्षित संस्करण लागू कर सकते हैं। * कुछ ब्राउज़रों * में गंभीर (और अप्रिय) साइड इफेक्ट्स हैं यदि आप अलग-अलग तत्वों से ईवेंट को अलग करने में विफल रहते हैं, तो आप वास्तव में इसे इस तरह से काम करना चाहते हैं। – Shog9

+0

यह समझ में नहीं आता है। तत्वों में डीओएम से जुड़े किए बिना घटनाएं हो सकती हैं, तो उन्हें डीओएम से क्यों हटाया जाएगा घटनाओं को हटा दें? कुछ प्रदर्शन विशिष्ट निर्णय होना चाहिए, अच्छी तरह से ... – Alex

3

live events आप के लिए

+0

मई मुझे क्या चाहिए मैं इस पर गौर करूंगा। – strager

+0

काम नहीं कर रहा था। अजीब। = एस – strager

+1

अब jQuery 1.9 के रूप में काम नहीं करता है – YaDa

4

अद्यतन क्या देख रहे हैं on() का पक्ष।

$(function() { 
$('.x').live('click', function() { 
    var replacement = $(document.createElement('span')); 
    var original = $(this).replaceWith(replacement); 

    replacement 
     .css('background-color', 'green') 
     .text('replacement for ' + $(this).text()) 
     .bind('click', function() { 
      replacement.replaceWith(original); 
     }); 
}); 
}); 

-Live घटना jQuery 1.3 और ऊपरी के साथ काम करता है:

आप live() और bind() घटनाओं का उपयोग कर सकते, यह अपने नए कोड है।

- यदि आप लाइव प्रचार का उपयोग die() फ़ंक्शन का उपयोग करना चाहते हैं।

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