打印

BX2032: 某些情况下浏览器不按照 "target" 属性所指目标打开协议链接

作者:陆远

标准参考

有关协议方面内容请参见 Internet 工程任务组 (Internet Engineering Task Force) IEF 提供的标准文档:http://www.ietf.org/rfc/rfc1738.txt

问题描述

在使用常用连接伪协议 "javascript:"、"mailto:"、 "view-source:"、"custom:" 时,不同浏览器可能按照不同的方式,打开链接,而不按照 "target" 属性所指目标完成工作。

造成的影响

若超链接链入了上述伪协议,且其 "target" 为 "_blank",不同浏览器在不同伪协议下并不会都在新窗口内打开链接。

受影响的浏览器

所有浏览器  

问题分析

关于协议的简要描述

维基百科中对协议的定义是:"在两个计算端点之间建立或控制连接、通信或数据传输的约定或标准" 。实际上这些端点可以是两个单独的计算机,也可以是一个计算机中两个单独的点。例如,从内存读取数据时,计算机必须访问硬盘上的存储区,通过数据总线将数据转移到内存,然后再将其传送至处理器。在每个端点,数据必须具有某种形式,以便发送方和接收方都能够恰当地处理数据。在最底层,数据就是一堆比特位的集合。只有在某个上下文中理解,这些比特集合才具有含义。如果发送方和接收方端点不能就上下文达成一致,那么被传输的数据就是无意义的。因此,协议是数据传输的基础。

我们常用类型的协议包括:IP,TCP,HTTP,FTP,mailto,Telnet,POP3,SOAP,SMTP,SSH 等。

协议的运作,必须由特定的处理器与之关联。该处理器可以是软件程序,硬件,或软硬件结合体。

还有一些非标准的协议,我们有时候将他们称作伪协议。如:查看指定URL源代码的 "view-source:URL" ,运行 JavaScript 脚本的 "javascript:" ,以及一些在客户端自定义的伪协议,如腾讯 QQ 产品自定义的 "tencent:" 伪协议。

某些情况下浏览器可能不按照 target 属性所指目标打开协议链接。分析以下代码:

<base target="_blank" /> <a
                href="javascript:">javascript:</a><br /> <a
                href="mailto:">mailto:</a><br /> <a
                href="view-source:">view-source:</a><br /> <a
                href="custom:">custom:</a>

上面代码分别测试了常用的 "javascript:" 、 "mailto:" 、 "view-source" ,以及自定义协议 "custom:" 。使用 BASE 元素使页面的所有 A 元素默认目标均为新页面。

这段代码在不同浏览器中运行结果如下:

IE6 IE7 IE8 Firefox Chrome Safari Opera
javascript: 打开新页面 打开新页面 不开新页面 不开新页面 打开新页面
mailto: 不开新页面 不开新页面 打开新页面 不开新页面 不开新页面
view-source: 打开新页面 打开新页面 打开新页面 不开新页面 不开新页面
custom: 打开新页面 打开新页面 打开新页面 不开新页面 不开新页面

解决方案

为保证各浏览器的兼容性,尽量不为这些协议设置 "target" 目标为 "_blank" 。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.3
Chrome 6.0.408.1 dev
Safari 4.0.5
Opera 10.53
测试页面: pseudo_agreement.html
本文更新时间: 2010-07-15

关键字

协议 伪协议 mailto view-source javascript tencent protocol pseudo