jQuery - hashchange घटना


86

मै इस्तेमाल कर रहा हूँ:

$(window).bind( 'hashchange', function(e) { });

किसी फ़ंक्शन को हैश परिवर्तन ईवेंट में बाँधने के लिए। यह IE8, फ़ायरफ़ॉक्स और क्रोम में काम करने लगता है, लेकिन सफारी में नहीं है और मैं IE के पुराने संस्करण में नहीं मानता हूं। इन ब्राउज़रों के लिए, मैं अपने जावास्क्रिप्ट कोड को निष्क्रिय करना चाहता हूं जो हैश और hashchangeईवेंट का उपयोग करता है ।

क्या jQuery के साथ एक तरीका है जो मुझे पता लगा सकता है कि क्या ब्राउज़र hashchangeघटना का समर्थन करता है ? शायद कुछ के साथ jQuery.support...


4
jQuery हैशचेंज घटना - IE8 में भी jQuery प्लगइन सही काम करता है। + इसे इस्तेमाल करना बहुत आसान है :)
enloz

जवाबों:


69

आप यह पता लगा सकते हैं कि ब्राउज़र घटना का समर्थन करता है या नहीं:

if ("onhashchange" in window) {
  //...
}

यह सभी देखें:


इसके लिए धन्यवाद और त्वरित प्रतिक्रिया के लिए।
इयान हर्बर्ट

19
ध्यान दें कि IE7 संगतता मोड में चल रहा IE8 विंडो में 'ऑनशास्कचेंज' के लिए सही रिपोर्ट करता है, भले ही वह घटना समर्थित न हो-jrom मोबाइल
विकास

35

2017 के रूप में यहां एक अद्यतन उत्तर, किसी को भी इसकी आवश्यकता होनी चाहिए, यह onhashchangeसभी प्रमुख ब्राउज़रों में अच्छी तरह से समर्थित है। देखें caniuse जानकारी के लिए। JQuery के साथ इसका उपयोग करने के लिए कोई प्लगइन की जरूरत नहीं है:

$( window ).on( 'hashchange', function( e ) {
    console.log( 'hash changed' );
} );

कभी-कभी मैं विरासत प्रणालियों में आता हूं जहां हैशबैंग URL का अभी भी उपयोग किया जाता है और यह मददगार है। यदि आप कुछ नया बना रहे हैं और हैश लिंक का उपयोग कर रहे हैं तो मैं आपको अत्यधिक सुझाव देता हूं कि आप इसके बजाय एचटीएमएल 5 पुशस्टैट एपीआई का उपयोग करने पर विचार करें।


2
यह अच्छी तरह से काम करता है, window.location.hashवर्तमान हैश का उपयोग करने के लिए।
डैनियल डेहर्स्ट


18

आपकी समस्या के लिए एक अलग दृष्टिकोण ...

हैशचेंज घटना को एक विधि से बांधने के 3 तरीके हैं:

<script>
    window.onhashchange = doThisWhenTheHashChanges;
</script>

या

<script>
    window.addEventListener("hashchange", doThisWhenTheHashChanges, false);
</script>

या

<body onhashchange="doThisWhenTheHashChanges();">

ये सभी Win 7 पर IE 9, FF 5, Safari 5 और Chrome 12 के साथ काम करते हैं।



3

मैं बस एक ही समस्या में भाग गया (IE7 में हैशचेंज घटना की कमी)। मेरे उद्देश्यों के लिए उपयुक्त वर्कअराउंड हैश-चेंजिंग लिंक के क्लिक इवेंट को बांधना था।

<a class='hash-changer' href='#foo'>Foo</a>

<script type='text/javascript'>

