Как заблокировать всплывающие окна из iframe?

Я встраиваю страницу со всплывающим окном выхода. Когда вы закрываете страницу, автоматически открывается всплывающее окно.

Как отключить всплывающие окна, появляющиеся из iframe при выходе?


person Paul    schedule 16.12.2010    source источник
comment
Возможно, вам стоит уточнить свой вопрос   -  person m.edmondson    schedule 16.12.2010
comment
Не вставляйте страницы, поведение которых вам не нравится.   -  person Quentin    schedule 16.12.2010
comment
он задает законный вопрос ... не вставляйте код с нежелательным поведением - плохой ответ Дайте мне посмотреть .... как вы кодируете то или это ... ну не кодируйте это ... станьте водопроводчиком ... проблема решена .... У меня такая же проблема ... и я не могу позволить себе роскошь сказать моему боссу что-то вроде ... ну, мы просто не встраиваем это .... Пол ... Вы когда-нибудь решали эту проблему ... ???   -  person    schedule 10.02.2011
comment
@John - пожалуйста, посмотрите ответ @Piskvor - это дает разумные причины, по которым этот просто не работает. Если ваш босс не может принять реальность, значит, ваш босс - дурак.   -  person Marc Gravell    schedule 10.02.2011


Ответы (7)


Если вы хотите заблокировать что-то вроде всплывающей рекламы или что-то, исходящее с веб-сайта, который вы показываете в IFRAME, это довольно просто.

Создайте framefilter.php и javascriptfilter.php, на которые указывает ваш iframe. Вы можете изменить его в соответствии с вашими потребностями, такими как onload blah blah и т. Д. Но как / есть - он работал у меня в течение довольно долгого времени. Надеюсь, поможет.

Замените свой стандартный HTML-код IFRAME следующим:

    <IFRAME SRC="http://www.yourdomainhere.com/framefilter.php?furl=http://www.domainname.com" WIDTH=1000 HEIGHT=500>
If you can see this, your browser doesn't 
understand IFRAMES. However, we'll still 
<A HREF="http://www.domainname.com">link</A> 
you to the page.
</IFRAME>

Framefilter.php

        <?php

//Get the raw html.
$furl=trim($_GET["furl"]);
$raw = file_get_contents($furl);

$mydomain="http://www.yourdomainhere.com/";

//Kill anoying popups.
$raw=str_replace("alert(","isNull(",$raw);
$raw=str_replace("window.open","isNull",$raw);
$raw=str_replace("prompt(","isNull(",$raw);
$raw=str_replace("Confirm: (","isNull(",$raw);

//Modify the javascript links so they go though a filter.
$raw=str_replace("script type=\"text/javascript\" src=\"","script type=\"text/javascript\" src=\"".$mydomain."javascriptfilter.php?jurl=",$raw);
$raw=str_replace("script src=","script src=".$mydomain."javascriptfilter.php?jurl=",$raw);

//Or kill js files
//$raw=str_replace(".js",".off",$raw);

//Put in a base domain tag so images, flash and css are certain to work.
$replacethis="<head>";
$replacestring="<head><base href='".$furl."/'>";
$raw=str_replace($replacethis,$replacestring,$raw);

//Echo the website html to the iframe.
echo $raw;

?>

javascriptfilter.php

<?php

//Get the raw html.
$jurl=trim($_GET["jurl"]);
$raw = file_get_contents($jurl);

//Note, if trickyness like decode detected then display empty.
if(!preg_match("decode(", $raw)){

//Kill anoying popups.
$raw=str_replace("alert(","isNull(",$raw);
$raw=str_replace("window.open","isNull",$raw);
$raw=str_replace("prompt(","isNull(",$raw);
$raw=str_replace("Confirm: (","isNull(",$raw);

//Echo the website html to the iframe.
echo $raw;

}

?>
person Delusion    schedule 28.01.2014
comment
Вам тоже следует заменить isNaN(, потому что isNull() не определено. - person Shlomi Hassid; 15.06.2015
comment
При замене следует учитывать случай с пробелами между именем функции и скобками. лучше будет использовать: $raw=preg_replace("#alert[ ]{0,}\\(#i","isNaN(",$raw); - person Shlomi Hassid; 15.06.2015
comment
Ваш preg_match недействителен. Должно быть: if(empty(preg_match("#decode\\(#i", $raw))) { - person Shlomi Hassid; 15.06.2015
comment
Что лучше, использовать это решение или использовать тег iframe sanbox? - person Yohanes AI; 16.04.2018

Довольно старый вопрос, но я подумал, что предложу более новое решение, так как это лучший результат в Google.

Если вы хотите запретить iframe открывать окна, вы можете использовать новый атрибут HTML5 "sandbox" в своем iframe.

https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe

Это должно удерживать его от каких-либо действий (кроме запуска javascript, который может потребоваться для правильной работы страницы):

<iframe sandbox="allow-scripts" src="your/url/here"></iframe>
person Sollace    schedule 08.04.2017
comment
Это также может быть полезно в связи с атрибутом песочницы: stackoverflow.com/questions/48588472/ - person WCO; 19.06.2018

Я не думаю, что это возможно.

  • во-первых (и что наиболее важно), если iframe находится в другом домене, вы не можете изменить его DOM - например, обработчики onunload. Если это так, то две другие проблемы остаются спорными.
  • во-вторых, даже если бы вы могли, вам пришлось бы каким-то образом удалить слушателя. Если слушатель загружается через window.onunload, это будет просто; в остальном не так уж и много.
  • в-третьих, в долгосрочной перспективе это приведет к той же гонке вооружений, что и уничтожение фреймов- нарушители

Единственная возможность, которую я вижу, носит нетехнический характер: узнайте у тех, кто запускает этот сайт внутри iframe, могут ли они создать для вас специальную страницу без такого всплывающего окна onunload. В большинстве случаев либо

  • а) могут быть сделаны какие-то особые договоренности (хотя и не всегда бесплатно), или
  • б) удаление функциональности будет нарушением ToS, и в этом случае вам придется искать кого-то другого, предоставляющего аналогичную функциональность, без всплывающих окон (и реально у большинства сервисов есть более одного поставщика)
person Piskvor left the building    schedule 10.02.2011

Собственно, это возможно. По крайней мере, во многих случаях. Часто код в iframe будет запускать что-то вроде top.window.open(...), чтобы открыть всплывающее окно. Вы можете переопределить метод window.open, чтобы он все еще существовал, но не открывал окно. Например.:

`window.alias_open = window.open;

window.open = function (url, name, specs, replace) {// Ничего не делать или делать что-то умное ...} `

Если вы по-прежнему хотите, чтобы всплывающие окна открывались, вы можете добавить URL-адреса в белый список в теле window.open и при необходимости вызвать alias_open.

person Mitch    schedule 09.10.2012

Установка атрибута песочницы в элементе IFrame должна работать.

person SPagad    schedule 28.05.2015

Я не уверен, что это сработает, но вы можете попробовать удвоить iframing. Если вы разместите сайт в бесплатной учетной записи blogger, затем установите iframe в учетную запись blogger с кодом задержки загрузки. так что всплывающее окно появится до загрузки страницы, дайте мне знать, работает ли оно.

person jingletv    schedule 27.08.2012

Используйте современный браузер - все они обладают хорошими возможностями блокировки всплывающих окон.

person m.edmondson    schedule 16.12.2010
comment
Извините - почему голосование против? Вы хотите знать, как отключить всплывающие окна - использование современного браузера отключает их - person m.edmondson; 16.12.2010
comment
В этом случае не вставляйте код, который ведет себя нежелательно. - person m.edmondson; 16.12.2010