2010-05-20 5 views
18

मुझे URL के खंड पहचानकर्ता में परिवर्तनों की निगरानी करने के लिए जावास्क्रिप्ट हैशचेंज ईवेंट का उपयोग करने में रूचि है। मुझे Really Simple History और इसके लिए jQuery प्लगइन के बारे में पता है। हालांकि, मैं इस निष्कर्ष पर पहुंचा हूं कि मेरी विशेष परियोजना में यह किसी अन्य जेएस फ़ाइल के अतिरिक्त ओवरहेड के लायक नहीं है।किसी दिए गए जावास्क्रिप्ट ईवेंट के लिए समर्थन का पता लगाना?

इसके बजाय मैं "प्रगतिशील वृद्धि" मार्ग लेना चाहता हूं। यही है, मैं यह जांचना चाहता हूं कि हैशचेंज ईवेंट विज़िटर के ब्राउज़र द्वारा समर्थित है या नहीं, और कोर कोड के बजाय एक वृद्धि के रूप में उपलब्ध होने पर इसका उपयोग करने के लिए अपना कोड लिखें। आईई 8, फ़ायरफ़ॉक्स 3.6, और क्रोम 4.1.249 इसका समर्थन करते हैं, और यह मेरी साइट के ट्रैफ़िक का लगभग 20% है।

तो, ओह ... क्या यह जांचने का कोई तरीका है कि कोई ब्राउज़र किसी विशेष ईवेंट का समर्थन करता है या नहीं?

धन्यवाद।

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; 
})(); 

उपयोग::

if (isEventSupported('hashchange')) { 
    //... 
} 

इस तकनीक है

+0

FYI करें, वाक्यांश आप देख रहे हैं "प्रगतिशील वृद्धि" नहीं है, लेकिन बल्कि "सुंदर गिरावट"। प्रगतिशील वृद्धि तब होती है जब आप अपनी वेबसाइट को सभी उपयोगकर्ताओं के लिए सुलभ बनाते हैं लेकिन उपयोगकर्ताओं के एक और विशिष्ट समूह (जावास्क्रिप्ट-सक्षम, एचटीएमएल 5-समर्थन आदि) में विशेषताओं को जोड़ते हैं। गहन गिरावट तब होती है जब आप कुछ कार्यक्षमता पर निर्भर करते हैं, लेकिन यदि ग्राहक द्वारा समर्थित नहीं है तो बैकअप विधि लें। ऐसा नहीं है की ये मैंने नहीं रखता। :) –

+4

हम्म। मैं तर्क दूंगा कि "खूबसूरत गिरावट" का अर्थ है कि एक वेबसाइट तब भी काम करती रहती है जब कार्यक्षमता सामान्य रूप से निर्भर करती है अनुपलब्ध है। इसके विपरीत, "प्रगतिशील वृद्धि" तब होती है जब कोई साइट अतिरिक्त सुविधाओं को सक्षम करती है, जिस पर निर्भर नहीं होती है, केवल तभी जब उपयोगकर्ता एजेंट उनका समर्थन करता है। मैं इस विशेष कोड को इस तरह से लिखने की योजना बना रहा हूं कि यह हैशचेंज ईवेंट उपलब्ध होने तक location.hash प्रॉपर्टी को तब तक संशोधित नहीं करता है। तो यह एक प्रगतिशील वृद्धि है। और हाँ, यह वास्तव में महत्वपूर्ण नहीं है - वे सिर्फ एक सिक्के के दो पक्ष हैं। – Will

उत्तर

23

ठीक है, सबसे अच्छा तरीका सूँघने ब्राउज़र के माध्यम से जा नहीं है, Juriy Zaytsev (@kangax) घटना समर्थन का पता लगाने के लिए एक वास्तव में उपयोगी विधि बनाया अब jQuery जैसे कुछ पुस्तकालयों में उपयोग किया जाता है।

और पढ़ें यहाँ:

if ("onhashchange" in window) { 
    alert("The browser supports the hashchange event!"); 
} 

यह भी IE8 और क्रोम 5 बीटा में काम करता है (मैं परीक्षण नहीं किया:

+0

यह एक बहुत ही रोचक विधि है ... मुझे विशेष रूप से देखने की अतिरिक्त जांच पसंद है कि 'वापसी' '' स्वचालित रूप से किसी फ़ंक्शन में परिवर्तित हो जाती है। – gnarf

+0

यह सबसे मजबूत विधि की तरह दिखता है। इसे पोस्ट करने के लिए धन्यवाद!JQuery का उल्लेख करने के लिए – Will

+3

+1, [jQuery वास्तव में सबसे अच्छा है, यह सभी प्रकार की ब्राउज़र समस्याओं को हल करता है और यह भी अच्छा है] (http://www.doxdesk.com/img/updates/20091116-so-large.gif) –

13

Mozilla documentation निम्नलिखित पता चलता है क्रोम 4.1), और ओपेरा और सफारी में सही ढंग से विफल रहता है।

+0

बहुत सुरुचिपूर्ण जोड़ना चाहिए। मैं पोस्ट किए गए दूसरे उत्तर से कुछ विचारों के साथ इस संशोधित संस्करण का उपयोग कर सकता हूं। धन्यवाद। – Will

+0

दृश्यता परिवर्तन घटना के लिए काम नहीं करता है। – lsborg

0

यहाँ answer provided by CMS एक संशोधन है, जो किसी अन्य रूप में एक समारोह है, जो मुझे लगता है कि काम करेगा शामिल नहीं करता है:

function event_exists(eventName){ 
    if(typeof(eventName)!='string' || eventName.length==0)return false; 
    var TAGNAMES = { 
     'select':'input','change':'input', 
     'submit':'form','reset':'form', 
     'error':'img','load':'img','abort':'img' 
    } 
    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; 
} 
संबंधित मुद्दे