2010-11-05 20 views
44

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

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

इस समय मेरा समाधान बहुत खराब है: सेटटाइमआउट में रीबाइंडिंग। क्या किसी के पास बेहतर विचार है?

$(window).unbind('hashchange', hashChanged); 
    window.location.hash = "!" + url; 
    setTimeout(function(){ 
     $(window).bind('hashchange', hashChanged); 
    }, 100); 


संपादित करें:
आमिर Raminfar के सुझाव मुझे एक समाधान है कि एक समय समाप्ति की आवश्यकता नहीं है करने के लिए कहा।

_ignoreHashChange = true; 
window.location.hash = "!" + url; 

और हैश बदल घटना से करता है:

function hashChanged(event){ 
    if(_ignoreHashChange === false){ 
     url = window.location.hash.slice(2); 
     fetchContent(url); 
    } 
    _ignoreHashChange = false; 
} 
+4

एक अच्छा, सरल उपाय है, तो आप बनाना चाहिए यह एक जवाब – Peter

+1

केवल एक चीज बाकी है यह जांचने के लिए कि नया हैश _ignoreHashChange = true सेट करने से पहले पुराने के बराबर नहीं है; – Kasheftin

+1

आप काउबॉय की बीबीक्यू लाइब्रेरी को देखना चाहते हैं जो आपको बैक एंड हैशचेंज पर सभी चीजों पर अच्छा नियंत्रण देता है: http://benalman.com/code/projects/jquery-bbq/docs/files/jquery-ba-bbq-js। एचटीएमएल – hybernaut

उत्तर

5

आप हो सकता है मैं एक वर्ग चर

_ignoreHashChange = false; 

जब मैं हैश चुपचाप बदलने के लिए मैं इस करना चाहती जोड़ा इस तरह का एक कार्य:

function updateHash(newHash){ 
    ... 
    oldHash = newHash 
} 
,210

फिर अपने setTimeOut में आप तो अब

function(){ 
    if(oldHash != currenHash){ 
    updateHash(currenHash); 
    } 
} 

करने की जरूरत है आप अद्यतन हैश मैन्युअल कॉल कर सकते हैं और यह घटना से चालू होने वाले नहीं किया जाएगा। आप अन्य चीजों को करने के लिए अद्यतन हैश में और अधिक पैरामीटर भी प्राप्त कर सकते हैं।

वैसे, क्या आपने jquery इतिहास प्लगइन देखा है? http://tkyk.github.com/jquery-history-plugin/

+0

इसे एक सेट अंतराल होना चाहिए, लेकिन हां, सिद्धांत रूप में यह काम करेगा। धन्यवाद। – SystemicPlural

+1

हां मैंने कई प्लगइन देखे हैं। वे मेरी जरूरतों के लिए भी बहुत फूला हुआ या छोटी गाड़ी हैं। – SystemicPlural

+0

आपने मुझे एक बेहतर समाधान के लिए प्रेरित किया जिसके लिए समय की आवश्यकता नहीं है। विवरण के लिए मेरे मुख्य पोस्ट में संपादन देखें। आपकी मदद के लिए धन्यवाद – SystemicPlural

5

आप history.replaceState इस्तेमाल कर सकते हैं और संलग्न हैश, hashchange ईवेंट सक्रिय करने के बिना वर्तमान URI को बदलने के लिए:

var newHash = 'test'; 

history.replaceState(null, null, document.location.pathname + '#' + newHash); 

JSFiddle example

+0

'history.replaceState' इतिहास में हैशचेंज को भी धक्का नहीं देता है, लेकिन यदि आप इसे चाहते हैं, तो आप 'इतिहास का उपयोग कर सकते हैं।पुशस्टेट';) – qdev

+0

@qdev हाँ, लेकिन यह नहीं था कि क्यूए क्या पूछ रहा था ... – Tim

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