.NET Framework를 변경하는 방법에는 두 가지가 있습니다 location.href
. 어느 쪽이든 당신은 쓸 수있는 location.href = "y.html"
페이지를 다시로드하거나 페이지를 다시로드하지 않는 역사의 API를 사용할 수있는. 최근에 처음으로 많이 실험했습니다.
자식 창을 열고 부모 창에서 자식 페이지의로드를 캡처하면 다른 브라우저가 매우 다르게 작동합니다. 유일한 공통점은 이전 문서를 제거하고 새 문서를 추가하는 것입니다. 예를 들어 이전 문서에 readystatechange 또는 load 이벤트 핸들러를 추가해도 아무런 효과가 없습니다. 대부분의 브라우저는 창 개체에서도 이벤트 처리기를 제거합니다. 유일한 예외는 Firefox입니다. Karma runner 및 Firefox가있는 Chrome에서 다음을 사용하는 경우 loading readyState에서 새 문서를 캡처 할 수 있습니다.unload + next tick
. 따라서 예를 들어로드 이벤트 처리기 또는 readystatechange 이벤트 처리기를 추가하거나 브라우저가 새 URI로 페이지를로드하고 있음을 기록 할 수 있습니다. 수동 테스트 (GreaseMonkey도 가능)를 사용하는 Chrome과 Opera, PhantomJS, IE10, IE11에서는로드 상태에서 새 문서를 캡처 할 수 없습니다. 이러한 브라우저 unload + next tick
에서 페이지의로드 이벤트가 발생하는 것보다 수백 msec 후에 콜백을 호출합니다. 지연은 일반적으로 100 ~ 300msec이지만 Opera simetime은 다음 틱에 대해 750msec 지연을 만들어 무섭습니다. 따라서 모든 브라우저에서 일관된 결과를 원하면로드 이벤트 후에 원하는 작업을 수행하지만 그 전에 위치가 재정의되지 않을 것이라는 보장은 없습니다.
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";
Firefox에서만 스크립트를 실행하는 경우 단순화 된 버전을 사용하고로드 상태에서 문서를 캡처 할 수 있습니다. 예를 들어 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";
URI의 해시 부분을 변경하거나 히스토리 API를 사용하는 단일 페이지 응용 프로그램에 대해 이야기하는 경우 각각 hashchange
및 popstate
창의 이벤트를 사용할 수 있습니다 . 동일한 페이지에 머물 때까지 역사에서 앞뒤로 이동하더라도 캡처 할 수 있습니다. 문서는 변경되지 않으며 페이지는 실제로 다시로드되지 않습니다.