2010-01-09 8 views
25

मेरे पास एक चुनिंदा फ़ील्ड है जो गतिशील रूप से अजाक्स कॉल के साथ आबादी वाला है जो सभी HTML चयन विकल्पों को वापस देता है। यहां PHP का हिस्सा है जो सिर्फ चयन टैग गूंजता है और प्रत्येक विकल्प/मान को गतिशील रूप से भरता है।Jquery .change() फ़ंक्शन गतिशील रूप से आबादी वाले SELECT सूची के साथ काम नहीं कर रहा है

echo "<select name='player1' class='affector'>"; 
echo "<option value='' selected>--".sizeof($start)." PLAYERS LOADED--</option>"; 

foreach ($start as $value) { 
    echo "<option value='".$value."'>".$value."</option>"; 
} 
    echo "</select>"; 
} 

के बाद इस सूची से भर जाता है, मैं एक परिवर्तन घटना कॉल करने के लिए कोशिश कर रहा हूँ ताकि जब भी डिफ़ॉल्ट विकल्प का चयन सूची में या एक ही कक्षा के साथ एक पाठ क्षेत्र में बदल दिया गया है, यह एक रेडियो बटन को निष्क्रिय फॉर्म के दूसरे हिस्से में सेट करें।

$('.affector').change(function(){ 
     $(this).parents('tr').find('input:radio').attr('disabled', false); 
}); 

किसी कारण से (आप प्रारंभिक सवाल मैं काम कर रहा here कार्यक्षमता के इस भाग प्राप्त करने के लिए कहा देख सकते हैं), भले ही मैं चुनिंदा क्षेत्र उचित वर्ग के नाम (affector) देते हैं, जब मैं विभिन्न विकल्पों का चयन करें क्षेत्र में, फॉर्म के अन्य भाग अक्षम नहीं होते हैं। एक ही कक्षा के साथ स्थिर पाठ क्षेत्र ठीक काम करता है। मैं उलझन में हूं।

कोई विचार?

+3

त्वरित टिप, 'गूंज के बजाय', कोशिश: 'गूंज" < विकल्प मान = '$ मूल्य'> "'। यदि आप किसी सरणी तक पहुंच रहे हैं, तो आप 'echo "<विकल्प value =' {$ value [0]} '>" – Skilldrick

उत्तर

20

बस अपने आखिरी सवाल पर टिप्पणी की है ... यहाँ मैं क्या कहा है:

उपयोग jQuery अपने ajax सफलता समारोह में

function addSelectChange() { 
    $('select').bind('change', function() { 
     // yada yada 
    }); 
} 

कॉल addSelectChange बाँध। यह चाल करना चाहिए। JQuery लाइव इवेंट पर भी एक नज़र डालें (जब आप बाद के प्रोजेक्ट या कुछ में सभी मौजूदा और भविष्य के डीओएम तत्वों के लिए ईवेंट सेट करना चाहते हैं)। दुर्भाग्य से परिवर्तन घटना और कुछ अन्य अभी तक लाइव के साथ समर्थित नहीं हैं। बाध्य दूसरी सबसे बड़ी चीज

+0

भयानक उत्तर !!! तुरंत मदद की! –

3

आइटम जो गतिशील डोम में डाला जाता है के लिए, उनके घटनाओं

$('.selector').bind('change',function() { doWork() }); 

साथ बाध्य किया जाना चाहिए इसका कारण यह है कि जब आप $(function(){}); चलाने के लिए और $.click या $.change, आदि का उपयोग कर की घटनाओं के लिए बाध्य है, तो आप करने के लिए घटनाओं के लिए बाध्यकारी हैं तत्व पहले से ही डोम में मौजूद है। इसके बाद आप जो भी मैनिप्ल्यूशन करते हैं वह $(function(){}); कॉल में जो कुछ भी होता है उससे प्रभावित नहीं होता है। $.bind आपके पृष्ठ को आपके चयनकर्ता के साथ-साथ वर्तमान में भविष्य के तत्वों को देखने के लिए कहता है।

+0

दोनों .change और .bind एक ही तरीके से काम कर सकते हैं। वे केवल उन तत्वों से जुड़ जाएंगे जो वर्तमान में डोम में हैं। – Anurag

+0

