2012-07-13 28 views
8

मैं history.js उपयोग कर रहा हूँ और जब उपयोगकर्ता एक लिंक या बटन पर क्लिक करता है मैं History.pushState([...]) द्वारा एक ईवेंट हैंडलरhistory.js में राज्य परिवर्तन को ट्रिगर किए बिना राज्य कैसे बदलें?

$(window).bind('statechange', function(){ 
    // Loads the content representing the state via ajax 
}); 

अधिकांश सामग्री में परिवर्तन शुरू हो जाता है।

लेकिन कुछ मामलों में सामग्री परिवर्तन सीधे जावास्क्रिप्ट द्वारा प्रबंधित किया जाता है (यानी डीओएम तत्व को बदलकर, जोड़कर या हटाकर) और अजाक्स के माध्यम से नए राज्य का प्रतिनिधित्व करने वाली सामग्री को लोड करने की आवश्यकता नहीं है।

फिर भी, मैं एक राज्य धक्का और यूआरएल को बदलने के लिए नए राज्य को प्रतिबिंबित करने के लिए, उपयोगकर्ता हिट रीलोड या बाद में वापस बटन का उपयोग करना चाहते चाहिए आदि

तो मेरे सवाल है की जरूरत है: मैं कैसे धक्का करना एक राज्य लेकिन कुछ मामलों में सामग्री लोड करने से बचें? क्या कोई ऐसा झंडा है जिसे स्टेटलैंड इवेंट हैंडलर में पास किया जा सकता है या क्या मैं इसे पूरी तरह से बाधित कर सकता हूं?

उत्तर

7

मुझे इस प्रश्न के बारे में भी आश्चर्य हुआ। मेरा निर्णय वैश्विक चर का उपयोग करना था। उदाहरण के लिए, आप गलत रूप window.stateChangeIsLocal प्रारंभ कर सकते हैं:

इस तरह
window.stateChangeIsLocal = false; 

आपका statechange हैंडलर को ढूंढ सकता है कुछ:

History.Adapter.bind(window,'statechange',function(){ 
    if (!window.stateChangeIsLocal) { 
     someAjaxLoadFunction(History.getState().url); 
    } 
    else { 
     window.stateChangeIsLocal = false; 
    } 
}); 

आप राज्य को बदलने और की सामग्री लोड करने नहीं चाहते हों एक नया राज्य, बस window.stateChangeIsLocaltrue के रूप में सेट करें;

शायद कुछ और सुरुचिपूर्ण समाधान हैं, लेकिन मैं उन्हें नहीं ढूंढ पाया और इसका उपयोग नहीं कर पाया।

+0

मेरा स्वयं का समाधान कुछ समान था, सिवाय इसके कि मैंने वैश्विक इतिहास वस्तु की एक संपत्ति निर्धारित की है। इस सवाल को और भी देखें (http://stackoverflow.com/questions/8744487/statechange-is-firing-whenever-i-do-a-push-state?rq=1) इस मुद्दे पर और अधिक के लिए। – jgivoni