From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../navigator/registerprotocolhandler/index.html | 151 +++++++++++++++++++++ .../web-based_protocol_handlers/index.html | 133 ++++++++++++++++++ 2 files changed, 284 insertions(+) create mode 100644 files/zh-cn/web/api/navigator/registerprotocolhandler/index.html create mode 100644 files/zh-cn/web/api/navigator/registerprotocolhandler/web-based_protocol_handlers/index.html (limited to 'files/zh-cn/web/api/navigator/registerprotocolhandler') diff --git a/files/zh-cn/web/api/navigator/registerprotocolhandler/index.html b/files/zh-cn/web/api/navigator/registerprotocolhandler/index.html new file mode 100644 index 0000000000..b51348f2ef --- /dev/null +++ b/files/zh-cn/web/api/navigator/registerprotocolhandler/index.html @@ -0,0 +1,151 @@ +--- +title: Navigator.registerProtocolHandler() +slug: Web/API/Navigator/registerProtocolHandler +tags: + - API + - Navigator + - URL protocols + - URL schemes + - registerProtocolHandler + - 自定义 URL 协议 + - 自定义 URL 方案 +translation_of: Web/API/Navigator/registerProtocolHandler +--- +
{{APIRef("HTML DOM")}}{{securecontext_header}}
+ +

{{domxref("Navigator")}} 的方法 registerProtocolHandler() 让 web 站点为自身注册用于打开或处理特定 URL 方案(又名协议)的能力。

+ +

举个例子,此API允许Web邮件站点打开 mailto: URL,或让  VoIP  站点打开 tel: URL。

+ +

语法

+ +
navigator.registerProtocolHandler(scheme, url, title);
+
+ +
+

Note: 最近更新为 navigator.registerProtocolHandler(schemeurl), 但目前没有浏览器支持该版本。

+
+ +

参数

+ +
+
scheme
+
一个包含站点希望处理的协议的字符串。例如,你可以通过传入 "sms" 来注册处理SMS文本信息链接。
+
+ +
+
url
+
处理器的URL,string类型。这个字符串应该包含一个"%s"的占位符,其会被将要受理的文档的 escaped 链接所替换。这个链接(译者按:指将要受理的文档的 escaped 链接,也就是替换占位符的字符串)可能是一个真实的URL,或者是一个电话号码,邮件地址之类的。
+
+
这个处理器的 URL 必须以 http 或者 https 协议标记作为开头,最好是 https ,以满足一些浏览器出于安全考虑的要求。
+
+
title {{Obsolete_Inline}}
+
一个用户可理解的处理器标题。标题会展示给用户,例如弹出对话框“允许这个站点处理[scheme]链接吗?”或者在浏览器设置中列出注册的处理器时。
+
+
+

Note: 出于欺骗的考虑,标题已从规范中删除,但当前所有的浏览器仍要求使用该标题。 建议始终设置标题,因为支持更新规范的浏览器很可能会向后兼容,并且仍接受标题(但不使用它)。

+
+
+
+
+ +

异常

+ + + +
+
SecurityError
+
用户代理阻止了处理器的注册。这可能是由于:
+
SyntaxError
+
在指定的协议处理地址的字符串中缺失了 %s 占位符.
+
+ +

允许的协议标记

+ +

出于安全考虑,registerProtocolHandler() 严格限制了允许注册的协议标记。以 web+ 作为前缀的方式可以注册一个自定义的标记协议,至少要有5个字符的长度(包括 web+ 前缀),而且只能使用小写的ASCII字母作为名称。例如 web+burger ,如下面的{{anch("示例")}}所示。

+ +

除此之外,还可以使用下文所列的白名单中的协议标记:

+ +
+ +
+ +

示例

+ +

如果您的网站是 https://www.google.com/,则可以为其注册一个协议处理程序来处理 web+burger:链接,如下所示:

+ +
navigator.registerProtocolHandler("web+burger",
+                                  "https://www.google.com/?uri=%s",
+                                  "Burger handler");
+
+ +

这将创建一个处理程序,该处理程序允许使用 web+burger: 链接将用户发送到您的网站,并将访问的 Burger URL插入%s占位符。

+ +

该脚本必须从与处理程序URL相同的源运行(因此, https://www.google.com/ 上的任何页面),并且处理程序URL必须为 http https

+ +

将通知用户您的代码要求注册协议处理程序,以便他们可以决定是否允许它。有关 https://www.google.com/ 上的示例,请参见以下屏幕截图:

+ +

+ +
+

"Register a webmail service as mailto handler" 展示了如何从跨平台组件对象模块(XPCOM)中做到这一切.

+
+ +

规范

+ + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('HTML WHATWG', 'webappapis.html#dom-navigator-registerprotocolhandler', 'registerProtocolHandler()')}}{{Spec2('HTML WHATWG')}}Initial definition
+ +

浏览器兼容性

+ +

{{Compat("api.Navigator.registerProtocolHandler")}}

+ +

参见

