2012-08-29 22 views
8

मैं इस प्रश्न से शुरू करूंगा। जब किसी विशिष्ट ब्राउज़र में किसी सुविधा का एक बग्गी कार्यान्वयन होता है और आपके जावास्क्रिप्ट को यह जानने की आवश्यकता होती है कि वर्तमान ब्राउज़र में उस बग्गी कार्यान्वयन है या नहीं, तो यह वैकल्पिक रणनीति का उपयोग कर सकता है, तो आप कैसे पता लगा सकते हैं कि कार्यान्वयन बिना ब्राउज़र प्रकार के स्नीफिंग के बग़ी है (जिसे आम तौर पर बुरा माना जाता है)?ब्राउज़र पहचान के बिना "इनपुट" ईवेंट में छोटी गाड़ी व्यवहार की पहचान कैसे करें?

यहां पूरी स्थिति है।

मैं कुछ कोड एक <input type="text"> क्षेत्र के लिए उपयोगकर्ता परिवर्तन की अधिसूचना प्राप्त करने के लिए "input" event उपयोग करना चाहता है उस पर काम कर रहा था ("परिवर्तन" घटना की तुलना में अधिक रहते हैं काम करता है), लेकिन जब उस घटना समर्थित नहीं है, इसे इस्तेमाल करता है एक और अधिक जटिल योजना जिसमें अन्य कार्यक्रमों का समूह शामिल है।

चूंकि "इनपुट" ईवेंट केवल कुछ ब्राउज़रों में समर्थित है, इसलिए मैं ईवेंट के लिए फीचर डिटेक्शन करने के लिए एक तरीका खोज रहा हूं (ब्राउज़र उपयोगकर्ता एजेंट स्नीफिंग के बजाए) क्योंकि फीचर डिटेक्शन आम तौर पर करने का एक और मजबूत तरीका है बातें। इस तरह के रूप में, मैं वास्तव में करने के लिए this great article में आए और इस कोड को काम करने के लिए लगता है:

var isEventSupported = (function(){ 
    var TAGNAMES = { 
     'select':'input','change':'input', 
     'submit':'form','reset':'form', 
     'error':'img','load':'img','abort':'img' 
    } 
    function isEventSupported(eventName) { 
     var el = document.createElement(TAGNAMES[eventName] || 'div'); 
     eventName = 'on' + eventName; 
     var isSupported = (eventName in el); 
     if (!isSupported) { 
     el.setAttribute(eventName, 'return;'); 
     isSupported = typeof el[eventName] == 'function'; 
     } 
     el = null; 
     return isSupported; 
    } 
    return isEventSupported; 
    })(); 

फिर, मैं IE (आश्चर्य, आश्चर्य) के साथ समस्याओं का सामना किया। जबकि आईई "इनपुट" घटना का समर्थन करने के लिए purports करता है और यह ऊपर फीचर टेस्ट पास करता है और यह ज्यादातर समय काम करता है, आईई का समर्थन नरक के रूप में छोटी है। यह ईवेंट को ट्रिगर नहीं करता है जब उपयोगकर्ता बैकस्पेस कुंजी (अन्य गायब व्यवहारों के बीच) हिट करता है। इस प्रकार, मैं आईई में इस पर भरोसा नहीं कर सकता। इसलिए, मैंने इस अच्छे साफ कोड का निर्माण किया था जिसने "इनपुट" ईवेंट के लिए एक फीचर टेस्ट किया था और वर्तमान में और जब मौजूद नहीं था, तब यह बहुत ही आसान कार्यान्वयन का उपयोग करता था, जिसमें आठ अन्य घटनाओं की निगरानी करने के लिए इस बहुत ही कामकाजी काम का इस्तेमाल किया जाता था। अब, यह आईई में फंस गया है क्योंकि "इनपुट" घटना के लिए फीचर टेस्ट पास हो जाता है ताकि कोड इसका उपयोग करने का प्रयास कर सके, लेकिन यह नरक के रूप में छोटी है इसलिए यह काम नहीं करता है।

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