@anurag - गलत। यदि दोनों तत्व पहले से ही डोम में हैं, तो वे वैसे ही काम करते हैं। लेकिन .change डीओएम में नए तत्वों को बाध्य नहीं करेगा (यही कारण है कि ओपी सवाल पूछ रहा है ...), बाइंड मौजूदा और भविष्य की घटनाओं को तत्वों से जोड़ देगा। – Jason

+0

@ जेसन: परीक्षण करना मुश्किल नहीं है .. इस छोटे से HTML स्निपेट (http://slexy.org/raw/s2XA8QihVm) देखें, मैंने परीक्षण करने के लिए लिखा है कि भविष्य में डोम तत्वों के लिए 'बाइंड' काम करता है और यह नहीं करता है । इसके अलावा यह jQuery के स्रोत से लिया जाता है, यह मूल रूप से 'परिवर्तन() ',' माउसओवर() ',' धुंध() 'आदि के लिए फ़ंक्शन कॉल को' बाध्य()' के लिए कॉल करता है। यहां jQuery के स्रोत से एक छोटा स्निपेट दिखाया गया है - http://slexy.org/view/s206rDeFeO या आप code.jQuery.com पर पूरे स्रोत को देख सकते हैं - http://code.jquery.com/jquery-latest। जे एस। और 'लाइव()' वह कार्य है जो वर्तमान और भविष्य दोनों घटनाओं से जुड़ा हुआ है। – Anurag

1

.live कोशिश: http://docs.jquery.com/Events/live

डॉक्स से: सभी मौजूदा के लिए एक घटना (क्लिक) की तरह करने के लिए कोई हैंडलर बांधता - और भविष्य - मिलान किया तत्व। कस्टम घटनाओं को भी बांध सकते हैं।

+0

** "वर्तमान में समर्थित नहीं है: ... बदलें ..." ** – Sampson

+0

ढेर ओवरफ्लो असफल! –

5

एक उदाहरण .live का उपयोग कर()

$('#my_form_id select[name^="my_select_name"]').live('change', (function() { 
    console.log($("option:selected", this).val()); 
    }) 
); 
+1

यह .live() हमेशा गतिशील रूप से आबादी वाले क्षेत्र में, मेरे लिए काम करता है। –

+3

.live() अब बहिष्कृत है। '$ (दस्तावेज़) .on (" बदलें ", '# my_form_id का चयन करें [name^=" my_select_name "]', function() {...}) ' – Seybsen

1

मैं समाधान के रूप में पाया केवल

<select id="myselect"></select> 
php/html फ़ाइल में

बनाने के लिए और फिर से इसके लिए विकल्पों उत्पन्न है ajax:

$.post("options_generator.php", function (data) { $("#myselect").append(data); }); 

केवल options_generator.php गूंज विकल्पों में:

echo "<option value='1'>1</option>"; 
echo "<option value='2'>2</option>"; 
6

तारीख जवाब देने के लिए ऊपर एक और अधिक बारे में ..

के बाद से तत्वों द्वारा डायनामिक रूप से कर रहे हैं, तो आप event delegation के लिए देख रहे हैं।

.live()/.bind()/.delegate() का उपयोग न करें। आपको .on() का उपयोग करना चाहिए।

jQuery API docs के अनुसार:

jQuery 1.7 के रूप में, .on() विधि एक दस्तावेज़ में ईवेंट हैंडलर्स संलग्न के लिए पसंदीदा तरीका है। पिछले संस्करणों के लिए, .bind() विधि का उपयोग इवेंट हैंडलर को सीधे तत्वों को जोड़ने के लिए किया जाता है। हैंडलर jQuery ऑब्जेक्ट में वर्तमान में चयनित तत्वों से जुड़े हुए हैं, इसलिए उन तत्वों को .bind() पर कॉल करने के बिंदु पर मौजूद होना चाहिए। अधिक लचीली घटना बाध्यकारी के लिए, .on() में ईवेंट प्रतिनिधिमंडल की चर्चा देखें।

इसलिए आप कुछ इस तरह का प्रयोग करेंगे: "< '।। $ मूल्य विकल्प मान =" "'>"

$(document).on('change', 'select', function (e) { 
    /* ... */ 
}); 
+1

हाँ) सभी परिदृश्यों के लिए है, स्थिर या गतिशील सामग्री :) – user889030

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