2012-06-10 8 views
53

मैं एक फोटो गैलरी बना रहा हूं, और फ़ोटो ब्राउज़ होने पर क्वेरी स्ट्रिंग और शीर्षक को बदलने में सक्षम होना चाहूंगा।पृष्ठ को फिर से लोड किए बिना क्वेरी स्ट्रिंग को संशोधित करना

जिस व्यवहार को मैं ढूंढ रहा हूं उसे अक्सर निरंतर/अनंत पृष्ठ के कुछ कार्यान्वयन के साथ देखा जाता है, जहां आप क्वेरी स्ट्रिंग को स्क्रॉल करते समय पृष्ठ संख्या (http://x.com?page=4) इत्यादि को बढ़ाते रहते हैं .. यह सिद्धांत में सरल होना चाहिए, लेकिन मैं कुछ ऐसे ब्राउज़र को पसंद करेंगे जो प्रमुख ब्राउज़रों में सुरक्षित हों।

मुझे this great post मिला, और window.history.pushstate के साथ उदाहरण का पालन करने की कोशिश कर रहा था, लेकिन ऐसा लगता है कि यह मेरे लिए काम नहीं कर रहा है। और मुझे यकीन नहीं है कि यह आदर्श है क्योंकि मुझे ब्राउज़र इतिहास को संशोधित करने की परवाह नहीं है।

मैं बस तस्वीर बदलने पर हर बार पृष्ठ को पुनः लोड किए बिना, वर्तमान में देखी गई तस्वीर को बुकमार्क करने की क्षमता प्रदान करने में सक्षम होना चाहता हूं।

यहाँ अनंत पेज को क्वेरी स्ट्रिंग को संशोधित करता है का एक उदाहरण है: http://tumbledry.org/

अद्यतन इस विधि पाया:

window.location.href = window.location.href + '#abc'; 

यह मेरे लिए काम करने के लिए प्रकट होता है, लेकिन मैं एक नया क्रोम पर कर रहा हूँ। यह शायद पुराने ब्राउज़र के साथ कुछ मुद्दों का कारण बन जाएगा?

+0

आप कुछ उदाहरण साइट है कि अपनी क्वेरी स्ट्रिंग अपडेट हो जाता है के लिए एक लिंक पोस्ट कर सकते हैं गतिशील रूप से? मुझे नहीं लगता कि यह किया जा सकता है, लेकिन आप * हैश वैल्यू बदल सकते हैं और जो भी आप चाहते हैं उसे प्राप्त करने के लिए पर्याप्त हो सकता है। – Pointy

+0

संभावित डुप्लिकेट [जावास्क्रिप्ट/jquery के साथ यूआरएल में हेरफेर कैसे करें?] (Http://stackoverflow.com/questions/6601609/how-to-manipulate-the-url-with-javascript-jquery) – Quentin

+0

उदाहरण जोड़ा गया। –

उत्तर

84

यदि आप हैश संशोधन की तलाश में हैं, तो आपका समाधान ठीक काम करता है। हालांकि, अगर आप क्वेरी को बदलना चाहते हैं, तो आप पुशस्टेट का उपयोग कर सकते हैं, जैसा कि आपने कहा था। यहां यह एक उदाहरण है जो आपको इसे सही तरीके से कार्यान्वित करने में मदद कर सकता है। मैं परीक्षण किया है और यह ठीक काम किया:

if (history.pushState) { 
    var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?myNewUrlQuery=1'; 
    window.history.pushState({path:newurl},'',newurl); 
} 

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

अधिक जानकारी के लिए:

http://diveintohtml5.info/history.html

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

+1

मेरा मानना ​​है कि आप 'window.location.protocol +' // 'window.location.host' को केवल' window.location.origin' को छोटा कर सकते हैं। – Garrett

+0

बहुत बढ़िया। यह 2016 तक काम करता है। धन्यवाद – breezy

+0

इसके अलावा, कुछ अतिरिक्त जानकारी के लिए, सापेक्ष पथ 'history.pushState() 'के साथ-साथ काम करते हैं। कोई वास्तविक 'राज्य' तर्क की आवश्यकता नहीं है। इन दोनों का मतलब है कि आप 'history.pushState (null,' ','/foo? Bar = true ') जैसे कुछ सरल कर सकते हैं, यदि आपका नया यूआरएल एक ही होस्ट/पोर्ट पर है। – Blaskovicz

0

फिर इतिहास एपीआई वही है जो आप खोज रहे हैं। यदि आप विरासत ब्राउज़रों का भी समर्थन करना चाहते हैं, तो ब्राउज़र लाइब्रेरी की तलाश करें जो यूआरएल के हैश टैग में हेरफेर करने पर वापस आती है यदि ब्राउजर इतिहास एपीआई प्रदान नहीं करता है।

5

मैं बड़ी सफलता के साथ निम्नलिखित JavaScript लाइब्रेरी का उपयोग किया है:

https://github.com/balupton/jquery-history

यह एचटीएमएल 5 इतिहास एपीआई के साथ-साथ पुराने ब्राउज़र के लिए फ़ॉलबैक विधि (# का प्रयोग करके) का समर्थन करता है।

यह लाइब्रेरी अनिवार्य रूप से 'history.pushState' के आसपास एक पॉलीफिल है।

+0

कमाल! क्या आपने इसे सभी ब्राउज़रों के साथ परीक्षण किया ?? –

+0

मेरा कार्यान्वयन आई 7 +, फ़ायरफ़ॉक्स 3.6+, सफारी 5 और क्रोम 16+ में परीक्षण किया गया था। यह शायद अन्य ब्राउज़रों के साथ भी काम करता है, लेकिन मुझे इसका उपयोग करके तैनात कई प्रणालियों में कोई शिकायत नहीं मिली है। –

+0

महान। तो अभी .. बस एक के बजाय # को डालने और window.location.href पर लिखने के लिए मेरे लिए काम करता है। उसमें यह पृष्ठ को फिर से लोड नहीं करता है। मुझे यकीन है कि आईई में परीक्षण करने के बाद यह टूट जाएगा .. जिस बिंदु पर मैं आपके द्वारा सुझाई गई लाइब्रेरी के साथ जाऊंगा। धन्यवाद –

0

बिल्डिंग फैबियो के जवाब से दूर, मैं दो कार्यों कि शायद इस सवाल पर ठोकर किसी के लिए उपयोगी हो सकता है बनाया। इन दो कार्यों के साथ, आप तर्क के रूप में एक कुंजी और मान के साथ insertParam() पर कॉल कर सकते हैं।यह या तो URL पैरामीटर जोड़ सकते हैं या, अगर एक क्वेरी परम पहले से ही एक ही कुंजी के साथ मौजूद है, यह नई मूल्य है कि पैरामीटर बदल जाएगा:

//function to remove query params form a url 
function removeURLParameter(url, parameter) { 
    //prefer to use l.search if you have a location/link object 
    var urlparts= url.split('?'); 
    if (urlparts.length>=2) { 

     var prefix= encodeURIComponent(parameter)+'='; 
     var pars= urlparts[1].split(/[&;]/g); 

     //reverse iteration as may be destructive 
     for (var i= pars.length; i-- > 0;) {  
      //idiom for string.startsWith 
      if (pars[i].lastIndexOf(prefix, 0) !== -1) { 
       pars.splice(i, 1); 
      } 
     } 

     url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : ""); 
     return url; 
    } else { 
     return url; 
    } 
} 

function insertParam(key, value) { 
    if (history.pushState) { 
     // var newurl = window.location.protocol + "//" + window.location.host + search.pathname + '?myNewUrlQuery=1'; 
     var currentUrl = window.location.href; 
     //remove any param for the same key 
     var currentUrl = removeURLParameter(currentUrl, key); 

     //figure out if we need to add the param with a ? or a & 
     var queryStart; 
     if(currentUrl.indexOf('?') !== -1){ 
      queryStart = '&'; 
     } else { 
      queryStart = '?'; 
     } 

     var newurl = currentUrl + queryStart + key + '=' + value 
     window.history.pushState({path:newurl},'',newurl); 
    } 
} 
संबंधित मुद्दे

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