if (("onhashchange" in window) && !($.browser.msie)) { 

    //modern browsers 
    $(window).bind('hashchange', function() {
        var hash = window.location.hash.replace(/^#/,'');
        //do whatever you need with the hash
    });

} else {

    //IE and browsers that don't support hashchange
    $('a.hash-changer').bind('click', function() {
        var hash = $(this).attr('href').replace(/^#/,'');
        //do whatever you need with the hash
    });

}

</script>

1
आप एक हैश के साथ शुरुआत $('a[href^="#"]')करने के लिए लिंक प्राप्त करने के लिए उपयोग कर सकते हैं href, एक वर्ग जोड़ने की आवश्यकता से परहेज
Tobymackenzie

2

ध्यान दें कि IE 7 और IE 9 के मामले में अगर स्टेटमेन्ट विंडोज़ में "ऑनशॉस्कैप" के लिए सही होगा, लेकिन window.onhashchange कभी भी फायर नहीं करेगा, इसलिए इसके हैश को स्टोर करना बेहतर होगा और हर 100 मिलीसेकंड के बाद इसकी जांच करें कि क्या इसका बदलाव हुआ है या नहीं। IE के सभी संस्करणों के लिए।

    if (("onhashchange" in window) && !($.browser.msie)) { 
         window.onhashchange = function () { 
              alert(window.location.hash);             
         }            
         // Or $(window).bind( 'hashchange',function(e) {  
         //       alert(window.location.hash); 
         //   });              
    }
    else { 
        var prevHash = window.location.hash;
        window.setInterval(function () {
           if (window.location.hash != prevHash) {
              prevHash = window.location.hash;
              alert(window.location.hash);
           }
        }, 100);
    }

2
क्या ब्राउज़र को संभालने के लिए यह बहुत अधिक नहीं है? हर 100ms हैश परिवर्तन के लिए चुनाव करने के लिए?
एडडिजाइन

5
आपके नमूना कोड ने मेरे IE8 को सतर्क कर दिया जब तक मैंने टास्क मैनेजर नहीं खोला और प्रक्रिया को
खत्म कर

ऐसा इसलिए है क्योंकि "स्टोरहैश" के उपयोग के बजाय "प्रचलित" है और यह काम करेगा। वह मूल रूप से एक अलग चर नाम का उपयोग करता है कि यह कैसे घोषित किया गया है।
निक

2

हैश इवेंट के बजाय एक अलग तरीके का उपयोग करने के बारे में और पॉपस्टैट की तरह सुनने के लिए।

window.addEventListener('popstate', function(event)
{
    if(window.location.hash) {
            var hash = window.location.hash;
            console.log(hash);
    }
});

यह विधि अब तक की कोशिश की गई अधिकांश ब्राउज़रों में ठीक काम करती है।


1
पॉपस्टैट हैशचेंज की तुलना में भी नया है। उदाहरण के लिए, यह IE <10. में समर्थित नहीं है
आर्टुरो टोरेस सेंचेज


0

मुझे लगता है कि क्रिस हैयर के पास उस हैशिंग समस्या का समाधान है, उनके स्क्रेंकास्ट पर एक नज़र:

डायनामिक कंटेंट के साथ बेस्ट प्रैक्टिस


धन्यवाद, मैं उस पर गौर करूंगा।
इयान हर्बर्ट

0

सुविधा क्षमताओं का पता लगाने के लिए मॉडर्निज़र का उपयोग करें । सामान्य jQuery में ब्राउज़र सुविधाओं का पता लगाने की पेशकश की जाती है: http://api.jquery.com/jQuery.support/ । हालांकि, हैशचेंज सूची में नहीं है।

Modernizr की विकि पुराने ब्राउज़रों के लिए HTML5 क्षमताओं को जोड़ने के लिए पुस्तकालयों की एक सूची प्रदान करती है। हैशचेंज की सूची में प्रोजेक्ट HTML5 हिस्ट्री एपीआई के लिए एक पॉइंटर शामिल है , जो कि पुराने ब्राउज़र में व्यवहार का अनुकरण करने के लिए आवश्यक कार्यक्षमता प्रदान करता है।


0

यहाँ @ johnny.rodgers का अद्यतन संस्करण है

आशा किसी की मदद करती है।

// ie9 ve ie7 return true but never fire, lets remove ie less then 10
if(("onhashchange" in window) && navigator.userAgent.toLowerCase().indexOf('msie') == -1){ // event supported?
    window.onhashchange = function(){
        var url = window.location.hash.substring(1);
        alert(url);
    }
}
else{ // event not supported:
    var storedhash = window.location.hash;
    window.setInterval(function(){
        if(window.location.hash != storedhash){
            storedhash = window.location.hash;
            alert(url);
        }
    }, 100);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.