Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何阻止来自iframe的弹出窗口?_Javascript_Html_Iframe_Popup_Onunload - Fatal编程技术网

Javascript 如何阻止来自iframe的弹出窗口?

Javascript 如何阻止来自iframe的弹出窗口?,javascript,html,iframe,popup,onunload,Javascript,Html,Iframe,Popup,Onunload,我正在嵌入一个有退出弹出窗口的页面。当您关闭页面时,它会自动启动一个弹出窗口 如何在退出时禁用来自iframe的弹出窗口?使用现代浏览器-它们都具有良好的弹出窗口阻止功能我认为这是不可能的 首先(也是最重要的一点),如果iframe位于不同的域中,则不能更改其DOM,例如onunload处理程序。如果是这样的话,其他两个问题就没有意义了 其次,即使可以,也必须以某种方式删除侦听器。如果侦听器是通过window.onunload加载的,那就简单了;否则,就不那么多了 第三,从长远来看,这将导致与

我正在嵌入一个有退出弹出窗口的页面。当您关闭页面时,它会自动启动一个弹出窗口


如何在退出时禁用来自iframe的弹出窗口?使用现代浏览器-它们都具有良好的弹出窗口阻止功能

我认为这是不可能的

  • 首先(也是最重要的一点),如果iframe位于不同的域中,则不能更改其DOM,例如onunload处理程序。如果是这样的话,其他两个问题就没有意义了
  • 其次,即使可以,也必须以某种方式删除侦听器。如果侦听器是通过window.onunload加载的,那就简单了;否则,就不那么多了
  • 第三,从长远来看,这将导致与美国同样的军备竞赛
我所看到的唯一可能性是非技术性的:与在iframe中运行该站点的人核实是否可以为您创建一个特殊页面,一个没有这种onunload弹出窗口的页面。在大多数情况下,两者都不是

  • a) 可以做出一些特殊安排(尽管并非总是免费的),或者
  • b) 删除该功能将违反ToS,在这种情况下,您必须在没有弹出窗口的情况下寻找提供类似功能的其他人(实际上,大多数服务不止一个提供商)

我不确定这是否有效,但您可以尝试双重假设。Iframe在一个免费的blogger帐户中创建站点,然后Iframe使用延迟加载代码创建blogger帐户。因此,在加载页面之前会出现弹出窗口,让我知道它是否工作。

实际上,这是可能的。至少在很多情况下是这样。通常,iframe中的代码将运行类似于
top.window.open(…)
的内容以打开弹出窗口。您可以重新定义window.open方法,使其仍然存在,但不打开窗口。例如:

` window.alias_open=window.open

window.open=函数(url、名称、规格、替换){ //什么都不做,或者做些聪明的事。。。 } `


如果您仍然希望打开一些弹出窗口,您可以在
窗口主体中列出URL的白名单。打开
,并根据需要调用
alias\u open

如果您想阻止弹出广告或来自IFRAME中显示的网站的内容,这相当容易

制作iframe指向的framefilter.phpjavascriptfilter.php。 您可以修改它以满足您的需要,例如onload等等。 但事实上,这对我来说已经好一阵子了。希望能有帮助

将标准IFRAME HTML替换为以下内容:

    <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>

如果你能看到这一点,你的浏览器就看不到了
理解IFRAMES。不过,我们仍然会
请转到页面。
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;

?>
<?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;

}

?>

在IFrame元素上设置sandbox属性应该会起作用。

这是一个很老的问题,但我想我会提供一个更新的解决方案,因为这是谷歌的顶级结果

如果要阻止iframe打开窗口,可以在iframe上使用新的HTML5“沙盒”属性

这将阻止它做任何事情(除了运行javascript,这可能是页面正常运行所必需的):



对不起,为什么要投反对票?你想知道如何禁用弹出窗口-使用现代浏览器禁用这些。在这种情况下,不要嵌入有不良行为的代码。也许你应该详细说明你的问题。不要嵌入有你不喜欢的行为的页面。他问的是一个合理的问题。。。“不要在代码中嵌入不受欢迎的行为”是一个糟糕的答案让我看看。。。。您如何编写这个或那个。。。。好吧,不要给它编码。。成为一名水管工。。。问题解决了。。。。我也有同样的问题。。。而且我没有权利告诉我的老板像。。。好吧,我们只是不嵌入它。。。。保罗。。你曾经解决过这个问题吗…?@John-请看@Piskvor的答案-这给出了合理的理由说明为什么这个方法行不通。如果你的老板不能接受现实,那么你的老板就是傻瓜。你应该替换代码< iSnAn(<代码>原因>代码> ISNULL()>代码>。你的替换应该考虑一个在FUNC名称和括号之间有空格的情况。最好使用:<代码> $RAW=PREGRY替换(“{警报”[{ 0,}),“iSnI”,“ISRAN”,$RAW。
您的preg_匹配无效。应该是:
如果(空(preg_匹配(#decode\\\(#i“,$raw)){
哪一个更好,使用此解决方案还是是否使用iframe sanbox标记?这可能对沙盒属性也有帮助:
<iframe sandbox="allow-scripts" src="your/url/here"></iframe>