`base` 标记使 iframe 在 Internet Explorer 中作为新窗口打开

Posted

技术标签:

【中文标题】`base` 标记使 iframe 在 Internet Explorer 中作为新窗口打开【英文标题】:`base` tag causes iframe to open as new window in Internet Explorer 【发布时间】:2013-12-17 14:05:56 【问题描述】:

base tag 有问题,它只影响 Internet Explorer(版本 8、9 和 10)。

以下代码用于在 iframe 中打开动态内容,并在 Chrome 和 Firefox 中正常运行。它在 Internet Explorer 中也能正常工作,但只是没有<base target="_blank"/> 标记。包含此标记会导致 iframe 作为新窗口打开(这是有道理的,但这不是我想要做的。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <base target="_blank"/>
    </head>

    <body>
        <div id="main"></div>
        <script type="text/javascript">
            function load_iframe(name, height, width) 
                var div = document.getElementById(name);

                var ifrm = document.createElement('iframe');
                ifrm.id = 'iframe_' + name;
                ifrm.frameBorder = 0;
                ifrm.scrolling = 'no';
                ifrm.noresize = 'noresize';
                ifrm.marginheight = 0;
                ifrm.marginwidth = 0;
                if (height !== 0) 
                    ifrm.height = height;
                
                if (width !== 0) 
                    ifrm.width = width;
                
                div.appendChild(ifrm);

                content = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head></head><body></body></html>';

                if (/msie/.test(navigator.userAgent.toLowerCase()) || window.opera) 
                    ifrm.contentWindow.contents = content;
                    return ifrm.src = 'javascript:window["contents"]';
                 else 
                    doc = ifrm.contentDocument;
                    doc.open();
                    doc.write(content);
                    doc.close();
                    return ifrm;
                
            

            load_iframe('main', 250, 300);
        </script>
    </body>
</html>

我该如何解决这个问题?不幸的是,我无法让代码在小提琴中运行,可能是因为它依赖于 &lt;base/&gt;&lt;head&gt; 中。

【问题讨论】:

您是否尝试过为 iframe 赋予值为“_self”的“target”属性? 是的,我试过了。我不认为 target 是 iframe 的有效属性 div = document.getElementById(div);ifrm.id = 'iframe_' + div; 没有意义,div 这里是 HTMLElement,而不是字符串。同样iframes 没有noresize 属性,它是用于frames。 哎呀,我已经修复了 div 变量,这是错误的。 @JoshuaSpence 如果删除基本标签,iframe 在 Chrome 和 IE10/9/8 中可以正常工作。 "target=_blank" 的目的是在新窗口/标签中打开链接,所以如果你不希望这个不要包含它。 【参考方案1】:

我刚刚删除了 /msie/.test(navigator.userAgent.toLowerCase()) || 部分,在 IE8 上运行良好。您确定需要这段代码吗?

但是,无论您是否不想删除这块,您都可以删除base 标签并在创建iframe 之后添加它:

load_iframe('main', 250, 300);
//and then:
var hd = document.getElementsByTagName("head")[0];
var bs = document.createElement("base");
bs.target= "_blank";
hd.appendChild(bs);

我在 chrome、IE8、IE11 上测试过,效果很好!

【讨论】:

【参考方案2】:

正如 cmets target="_blank" 中所说,使浏览器打开一个新窗口或选项卡(取决于您的配置)。

只需将其删除或自行替换(在 IE8 上测试):

<base target="_self"/>

【讨论】:

以上是关于`base` 标记使 iframe 在 Internet Explorer 中作为新窗口打开的主要内容,如果未能解决你的问题,请参考以下文章

如何在浏览器中使用BASE64键打开PDF

如何使 Google 地图标记重定向到 URL?

如何在 iframe 中设置 base64 pdf 的文件名?

使用 <base> 时使锚链接指向当前页面

iframe 中的脚本标记在父 dom 上执行

使用 iframe 时,嵌入式 base64 pdf 不会在 IE 中显示