Я собираюсь быть смелым и бросить свою шляпу в кольцо на этом (старое как оно есть), посмотрите, сколько отрицательных голосов я могу собрать.
Вот моя попытка, которая, кажется, работает везде, где я ее тестировал (Chrome20, IE8 и FF14):
(function() {
if (top == self) {
return;
}
setInterval(function() {
top.location.replace(document.location);
setTimeout(function() {
var xhr = new XMLHttpRequest();
xhr.open(
'get',
'http://mysite.tld/page-that-takes-a-while-to-load',
false
);
xhr.send(null);
}, 0);
}, 1);
}());
Я поместил этот код в <head>
и вызывал его с конца <body>
, чтобы убедиться, что моя страница отображается, прежде чем она начинает спорить со вредоносным кодом, не знаю, является ли это лучшим подходом, YMMV .
Как это работает?
... Я слышал, вы спрашиваете - ну, честный ответ, я не на самом деле знаю. Потребовалось много усилий, чтобы заставить его работать везде, где я тестировал, и точный эффект, который он имеет, немного варьируется в зависимости от того, где вы его запускаете.
Вот мысль, стоящая за этим:
- Установите функцию для запуска с минимально возможным интервалом. Основная концепция любого из реалистичных решений, которые я видел, состоит в том, чтобы заполнить планировщик большим количеством событий, чем у Buster-Buster.
- Каждый раз, когда функция срабатывает, попробуйте изменить местоположение верхней рамки. Довольно очевидное требование.
- Также запланируйте немедленное выполнение функции, выполнение которой займет много времени (тем самым блокируя работу противодействия нарушению местоположения при изменении местоположения). Я выбрал синхронный XMLHttpRequest, потому что это единственный механизм, о котором я могу думать, который не требует (или, по крайней мере, не запрашивает) взаимодействия с пользователем и не отнимает процессорное время пользователя.
Для моего http://mysite.tld/page-that-takes-a-while-to-load
(цель XHR) я использовал скрипт PHP, который выглядит следующим образом:
<?php sleep(5);
Что происходит?
- Chrome и Firefox ждут 5 секунд, пока XHR завершит работу, а затем успешно перенаправят на URL страницы в рамке.
- IE перенаправляет почти сразу
Разве вы не можете избежать времени ожидания в Chrome и Firefox?
Видимо, нет. Сначала я указал XHR на URL, который вернул бы 404 - это не сработало в Firefox. Затем я попробовал подход sleep(5);
, который я в конечном итоге получил для этого ответа, затем я начал играть с продолжительностью сна различными способами. Я не мог найти никакой реальной картины поведения, но обнаружил, что если она слишком короткая, то Firefox не будет играть в мяч (Chrome и IE, похоже, ведут себя довольно хорошо). Я не знаю, что такое определение «слишком короткий» в реальном выражении, но 5 секунд , кажется, работает каждый раз.
Если любой проходящий ниндзя Javascript захочет немного лучше объяснить, что происходит, почему это (вероятно) неправильно, ненадежно, худший код, который они когда-либо видели, и я с удовольствием выслушаю.