क्या ब्राउजर स्नीफिंग के अलावा "इनपुट" ईवेंट में छोटी गाड़ी व्यवहार की पहचान करने के लिए यहां कोई विकल्प हैं? यदि किसी को ब्राउजर स्नीफिंग करना पड़ता है, तो क्या उपयोगकर्ता एजेंट स्ट्रिंग के बजाय आईई को व्यवहार से पहचानने का कोई तरीका है जिसे स्वतंत्र रूप से धोखा दिया जा सकता है और सटीक होने की गारंटी नहीं है?

+1

एक अच्छा IE के साथ (शायद केवल?) बात [सशर्त टिप्पणियों] है (http://msdn.microsoft.com/en-us/library/ms537512.aspx) जहां डाल सकते हैं आपकी समस्या को हल करने के लिए आईई-विशिष्ट कोड। – some

+0

यहां एक अच्छा [ऑनइनपुट ईवेंट] है (http://help.dottoro.com/ljhxklln.php) आलेख। दुर्भाग्यवश आईई में एक अच्छा विकल्प प्रतीत नहीं होता है, इसलिए यदि आप इसका पता लगा सकते हैं, तो आप बहुत कुछ नहीं कर सकते हैं। वेब डेवलपर्स लंबे समय तक बिना इनपुट के कर रहे हैं, इसलिए यदि आप अपना प्रश्न यह बताते हैं कि आप क्या करने की कोशिश कर रहे हैं, तो विकल्प सुझाए जा सकते हैं। – RobG

+1

@RobG - मैं कुछ गतिशील व्यवहार को लागू करने की कोशिश कर रहा हूं जो कोई फर्क नहीं पड़ता कि कोई इनपुट फ़ील्ड कैसे बदला जाता है। वेब डेवलपर एक अपूर्ण कार्यान्वयन को स्वीकार कर विश्वसनीय 'इनपुट' ईवेंट के बिना कर रहे हैं जो ड्रैग/ड्रॉप पर ट्रिगर नहीं करता है या जब संदर्भ मेनू के माध्यम से फ़ील्ड बदल जाता है और इसी तरह। मैं पहले किया गया से बेहतर करने की कोशिश कर रहा हूँ। – jfriend00

उत्तर

0

आप एक क्रॉस-ब्राउज़र में रुचि रखते हैं "इनपुट परिवर्तन" घटना, यहाँ मेरी दिया गया है:

function onInputChange(domInput, callback) { 
    if (domInput.addEventListener) { 
     domInput.addEventListener('input', callback, false); // Firefox, etc. 
    } else if (domInput.attachEvent) { 
     domInput.attachEvent('onpropertychange', callback); // IE 
    } 
} 


प्रयोग उदाहरण:

सभी ब्राउज़रों में
var leInput = document.getElementById('myInput'); 
var leCallback = function() { 
    // awesome stuff here 
}; 

onInputChange(leInput, leCallback); 


काम करता है, कुंजीपटल इनपुट और प्रतिलिपि/पेस्ट का समर्थन करता है।

हालांकि उस शापित आईई 9 का अपवाद है, जो उस समय मौजूद नहीं था जब मैंने उपर्युक्त कोड लिखा था। क्या माइक्रोसॉफ्ट कभी भी अपनी बग फिक्सिंग पर विचार करेगा? :

var broken = false, 
     ta = angular.element('<textarea>').on('input', function(evt) { 
      broken = true; 
     }); 
    ta.attr('placeholder', 'IESUCKS'); 

तो आप के लिए जाँच कर सकते हैं "इनपुट घटना का समर्थन करता है और नहीं 'टूट' है" अपने कोड में: \

+1

Thx, ठीक वही नहीं जो मैं खोज रहा हूं और इसमें विशिष्ट समस्या है, मैंने आईई 9 में इस प्रश्न के बारे में पूछा जो 'addEventListener()' और 'इनपुट' ईवेंट दोनों का समर्थन करता है, लेकिन 'इनपुट' ईवेंट व्यवहार नरक के रूप में छोटी है। – jfriend00

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