वैसे बदलने के 2 तरीके है location.href
। या तो आप लिख सकते हैंlocation.href = "y.html"
, जो पृष्ठ को फिर से लोड करता है या इतिहास एपीआई का उपयोग कर सकता है जो पृष्ठ को फिर से लोड नहीं करता है। मैंने हाल ही में पहला प्रयोग किया।
यदि आप एक चाइल्ड विंडो खोलते हैं और पेरेंट विंडो से चाइल्ड पेज का लोड कैप्चर करते हैं, तो अलग-अलग ब्राउजर बहुत अलग तरह से व्यवहार करते हैं। केवल एक चीज जो सामान्य है, वह यह है कि वे पुराने दस्तावेज़ को हटाते हैं और एक नया जोड़ते हैं, इसलिए उदाहरण के लिए पुराने दस्तावेज़ में रीडिस्टेटचेंज या लोड इवेंट हैंडलर्स को जोड़ने से कोई प्रभाव नहीं पड़ता है। अधिकांश ब्राउज़र विंडो ऑब्जेक्ट से ईवेंट हैंडलर को भी हटा देते हैं, एकमात्र अपवाद फ़ायरफ़ॉक्स है। क्रोम में कर्मा धावक और फ़ायरफ़ॉक्स में आप लोड करने के लिए तैयार डॉक्यूमेंट में नए डॉक्यूमेंट को कैप्चर कर सकते हैंunload + next tick
। इसलिए आप उदाहरण के लिए एक लोड इवेंट हैंडलर या एक रीडायस्टेकचेंज ईवेंट हैंडलर जोड़ सकते हैं या बस लॉग इन कर सकते हैं कि ब्राउज़र एक नया यूआरआई वाला पेज लोड कर रहा है। Chrome में मैन्युअल परीक्षण (शायद GreaseMonkey भी) और ओपेरा में, PhantomJS, IE10, IE11 के साथ आप लोडिंग राज्य में नए दस्तावेज़ पर कब्जा नहीं कर सकते। उन ब्राउज़रों में unload + next tick
कॉलबैक पृष्ठ की आग की घटना की तुलना में कुछ सौ एमएसईसी बाद में होता है। देरी आमतौर पर 100 से 300 मिसे होती है, लेकिन ओपेरा सिमटाइम अगले टिक के लिए 750 मिसे देरी करता है, जो डरावना है। इसलिए यदि आप सभी ब्राउज़रों में लगातार परिणाम चाहते हैं, तो आप वही करें जो आप लोड इवेंट के बाद करना चाहते हैं, लेकिन इस बात की कोई गारंटी नहीं है कि इससे पहले स्थान को ओवरराइड नहीं किया जाएगा।
var uuid = "win." + Math.random();
var timeOrigin = new Date();
var win = window.open("about:blank", uuid, "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes");
var callBacks = [];
var uglyHax = function (){
var done = function (){
uglyHax();
callBacks.forEach(function (cb){
cb();
});
};
win.addEventListener("unload", function unloadListener(){
win.removeEventListener("unload", unloadListener);
setTimeout(function (){
win.document.readyState;
if (win.document.readyState === "complete")
done();
else
win.addEventListener("load", function (){
setTimeout(done, 0);
});
}, 0);
});
};
uglyHax();
callBacks.push(function (){
console.log("cb", win.location.href, win.document.readyState);
if (win.location.href !== "http://localhost:4444/y.html")
win.location.href = "http://localhost:4444/y.html";
else
console.log("done");
});
win.location.href = "http://localhost:4444/x.html";
यदि आप अपनी स्क्रिप्ट केवल फ़ायरफ़ॉक्स में चलाते हैं, तो आप एक सरलीकृत संस्करण का उपयोग कर सकते हैं और दस्तावेज़ को लोडिंग स्थिति में कैप्चर कर सकते हैं, इसलिए उदाहरण के लिए, लोड किए गए पृष्ठ पर कोई स्क्रिप्ट URI परिवर्तन लॉग करने से पहले नेविगेट नहीं कर सकता:
var uuid = "win." + Math.random();
var timeOrigin = new Date();
var win = window.open("about:blank", uuid, "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes");
var callBacks = [];
win.addEventListener("unload", function unloadListener(){
setTimeout(function (){
callBacks.forEach(function (cb){
cb();
});
}, 0);
});
callBacks.push(function (){
console.log("cb", win.location.href, win.document.readyState);
if (win.location.href !== "http://localhost:4444/y.html")
win.location.href = "http://localhost:4444/y.html";
else
console.log("done");
});
win.location.href = "http://localhost:4444/x.html";
यदि हम एकल पृष्ठ अनुप्रयोगों के बारे में बात कर रहे हैं जो यूआरआई के हैश भाग को बदलते हैं, या इतिहास एपीआई का उपयोग करते हैं, तो आप क्रमशः और विंडो hashchange
की popstate
घटनाओं का उपयोग कर सकते हैं। यदि आप इतिहास में आगे बढ़ते हैं और जब तक आप एक ही पृष्ठ पर नहीं रहते तब भी वे कब्जा कर सकते हैं। दस्तावेज़ उन लोगों द्वारा नहीं बदलता है और पृष्ठ वास्तव में पुनः लोड नहीं किया जाता है।