.Txt dosyasını değiştirmenin 2 yolu vardır location.href
. Ya location.href = "y.html"
sayfayı yeniden yükleyen yazabilir ya da sayfayı yeniden yüklemeyen geçmiş API'sini kullanabilirsiniz. Son zamanlarda ilkini çok denedim.
Bir alt pencere açarsanız ve alt sayfanın yükünü ana pencereden yakalarsanız, farklı tarayıcılar çok farklı davranır. Ortak olan tek şey, eski belgeyi kaldırmaları ve yenisini eklemeleridir, bu nedenle örneğin eski belgeye readystatechange veya load olay işleyicileri eklemenin herhangi bir etkisi yoktur. Tarayıcıların çoğu olay işleyicilerini pencere nesnesinden de kaldırır, tek istisna Firefox'tur. Karma runner ile Chrome'da ve Firefox'ta, kullanıyorsanız yeni belgeyi yükleniyor readyState'te yakalayabilirsiniz.unload + next tick
. Böylece, örneğin bir yükleme olayı işleyicisi veya bir okuma değiştirme olay işleyicisi ekleyebilir veya tarayıcının yeni bir URI ile bir sayfayı yüklediğini günlüğe kaydedebilirsiniz. Manuel test içeren Chrome'da (muhtemelen GreaseMonkey de) ve Opera, PhantomJS, IE10, IE11'de yeni belgeyi yükleme durumunda yakalayamazsınız. Bu tarayıcılarda, unload + next tick
geri aramayı, sayfanın tetiklenme olayından birkaç yüz milisaniye sonra çağırır. Gecikme tipik olarak 100 ila 300 milisaniyedir, ancak opera simetime süresi, korkutucu olan bir sonraki tıklama için 750 milisaniye gecikme yapar. Dolayısıyla, tüm tarayıcılarda tutarlı bir sonuç istiyorsanız, yükleme olayından sonra istediğinizi yaparsınız, ancak bundan önce konumun geçersiz kılınmayacağına dair bir garanti yoktur.
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";
Komut dosyanızı yalnızca Firefox'ta çalıştırırsanız, basitleştirilmiş bir sürüm kullanabilir ve belgeyi bir yükleme durumunda yakalayabilirsiniz, böylece örneğin, yüklenen sayfadaki bir komut dosyası siz URI değişikliğini günlüğe kaydetmeden önce başka yere gidemez:
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";
URI'nin hash kısmını değiştiren veya geçmiş API'sini kullanan tek sayfalı uygulamalardan bahsediyorsak, sırasıyla pencerenin hashchange
ve popstate
olaylarını kullanabilirsiniz . Aynı sayfada kalana kadar geçmişte ileri geri hareket etseniz bile bunlar yakalayabilir. Belge bunlar tarafından değiştirilmez ve sayfa gerçekten yeniden yüklenmez.