2008-09-28 2 views
7

मैं निम्नलिखित समस्या है:जावास्क्रिप्ट घटनाक्रम: एक <input> नियंत्रण मूल्य में परिवर्तन के बारे में सूचित करना

मैं एक HTML पाठ बॉक्स (<input type="text">) जिनकी सामग्री एक स्क्रिप्ट मैं छू नहीं सकते द्वारा संशोधित कर रहे हैं (यह मेरा पेज है, लेकिन मैं बाहरी घटकों का उपयोग कर रहा हूँ)।

मैं हर बार मेरी स्क्रिप्ट में अधिसूचित किया जाना है कि पाठ बॉक्स परिवर्तन का मूल्य चाहते हैं, तो मैं यह करने के लिए प्रतिक्रिया कर सकते हैं।

मैं इस की कोशिश की है:

txtStartDate.observe('change', function() { alert('change' + txtStartDate.value) }); 

जो (जाहिर) काम नहीं करता। अगर मैं स्वयं कीबोर्ड के साथ टेक्स्टबॉक्स मान बदलता हूं और फिर फोकस को कहीं और स्थानांतरित करता हूं, तो यह केवल निष्पादित हो जाता है, लेकिन यदि स्क्रिप्ट मान बदलती है तो इसे निष्पादित नहीं किया जाता है।

एक और घटना मैं सुन सकते हैं है, कि मैं के बारे में पता नहीं कर रहा हूँ?



मैं प्रोटोटाइप पुस्तकालय का उपयोग कर रहा है, और मामले में यह प्रासंगिक है, बाहरी घटक पाठ बॉक्स मूल्य को संशोधित मूल तिथि चयनकर्ता (www.basicdatepicker.com)

उत्तर

5

आपने जैसा है उल्लिखित, परिवर्तन (और अन्य घटनाएं) केवल तब आग लगती है जब उपयोगकर्ता कुछ कार्रवाई करता है। चीजों को संशोधित करने वाली एक स्क्रिप्ट किसी भी घटना को नहीं रोकेगी। आपका एकमात्र समाधान नियंत्रण में कुछ हुक ढूंढना है जिसे आप अपने श्रोता को जोड़ सकते हैं।

यहाँ कैसे मैं यह कर देगी:

basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) { 
    myListener(year,month,day); 
    return orig(year,month,day,hide); 
}); 

(मैं घटक से परिचित नहीं हूँ) Firebug के साथ एक सरसरी नज़र पर आधारित है यही कारण है कि। यदि किसी दिनांक का चयन करने के अन्य तरीके हैं, तो आपको उन तरीकों को भी लपेटना होगा।

+1

क्या jQuery में ऐसा करने का कोई तरीका है? –

1

बाहरी जावास्क्रिप्ट को कैसे लिखा गया था, इस पर निर्भर करते हुए, आप हमेशा अपनी स्क्रिप्ट में बाहरी स्क्रिप्ट के प्रासंगिक हिस्सों को फिर से लिख सकते हैं और इसे बाहरी परिभाषा को ओवरराइट कर सकते हैं ताकि परिवर्तन ईवेंट ट्रिगर हो।

मैं स्क्रिप्ट है कि मेरे नियंत्रण से बाहर थे साथ कि इससे पहले ऐसा करने के लिए किया है।

तुम सिर्फ बाहरी समारोह को खोजने के लिए, एक ही नाम के साथ एक नया समारोह के रूप में अपनी संपूर्णता में इसे कॉपी फिर से लिखें क्या आप इसे करना चाहते हैं के लिए स्क्रिप्ट की जरूरत है, और।

पाठ्यक्रम अगर स्क्रिप्ट सही ढंग से बंद का उपयोग कर लिखा गया था, आप भी इसे आसानी से बदलने के लिए नहीं कर सकेंगे के

...

+0

मैंने इसके बारे में सोचा। मेरी समस्या यह है कि यह एक बड़ी मिनी स्क्रिप्ट है। बदलने के लिए सही जगह खोजने में मुझे घंटों लग सकते हैं। मैं इसमें शामिल होने का एक त्वरित तरीका ढूंढ रहा हूं। अगर मुझे 2 घंटे का समय लगेगा, तो मैं जिस छोटी सुविधा को करने की कोशिश कर रहा हूं वह प्रयास के लायक नहीं है :-) –

