अद्यतन:(संक्षिप्त, बेला और इनाम)जावास्क्रिप्ट: इंटरनेट एक्सप्लोरर (प्रतिनिधिमंडल) में परिवर्तन घटना अनुकरण करने के लिए कैसे
यह सवाल बहुत अधिक ध्यान नहीं जा रहा है, इसलिए मैं जा रहा हूँ इस पर कुछ प्रतिनिधि खर्च करें। मुझे पता है कि मैं अपने उत्तरों और सवालों दोनों में अत्यधिक वर्बोज़ होने लगता हूं। यही कारण है कि मैं आगे बढ़ गया और this fiddle स्थापित किया, जो कि मेरे विचार में, वर्तमान में कोड के प्रकार का एक सभ्य प्रतिनिधित्व है जिसे मैं वर्तमान में change
ईवेंट के बगल में आने के लिए उपयोग कर रहा हूं। कुछ मुद्दों को हल करने का प्रयास कर रहा हूं:
pseudo-change
ईवेंट किसी चयनित तत्व पर आग नहीं लगाता है, जब तक कि यह फोकस न हो जाए। कुछ मामलों में ग्राहक को एक नया मूल्य चुनने पर पुनर्निर्देशित किया जाना चाहिए। मुझे यह कैसे हासिल होगा?- लेबलर क्लिक किए जाने पर हैंडलर दोनों को कॉल किया जाता है, साथ ही चेकबॉक्स स्वयं भी होते हैं। अपने आप में यही उम्मीद है कि आप इसकी अपेक्षा करेंगे, लेकिन घटना के कारण (AFAIK) यह निर्धारित करना असंभव है कि कौन सा तत्व क्लिक किया गया था। आईई की घटना वस्तु में
realTarget
संपत्ति नहीं है। - लेबल पर क्लिक करके
checked
- आईई में चेकबॉक्स का सेट बदलते समय, सभी ठीक है (हालांकि इसे कुछ ग़लत कामकाज की आवश्यकता है), लेकिन सीधे चेकबॉक्स पर क्लिक करते समय, हैंडलर को कॉल किया जाता है, लेकिन चेक की गई स्थिति अपरिवर्तित बनी हुई है, जब तक मैं दूसरी बार क्लिक नहीं करता। फिर मान बदलता है, लेकिन हैंडलर को नहीं कहा जाता है। - जब मैं एक अलग टैब पर स्विच करता हूं, और फिर वापस, हैंडलर को कई बार कहा जाता है। तीन बार यदि चेक की गई स्थिति वास्तव में बदल जाती है, तो दो बार अगर मैं केवल एक बार चेकबॉक्स पर क्लिक करता हूं।
कोई भी जानकारी जो ऊपर दिए गए एक या अधिक मुद्दों को हल करने में मेरी सहायता कर सकती है, उसकी सराहना की जाएगी। कृपया, मैं jQuery टैग जोड़ने के लिए नहीं भूल गया, मुझे शुद्ध जेएस पसंद है, इसलिए मैं एक शुद्ध जेएस उत्तर की तलाश में हूं।
मेरे पास 250 से अधिक चुनिंदा तत्वों के साथ एक वेब पेज है, और 20 ~ 30 चेकबॉक्स हैं। मुझे उपयोगकर्ताओं के कार्यों को ट्रैक करना होगा, और उचित कार्रवाई करना होगा। इसलिए मेरे लिए परिवर्तन कार्यक्रम का प्रतिनिधि होना काफी स्वाभाविक है, बल्कि सैकड़ों श्रोताओं, आईएमएचओ को जोड़ना।
बेशक, आईई-कॉम्पनी नीति: आईई 8 को समर्थित होना है- जब मुझे इसकी आवश्यकता हो तो एक्सचेंज ईवेंट को आग नहीं लगती है। तो मैं नकली एक अस्थायी घटना की कोशिश कर रहा हूँ। जो मैंने अभी तक किया है वह 1 चीज के अलावा काफी अच्छी तरह से काम कर रहा है जो वास्तव में मुझे खराब करता है।
मैं घटनाओं को पंजीकृत करने के लिए onfocusin
और onfocusout
का उपयोग कर रहा हूं। कुछ मामलों में, जब उपयोगकर्ता किसी चयनित तत्व से नया मान चुनता है, तो स्क्रिप्ट तुरंत प्रतिक्रिया देनी चाहिए। हालांकि, जब तक चयन फोकस नहीं खोला है, यह नहीं होगा।
यहाँ मैं अब तक के साथ आया है:
i = document.getElementById('content');
if (!i.addEventListener)
{
i.attachEvent('onfocusin',(function(self)
{
return function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
switch (target.tagName.toLowerCase())
{
case 'input':
if (target.getAttribute('type') !== 'checkbox')
{
return true;
}
return changeDelegator.apply(self,[e]);//(as is
case 'select':
self.attachEvent('onfocusout',(function(self,current)
{
return function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
if (target !== current)
{
return;
}
self.detachEvent('onfocusout',arguments.callee);//(remove closure
return changeDelegator.apply(self,[e]);
}
})(self,target));
default: return;
}
}
})(i));//(fake change event, buggy
}
else
{//(to put things into perspective: all major browsers:
i.addEventListener('change',changeDelegator,false);
}
मैं onfocusin
हैंडलर के अंदर एक और घटना श्रोता, onclick
घटना के लिए बाध्य संलग्न की कोशिश की है। इसने onfocusout
घटना को निकाल दिया जो किसी भी विकल्प पर केंद्रित है एटीएम। एकमात्र समस्या यह है कि 99.9% उपयोगकर्ता एक चयन पर क्लिक करेंगे, इसलिए focusin
घटना भी एक ऑनक्लिक आग लगती है।
राउंड प्राप्त करने के लिए, मैंने बंद कर दिया, और वर्तमान चयन-इन-फोकस पारित किया और तर्क के रूप में इसका मूल मूल्य है।लेकिन कुछ उपयोगकर्ता अपने कीबोर्ड का उपयोग करते हैं, और ये उपयोगकर्ता अक्सर मूल्य को बदलने के बिना अगले चयन बॉक्स पर टैब करते हैं। प्रत्येक बार एक नया ऑनक्लिक श्रोता बाध्यकारी ... मुझे विश्वास है कि है सभी e.type
की जांच करने और उन्हें अलग से इलाज करने के लिए एक आसान तरीका होने के लिए है।
बस एक उदाहरण के रूप: एक अतिरिक्त onclick
श्रोता के साथ कोड: सभी कोड पहले टुकड़ा के रूप में ही है, इसलिए मैं केवल case 'select':
ब्लॉक
case 'select':
self.attachEvent('onfocusout',(function(self,current)
{
return function(e)
{
e = e || window.event;//(IE...
var target = e.target || e.srcElement;
if (!(target === current))
{
return;
}
self.detachEvent('onfocusout',arguments.callee);//(remove closure
return changeDelegator.apply(self,[e]);
};
})(self,target));
self.attachEvent('onclick',(function(self,current,oldVal)
{
return function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
if (target.tagName.toLowerCase() === 'option')
{
while(target.tagName.toLowerCase() !== 'select')
{
target = target.parentNode;
}
}
if (target !== current)
{//focus lost, onfocusout triggered anyway:
self.detachEvent('onclick',arguments.callee);
return;
}
var val = target.options[target.selectedIndex].innerHTML;//works best in all browsers
if (oldVal !== target.options[target.selectedIndex].innerHTML)
{
self.detachEvent('onclick',arguments.callee);
return target.fireEvent('onfocusout');
}
};
})(self,target,target.options[target.selectedIndex].innerHTML));
default: return;
1. हां, मुझे इसके बारे में निश्चित है: परिवर्तन घटना आईई 8 में निकाल दी गई है, लेकिन यह बुलबुला नहीं है। यह [एक ज्ञात समस्या] (http://stackoverflow.com/questions/5146784/make-form-elements-onchange-bubble-in-internet-explorer) 2. परिवर्तन हैंडलर दोनों ही मामलों में कहा जाता है, जो वह नहीं है मुसीबत। हालांकि लेबल पर क्लिक करते समय, चेक किए गए राज्य को बदलने के बाद हैंडलर को कॉल किया जाता है, जबकि चेकबॉक्स सीधे क्लिक होने पर चेक की गई स्थिति बदलती जा रही है। तो यदि 'target.checked === true', क्या यह अभी चेक किया गया है, या यह अनचेक किया जा रहा है? कहने का कोई तरीका नहीं है। वर्णों से बाहर चल रहा है –
3. धुंध और फोकस जोड़ना आईई को दुर्घटनाग्रस्त कर देता है: ध्यान दें कि, 'बदले' की वजह से बुलबुला नहीं है, मैं 'ऑनफोकसिन' और 'ऑनफोकसआउट' घटनाओं का उपयोग कर रहा हूं। हैंडलर blurs, और केंद्रित है, तो यह सिर्फ खुद infinitly 4. बुला पर रखेंगे और हैंडलर से मैं दोनों का मतलब: कडाई के साथ 'changeDelegator' सिर्फ एक समारोह है, लेकिन एक मैं संचालकों 'संदर्भ (' changeDelegator में कहते हैं। लागू करें (यह, [ई]); '), इसलिए मैं इसे वास्तविक हैंडलर का विस्तार/निरंतरता मानता हूं। मुझे पता है कि जब टैब _revived_ है, तो 'फोकसिन' निकाल दिया जाता है, लेकिन प्रतिनिधिमंडल फ़ंक्शन द्वारा इलाज की जाने वाली प्रत्येक घटना के लिए इसे निकाल दिया जाता है। अक्षर .... –
आखिरी चीज़ से मेरा क्या मतलब है: मैं एक चेकबॉक्स पर क्लिक करता हूं (हैंडलर निकाल दिया जाता है, लेकिन चेक की गई स्थिति नहीं बदली जाती है!), अगर मैं दूसरी बार उस चेकबॉक्स पर क्लिक करता हूं, तो हैंडलर हैन नहीं कहा जाता है, लेकिन चेक की गई स्थिति सभी एक ही बदल जाती है। अगर मैं इसे दूसरी बार क्लिक नहीं करता हूं, लेकिन टैब स्विच करता हूं और फिर से वापस करता हूं, तो 'फोकसिन' ईवेंट उस चेकबॉक्स के लिए _not_ कहलाता है जिसे मैंने एक बार क्लिक किया था। सचमुच अजीब। प्रदर्शन मोर्चे पर: एक बड़ा अंतर है, खासकर जब _not_ इसे V8 पर चला रहा है। पूरे पृष्ठ पर प्रत्येक तत्व को जोड़ने से 333 तक बढ़ जाएगा (केवल उन्हें गिनें) elems! chars ... –