2012-10-18 35 views
5
के लिए फायरिंग नहीं

तो मैं निम्नलिखित संरचनाJquery .on ('परिवर्तन') गतिशील रूप से जोड़ा तत्वों

<div class="editCampaignBanner"> 
    <div> 
    <hr> 
    <label for="file">Upload a new image</label> 
    <input id="file" type="file" name="file" class="valid"> 
    <label for="NewImageURLs">Link URL (Optional)</label> 
    <input id="NewImageURLs" type="text" value="" name="NewImageURLs"> 
    <hr> 
    </div> 
</div> 

के साथ एक पृष्ठ मिल गया है और मैं कुछ jQuery इस प्रकार लिखा है:

$('div.editCampaignBanner input:file').on('change', function() { 
     var value = $(this).val(); 
     var div = $(this).parent(); 
     var html = '<div>'+ div.html() + '</div>'; 
     if (value.length > 0) { 
      div.after(html); 
     } 
     else if ($(this) > 1) { 
      div.remove(); 
     } 
    }); 

<div class="editCampaignBanner"> 
     <div> 
     <hr> 
     <label for="file">Upload a new image</label> 
     <input id="file" type="file" name="file" class="valid"> 
     <label for="NewImageURLs">Link URL (Optional)</label> 
     <input id="NewImageURLs" type="text" value="" name="NewImageURLs"> 
     <hr> 
     </div> 
     <div> 
     <hr> 
     <label for="file">Upload a new image</label> 
     <input id="file" type="file" name="file" class="valid"> 
     <label for="NewImageURLs">Link URL (Optional)</label> 
     <input id="NewImageURLs" type="text" value="" name="NewImageURLs"> 
     <hr> 
     </div> 
    </div> 

लेकिन अब, घटना जा रहा है फिर से के बावजूद:

इसलिए जब मैं फ़ाइल में एक तत्व में प्रवेश यह पिछले एक के तहत एक div उत्पन्न करता है .on() का उपयोग करके जिस्टर्ड div में दूसरी फ़ाइल इनपुट घटना को आग नहीं करता है। मैं क्या खो रहा हूँ?

उत्तर

10

बदलें

$('div.editCampaignBanner input:file').on('change', function() { 

$('div.editCampaignBanner').on('change', 'input:file', function() { 
+0

सही, तो आप एक चयनकर्ता के साथ दस्तावेज़ पर बाध्य! बढ़िया टा! – Liam

+1

जैसा कि आप 'div.editCampaignBanner' को हटाने के लिए प्रतीत नहीं होते हैं, आप इसे दस्तावेज़ के बजाय अपने' on' के आधार के रूप में उपयोग कर सकते हैं। –

1

द्वारा इस प्रयास करें:

$('div.editCampaignBanner').on('change','input:file', function() { 
     var value = $(this).val(); 
     var div = $(this).parent(); 
     var html = '<div>'+ div.html() + '</div>'; 
     if (value.length > 0) { 
      div.after(html); 
     } 
     else if ($(this) > 1) { 
      div.remove(); 
     } 
    }); 
2
$(document).delegate("div.editCampaignBanner input:file", "change", function() { 
    //code goes here 
}); 


$(document).on('change', 'div.editCampaignBanner input:file', function() { 
//code goes here 
}); 

सभी तत्वों को 012 से मेल के लिए एक या अधिक घटनाओं के लिए कोई हैंडलर संलग्नचयनकर्ता, अब या भविष्य में, रूट तत्वों के एक विशिष्ट सेट के आधार पर। JQuery 1.7 के रूप में, .delegate() को .on() विधि द्वारा हटा दिया गया है। हालांकि, पुराने संस्करणों के लिए, यह घटना प्रतिनिधिमंडल का उपयोग करने का सबसे प्रभावी माध्यम है। घटना बाध्यकारी और प्रतिनिधिमंडल पर अधिक जानकारी .on() विधि में है।

Differences Between jQuery .bind() vs .live() vs .delegate() vs .on()

+0

ओपी पहले से ही 'ऑन' का उपयोग करता है, क्यों 'प्रतिनिधि' का सुझाव देते हैं? –

+0

मैंने कहा कि दोनों संभव हैं। मुझे नहीं पता कि वह किस jQuery संस्करण का उपयोग कर रहा है। – Techie

+0

वह उपयोग करता है, तो जाहिर है कि उसके पास कम से कम 1.7 है। –

0

उपयोग हो सकता है $.live() jQuery विधि, अपने पदावनत लेकिन मेरे लिए काम करता है:

$('div.editCampaignBanner input:file').live('change', function() { 
     var value = $(this).val(); 
     var div = $(this).parent(); 
     var html = '<div>'+ div.html() + '</div>'; 
     if (value.length > 0) { 
      div.after(html); 
     } 
     else if ($(this) > 1) { 
      div.remove(); 
     } 
    }); 

अधिक जानकारी: http://api.jquery.com/live/

यदि आप नवीनतम प्रयोग पर अनिच्छुक रहे हैं (.on()) इस तरह इसका उपयोग करें:

function fileChanged(ele){ 
    var value = ele.val(); 
    var div = ele.parent(); 
    var html = '<div>'+ div.html() + '</div>'; 
    if (value.length > 0) { 
     div.after(html); 
    } 
    else if (ele > 1) { 
     div.remove(); 
    } 
    $('div.editCampaignBanner').unbind().on('change','input:file', function() { 
     fileChanged($(this)) 
    }); 
} 
$(function(){ 
    $('div.editCampaignBanner').on('change','input:file', function() { 
     fileChanged($(this)) 
    }); 
}); 
+0

बस ध्यान दें, JQuery 1.7 लाइव के रूप में वास्तव में समान है (http://www.jquery4u.com/jquery-functions/on-vs-live-review/#.UH-6cMW5_mc) लाइव के साथ महत्वपूर्ण समस्याएं हैं , इसलिए यह प्रतिस्थापन है – Liam