2

आईई एक onpropertychange घटना है जो इस उद्देश्य के लिए इस्तेमाल किया जा सकता है।

वास्तविक वेब ब्राउज़र (;) के लिए), DOMAttrModified mutation event है, लेकिन फ़ायरफ़ॉक्स में कुछ मिनटों के प्रयोग के लायक में, मैं इसे पाठ इनपुट पर आग लगने में सक्षम नहीं हूं जब मूल्य प्रोग्रामिक रूप से बदल जाता है (या नियमित कीबोर्ड इनपुट द्वारा), फिर भी अगर मैं इनपुट का नाम प्रोग्रामेटिक रूप से बदलता हूं तो यह आग लग जाएगा। अजीब तरह से...

आप प्राप्त है कि मज़बूती से काम कर रहा है, तो आप हमेशा से ही इनपुट के मूल्य नियमित रूप से मतदान कर सकता है नहीं कर सकते:

var value = someInput.value; 

setInterval(function() 
{ 
    if (someInput.value != value) 
    { 
     alert("Changed from " + value + " to " + someInput.value); 
     value = someInput.value; 
    } 
}, 250); 
+1

किसी तत्व तत्व की 'मान' गुण इसकी विशेषता' value = "से अलग है ... "' मान, जो केवल प्रारंभिक मान को निर्देशित करता है। स्क्रिप्ट या उपयोगकर्ता क्रिया द्वारा मान सेट करना 'मान' विशेषता (*) को अपडेट नहीं करता है, इसलिए कोई DOMAttrModified नहीं है। (*: आईई को छोड़कर, एक बग के कारण। लेकिन आईई DOMAttrModified का समर्थन नहीं करता है।) – bobince

0

की तरह कैसे नूह समझाया समस्या को हल हो रही के अलावा, आप भी सिर्फ एक टाइमर बना सकते हैं कि प्रत्येक कुछ सौ मिलीसेकंड मूल्य की जांच करता है।

0

मुझे दान द्वारा सुझाए गए तरीके से एक बार यूयूआई डेटाटेबल पेजिनेटर नियंत्रण को संशोधित करना पड़ा। यह क्रूर बल है, लेकिन यह मेरी समस्या को हल करने में काम किया। यही है, फ़ील्ड में विधि लिखने का पता लगाएं, इसके कोड की प्रतिलिपि बनाएँ और परिवर्तन ईवेंट को फायर करने वाला एक कथन जोड़ें और अपने कोड में बस उस परिवर्तन ईवेंट को संभालें। आपको मूल कार्य को उस नए संस्करण के साथ ओवरराइड करना होगा। मतदान, ठीक काम करते समय मुझे एक और अधिक संसाधन उपभोग समाधान लगता है।

4

addEventListener ("DOMControlValueChanged" को सक्रिय कर देगा जब एक नियंत्रण के मूल्य में परिवर्तन, भले ही वह एक स्क्रिप्ट द्वारा है।

addEventListener ("input" एक सीधा-उपयोगकर्ता द्वारा आरंभ DOMControlValueChanged की फ़िल्टर संस्करण है।

दुर्भाग्य से , DOMControlValueChanged केवल ओपेरा द्वारा समर्थित है वर्तमान और इनपुट घटना समर्थन वेबकिट में टूट गया है। इनपुट घटना भी फ़ायरफ़ॉक्स और ओपेरा में विभिन्न कीड़े है।

ये चीजें शायद बहुत जल्द एचटीएमएल 5 में साफ कर दिया जाएगा, Fwiw।

अद्यतन:

9/8/2012 के रूप में, DOMControlValueChanged समर्थन ओपेरा से हटा दिया गया है (क्योंकि यह एचटीएमएल 5 से हटा दिया गया था) और 'इनपुट' घटना समर्थन बहुत ब्राउज़रों (कम कीड़े सहित) अब में बेहतर है।

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