var $msg = $('#msg-container-id');
$msg.fadeIn(function(){
setTimeout(function(){
$msg.fadeOut(function(){
$msg.remove();
});
},5000);
});
Проблема с вышеуказанным решением заключается в том, что его можно удалить с помощью простого:
if( top != self )
delete top.onbeforeunload;
После того, как это было вызвано, prevent_bust
никогда не будет увеличиваться, и это означает, что веб-сайт будет свободно перенаправлен без вашего согласия или ведома. Плохая сделка.
Если вам нужна стабильно функциональная версия этого решения, я бы порекомендовал сделать это:
// Create a random seed value, making it almost impossible to
// determine what is being tested for.
var prevent_bust = Math.random() * 3000;
// enclose everything in a function, so that it cannot be addressed
function iniFunc ( init ) {
// The function is no longer in scope of the main window.
function onbeforeunload() { prevent_bust++ }
window.onbeforeunload = onbeforeunload;
setInterval( function() {
// make sure the function was not deleted.
if( window.onbeforeunload != onbeforeunload )
{
prevent_bust = init + 1;
window.onbeforeunload = onbeforeunload;
}
if (prevent_bust > init ) { // All comparison is to the random seed.
prevent_bust -= 2
window.top.location = 'http://server-which-responds-with-204.com/'
// Unfortunately, you have absolutely no idea which website caused
// the incrementation, so you cannot replace it with a link!
//
// You might try to simply ignore it and just use the iframe as is --
// theoretically, they are no longer able to bust this frame.
// (this theory will be disproved below).
}
}, 1 );
};
iniFunc( prevent_bust );
К сожалению, это вызывает одну проблему - получить установленный интервал - тривиальная вещь. , отключите его, а затем перенаправьте страницу:
// setTimeout will return the highest timeout which is not "in use", in this case,
// it will be the original setInterval (from the above function) + 1.
// Event if there are 1,000 intervals already set, it will be rather trivial to
// clear them all.
var currentInterval = 10000;
// window.setTimeout( gotoHREF, 100 );
// clearInterval will not interfere with setTimeout, so we can clear all
// of the Intervals already set.
for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );
function gotoHREF(){
top.location.href = "http://<my-url/>";
}
Лучше всего решить эту проблему на стороне сервера (если сможете). Если у вас есть доступ к серверу веб-сайта, на котором будут размещаться фреймы, создайте промежуточный прокси-сервер, куда вы извлекаете данные веб-сайта, а затем удалите теги сценария:
// In php
$dd = new DOMDocument();
// file_get_contents will simply convert the entire web address into a String
$dd->loadXML( file_get_contents( "http://" . $_GET[ 'loadedURL' ] ) );
$scripts = $dd->getElementsByTagName( "script" );
// iterate through the website and remove all script tags.
for( $i = 0; $i < $scripts->length; $i++ )
{
$current = $scripts->item( $i );
$current->parentNode->removeChild( $current );
}
// output it to the dummy page.
echo $dd->saveXML();
Затем вы должны использовать тег:
<iframe src="redirect.php?loadedURL=http://www.google.com"></iframe>
К сожалению, это будет означать, что ваш iframe будет работать без JavaScript, что может вывести из строя, если не полностью лоботомировать данный веб-сайт. Вам также необходимо убедиться, что все атрибуты src правильно изменены для узлов-потомков в HTML стороннего сайта.
С другой стороны, вы можете попросить ваш сервер проверить сайт во фрейме и все его JS-страницы на предмет соответствия посмотрите, существует ли верхнее (. | [\ s * ("| ')) место регулярного выражения (оно будет соответствовать top.location, top [" location и top [' location)] (или есть ли вообще какие-либо ссылки на top ), а затем используйте ссылку, если она существует, и собственно сайт, если ее нет. Ущерб здесь заключается в том, что вы заставляете пользователя дважды ждать загрузки вторичного сайта - один раз на сервере и один раз в браузере. (если все не делается через JS, но это, на мой взгляд, более раздражает).
Лично я придерживаюсь мнения, что толпа «не создавайте фрейм для моего сайта» обычно может выиграть большинство сражений, в которых участвуют iframe напрямую. С другой стороны, если код используется для обработки HTML до того, как он будет добавлен на веб-страницу, то у другой стороны больше, чем шанс.
Кстати, все это можно сделать с помощью JavaScript и AJAX, но обычно это будет немного медленнее. Если можете, воспользуйтесь сервером.
Вы можете попытаться создать прерыватель блокировки кадров, все описано Джеффом Этвудом в его сообщении в блоге: We Done Been ... Framed! - coddinghorror.com
Короче говоря, вы должны реализовать что-то вроде этого:
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://server-which-responds-with-204.com'
// replace your iframe with link to it
}
}, 1)