+ + diff --git a/files/zh-cn/web/api/navigator/registerprotocolhandler/web-based_protocol_handlers/index.html b/files/zh-cn/web/api/navigator/registerprotocolhandler/web-based_protocol_handlers/index.html new file mode 100644 index 0000000000..34085a54f2 --- /dev/null +++ b/files/zh-cn/web/api/navigator/registerprotocolhandler/web-based_protocol_handlers/index.html @@ -0,0 +1,133 @@ +--- +title: Web-based protocol handlers +slug: Web/API/Navigator/registerProtocolHandler/Web-based_protocol_handlers +translation_of: Web/API/Navigator/registerProtocolHandler/Web-based_protocol_handlers +--- +
{{Fx_minversion_header(3)}}
+ +

背景

+ +

利用非http协议,从网页链接到一些别的资源,这种做法是相当普遍的。比如 mailto: 协议:

+ +
+
<a href="mailto:webmaster@example.com">Web Master</a>
+
+ +

当Web页面作者想直接从网页上,为用户提供一个方便的方式发送一个电子邮件,时可以使用mailto:链接。激活链接时,浏览器应该启动默认的桌面应用程序来处理电子邮件。你可以认为这是一个基于桌面的协议处理器。

+ +

基于网络的协议处理程序也允许基于web的应用程序参与这一过程。随着越来越多的类型的应用程序迁移到web,这变得越来越重要。事实上,有许多基于web的电子邮件处理的应用程序可以处理一个mailto链接。

+ +

注册

+ +

设置一个web应用程序作为一个协议处理器不是一个很麻烦的过程。web应用程序可以使用registerProtocolHandler()注册到浏览器上,从而对于一个给定的协议来讲,作为一个潜在的处理程序。例如:

+ +
navigator.registerProtocolHandler("mailto",
+                                  "https://www.example.com/?uri=%s",
+                                  "Example Mail");
+
+ +

参数为:

+ + + +

当一个浏览器执行这段代码时,它应该向用户显示一个请求,让用户许可为处理这个协议而注册一个web应用程序的请求。Firefox在通知栏区域显示一个提示:

+ +

Image:wph-notification.png

+ +
Note:试图执行登记或注册时,当前网页必须与提供的URL模板在相同的域,否则将会失败。例如,http://example.com/homepage.html可以为http://example.com/handle_mailto/%s注册一个协议处理程序, 但http://example.org/handle_mailto/%s不可以.
+ +

 

+ +

多次注册相同的协议处理程序会弹出不同的通知,表明协议处理器已经注册。因此,发起一个注册协议处理程序的请求,之后检查是否注册是一个很好的方法。比如下面的例子。

+ +

例子

+ +
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+  <title>Web Protocol Handler Sample - Register</title>
+  <script type="text/javascript">
+    var url = "http://starkravingfinkle.org/projects/wph/handler.php?value=%s";
+    if (!navigator.isProtocolHandlerRegistered("fake", url)) {
+      navigator.registerProtocolHandler("fake", url, "Fake Protocol");
+    }
+  </script>
+</head>
+<body>
+  <h1>Web Protocol Handler Sample</h1>
+  <p>This web page will install a web protocol handler for the <code>fake:</code> protocol.</p>
+</body>
+</html>
+
+ +

激活

+ +

现在,只要用户点击链接,使用注册协议,浏览器将跳转到web应用程序注册时提供的URL。Firefox在默认情况下,跳转前会提示用户操作。

+ +

Image:wph-launch.png

+ +

Example

+ +
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+  <title>Web Protocol Handler Sample - Test</title>
+</head>
+<body>
+  <p>Hey have you seen <a href="fake:this%20is%20fake">this</a> before?</p>
+</body>
+</html>
+
+ +

处理

+ +

下一步是处理这个动作。浏览器在激活的链接中提取出href属性,之后与注册时提供的URL模板进行拼装,之后经由拼装好的URL发起一个HTTP GET请求.因此下面的例子中,浏览器会基于此URL发起一个GET请求:

+ +
http://starkravingfinkle.org/projects/wph/handler.php?value=fake:this%20is%20fake
+ +

服务端代码可以提取查询字符串的参数,执行所需的操作。

+ +
Note:服务端代码会接收到href的全部内容。这意味着服务端代码必须解析出数据中的协议。
+ +

Example

+ +
<?php
+$value = "";
+if ( isset ( $_GET["value"] ) ) {
+  $value = $_GET["value"];
+}
+?>
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+    <title>Web Protocol Handler Sample</title>
+</head>
+<body>
+  <h1>Web Protocol Handler Sample - Handler</h1>
+  <p>This web page is called when handling a <code>fake:</code> protocol action. The data sent:</p>
+  <textarea>
+<?php echo(htmlspecialchars($value, ENT_QUOTES, 'UTF-8')); ?>
+  </textarea>
+</body>
+</html>
+
+ +

参考

+ + + +

See also

+ + -- cgit v1.2.3-54-g00ecf