2010-10-22 20 views
5

मेरे पास एक इनपुट फ़ील्ड है, मैं एक नया मान असाइन करना चाहता हूं और एक .onchange() ईवेंट को आग लगाना चाहता हूं। मैंने निम्नलिखित किया:जावास्क्रिप्ट मैन्युअल रूप से फायरिंग .ऑनचेंज() इवेंट

document.getElementById("range").value='500'; 
document.getElementById("range").onchange(); 

मेरी इनपुट आईडी कहां है।

Uncaught TypeError: Cannot read property 'target' of undefined 

वहाँ 'लक्ष्य' को परिभाषित करने का कोई तरीका है: मैं निम्नलिखित त्रुटि मिलती है? धन्यवाद

उत्तर

8

target के बारे में त्रुटि यह है कि इवेंट हैंडलर में कोड है जो परिवर्तन घटना से जुड़े Event ऑब्जेक्ट की target संपत्ति को पढ़ने का प्रयास कर रहा है। तुम एक छद्म-घटना में गुजर यह बेवकूफ बनाने की कोशिश कर सकते हैं:

var range= document.getElementById('range'); 
range.onchange({target: range}); 

या, यदि आप, this बजाय event.target उपयोग करने के लिए हैंडलर कोड बदल सकते हैं।जब तक आप प्रतिनिधिमंडल का उपयोग नहीं कर रहे हैं (माता-पिता से बच्चे के ऑब्जेक्ट पर परिवर्तन घटनाओं को पकड़ना, कुछ ऐसा जो घटनाओं के लिए परेशानी है क्योंकि आईई उन्हें 'बबल' नहीं करता है), परिवर्तन घटना का लक्ष्य हमेशा ईवेंट हैंडलर का तत्व होता है event.target अनावश्यक बनाने पर पंजीकृत था।

यदि ईवेंट हैंडलर के target की तुलना में अधिक गुणों का उपयोग करता है तो आपको अधिक नकली करने की आवश्यकता होगी, या घटनाओं को प्रेषित करने के लिए 'वास्तविक' ब्राउज़र इंटरफ़ेस के लिए जाना होगा। यदि ईवेंट श्रोताओं का उपयोग किया जा सकता है तो यह भी आवश्यक होगा (addEventListener, या attachEvent आईई में) क्योंकि वे सीधे onchange संपत्ति पर दिखाई नहीं देंगे। यह ब्राउज़र-निर्भर (मानकों के लिए आईई, dispatchEvent के लिए fireEvent) है और पुराने या अधिक अस्पष्ट ब्राउज़र पर उपलब्ध नहीं है।

6

fireEvent या dispatchEvent (ब्राउज़र के आधार पर) का उपयोग करते हुए घटना को बढ़ाने के लिए प्रयास करें:

document.getElementById("range").value='500'; 
if (document.getElementById("range").fireEvent) { 
    document.getElementById("range").fireEvent("onclick"); 
} else if (document.getElementById("range").dispatchEvent) { 
    var clickevent=document.createEvent("MouseEvents"); 
    clickevent.initEvent("click", true, true); 
    document.getElementById("range").dispatchEvent(clickevent); 
} 
+0

मुझे लगता है कि 'fireEvent() 'एक आईई-केवल चीज है। मानक-अनुरूप ब्राउज़र 'dispatchEvent() 'का उपयोग करते हैं। – Pointy

+0

मुझे "Uncaught TypeError: ऑब्जेक्ट # <एक HTMLInputElement> में कोई 0 विधि नहीं है 'fireEvent'" इस – Mircea

+0

@ पॉइंटी के साथ त्रुटि: आप सही हैं, मैंने अपडेट किया - धन्यवाद –

0

यह मेरे लिए काम करने लगता है (इस fiddle देखें)। क्या आपके पास कोई अन्य कोड है जो समस्या हो सकती है? आपने अपना आदान-प्रदान हैंडलर कैसे परिभाषित किया?

क्या आप अपने विनिमय हैंडलर में e.target को कॉल कर रहे हैं? मुझे संदेह है कि यह समस्या हो सकती है ... चूंकि आप प्रोग्रामेटिक रूप से परिवर्तन कर रहे हैं, वहां कोई संबंधित विंडो ईवेंट नहीं है।

2

से: http://www.mail-archive.com/[email protected]/msg44887.html

Sometimes it's needed to create an event programmatically. (Which is different from running an event function (triggering)

This can be done by the following fire code

> var el=document.getElementById("ID1") 
> 
> fire(el,'change') 
> 
> 
> function fire(evttype) { 
>  if (document.createEvent) { 
>   var evt = document.createEvent('HTMLEvents'); 
>   evt.initEvent(evttype, false, false); 
>   el.dispatchEvent(evt); 
>  } else if (document.createEventObject) { 
>   el.fireEvent('on' + evttype); 
>  } } looks like this trick is not yet in jQuery, perhaps for a 
> reason? 
2

आम तौर पर, अपने कोड ठीक काम करना चाहिए। हालांकि, कुछ और समस्या हो रही है जो समस्या जारी कर रही है।

  • आप उन दो पंक्तियों को कहां चलाते हैं?
  • क्या आप सुनिश्चित हैं कि range आईडी के साथ तत्व कोड चलाते समय लोड किया जाता है (उदाहरण के लिए आप इसे document.ready में चलाते हैं)।
  • क्या आप सुनिश्चित हैं कि आपके पास केवल एक तत्व है जो पृष्ठ पर range है?
  • आपका onchange() फ़ंक्शन कर रहा है ( यहां पोस्ट करने में सहायक हो सकता है)?

    http://api.jquery.com/change/

    लेकिन जैसा कि मैंने उल्लेख किया है, अपने मामले काम करना चाहिए

    $('#range').trigger('change'); 
    

    या सिर्फ

    $('#range').change(); 
    
    :

इसके अलावा, मैं jQuery (यदि संभव हो) का उपयोग कर की सिफारिश करेंगे ठीक है: http://jehiah.cz/a/firing-javascript-events-properly

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