diff options
author | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
---|---|---|
committer | Peter Bengtsson <mail@peterbe.com> | 2020-12-08 14:40:17 -0500 |
commit | 33058f2b292b3a581333bdfb21b8f671898c5060 (patch) | |
tree | 51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/api/navigator/registerprotocolhandler | |
parent | 8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff) | |
download | translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.gz translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.tar.bz2 translated-content-33058f2b292b3a581333bdfb21b8f671898c5060.zip |
initial commit
Diffstat (limited to 'files/zh-cn/web/api/navigator/registerprotocolhandler')
-rw-r--r-- | files/zh-cn/web/api/navigator/registerprotocolhandler/index.html | 151 | ||||
-rw-r--r-- | files/zh-cn/web/api/navigator/registerprotocolhandler/web-based_protocol_handlers/index.html | 133 |
2 files changed, 284 insertions, 0 deletions
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 +--- +<div>{{APIRef("HTML DOM")}}{{securecontext_header}}</div> + +<p><strong>{{domxref("Navigator")}}</strong> 的方法 <code><strong>registerProtocolHandler()</strong></code> 让 web 站点为自身注册用于打开或处理特定 URL 方案(又名协议)的能力。</p> + +<p>举个例子,此API允许Web邮件站点打开 <code>mailto:</code> URL,或让 <abbr title="Voice over Internet Protocol, also called IP telephony">VoIP</abbr> 站点打开 <code>tel:</code> URL。</p> + +<h2 id="语法">语法</h2> + +<pre class="notranslate">navigator.registerProtocolHandler(<var>scheme</var>, <var>url</var>, <var>title</var>); +</pre> + +<div class="blockIndicator note"> +<p><strong>Note:</strong> 最近更新为 <code>navigator.registerProtocolHandler(<var>scheme</var>, <var>url</var>)</code>, 但目前没有浏览器支持该版本。</p> +</div> + +<h3 id="参数">参数</h3> + +<dl> + <dt><code><var>scheme</var></code></dt> + <dd>一个包含站点希望处理的协议的字符串。例如,你可以通过传入 <code>"sms"</code> 来注册处理SMS文本信息链接。</dd> +</dl> + +<dl> + <dt><code>url</code></dt> + <dd>处理器的URL,string类型。这个字符串应该包含一个"%s"的占位符,其会被将要受理的文档的 <a href="https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent">escaped</a> 链接所替换。这个链接(译者按:指将要受理的文档的 escaped 链接,也就是替换占位符的字符串)可能是一个真实的URL,或者是一个电话号码,邮件地址之类的。</dd> + <dd> + <div class="note">这个处理器的 URL 必须以 <code>http</code> 或者 <code>https</code> 协议标记作为开头,最好是 <code>https</code> ,以满足一些浏览器出于安全考虑的要求。</div> + </dd> + <dt><code>title {{Obsolete_Inline}}</code></dt> + <dd>一个用户可理解的处理器标题。标题会展示给用户,例如弹出对话框“允许这个站点处理[scheme]链接吗?”或者在浏览器设置中列出注册的处理器时。</dd> + <dd> + <div class="blockIndicator note"> + <p><strong>Note:</strong> 出于欺骗的考虑,标题已从规范中删除,但当前所有的浏览器仍要求使用该标题。 建议始终设置标题,因为支持更新规范的浏览器很可能会向后兼容,并且仍接受标题(但不使用它)。</p> + </div> + </dd> + <dd></dd> +</dl> + +<h3 id="异常">异常</h3> + +<ul> + <li>指定了一个非法的协议标记,例如一个浏览器自身的标记(<code>https:</code>, <code>about:</code> 等)。</li> + <li>处理器URL的 <a href="https://wiki.developer.mozilla.org/en-US/docs/Glossary/Origin">origin</a> 与调用这个API的页面的 origin不匹配。</li> + <li>浏览器要求这个函数由安全的上下文调用。</li> + <li>浏览器要求处理器的URL使用 HTTPS 协议。</li> +</ul> + +<dl> + <dt><code>SecurityError</code></dt> + <dd>用户代理阻止了处理器的注册。这可能是由于:</dd> + <dt><code>SyntaxError</code></dt> + <dd>在指定的协议处理地址的字符串中缺失了 <code>%s</code> 占位符.</dd> +</dl> + +<h2 id="允许的协议标记">允许的协议标记</h2> + +<p>出于安全考虑,<code>registerProtocolHandler()</code> 严格限制了允许注册的协议标记。以 <code>web+</code> 作为前缀的方式可以注册一个自定义的标记协议,至少要有5个字符的长度(包括 <code>web+</code> 前缀),而且只能使用小写的ASCII字母作为名称。例如 <code>web+burger</code> ,如下面的{{anch("示例")}}所示。</p> + +<p>除此之外,还可以使用下文所列的白名单中的协议标记:</p> + +<div class="threecolumns"> +<ul> + <li><code>bitcoin</code></li> + <li><code>geo</code></li> + <li><code>im</code></li> + <li><code>irc</code></li> + <li><code>ircs</code></li> + <li><code>magnet</code></li> + <li><code>mailto</code></li> + <li><code>mms</code></li> + <li><code>news</code></li> + <li><code>nntp</code></li> + <li><code>openpgp4fpr</code></li> + <li><code>sip</code></li> + <li><code>sms</code></li> + <li><code>smsto</code></li> + <li><code>ssh</code></li> + <li><code>tel</code></li> + <li><code>urn</code></li> + <li><code>webcal</code></li> + <li><code>wtai</code></li> + <li><code>xmpp</code></li> +</ul> +</div> + +<h2 id="示例">示例</h2> + +<p>如果您的网站是 <code>https://www.google.com/</code>,则可以为其注册一个协议处理程序来处理 <code>web+burger:</code>链接,如下所示:</p> + +<pre class="brush: js notranslate">navigator.registerProtocolHandler("web+burger", + "https://www.google.com/?uri=%s", + "Burger handler"); +</pre> + +<p>这将创建一个处理程序,该处理程序允许使用 <code>web+burger: </code>链接将用户发送到您的网站,并将访问的 Burger URL插入<code>%s</code>占位符。</p> + +<p>该脚本必须从与处理程序URL相同的源运行(因此, <code>https://www.google.com/ </code>上的任何页面),并且处理程序URL必须为 <code>http </code>或 <code>https</code>。</p> + +<p>将通知用户您的代码要求注册协议处理程序,以便他们可以决定是否允许它。有关 <code>https://www.google.com/ </code>上的示例,请参见以下屏幕截图:</p> + +<p><img alt="" src="https://mdn.mozillademos.org/files/9683/protocolregister.png"></p> + +<div class="note"> +<p>"<a href="/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebContentHandlerRegistrar#Getting_most_recent_window">Register a webmail service as mailto handler</a>" 展示了如何从跨平台组件对象模块(XPCOM)中做到这一切.</p> +</div> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Status</th> + <th scope="col">Comment</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('HTML WHATWG', 'webappapis.html#dom-navigator-registerprotocolhandler', 'registerProtocolHandler()')}}</td> + <td>{{Spec2('HTML WHATWG')}}</td> + <td>Initial definition</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + +<p>{{Compat("api.Navigator.registerProtocolHandler")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li><a href="/en-US/docs/Web-based_protocol_handlers">Web-based protocol handlers</a></li> + <li><a href="http://blog.mozilla.com/webdev/2010/07/26/registerprotocolhandler-enhancing-the-federated-web/">RegisterProtocolHandler Enhancing the Federated Web</a> at Mozilla Webdev</li> + <li><a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#whitelisted-scheme">Web Application APIs - Custom scheme and content handlers - Whitelisted schemes</a></li> + <li><a href="/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebContentHandlerRegistrar#Getting_most_recent_window">Register a webmail service as mailto handler</a> shows how to do <code>registerProtocolHandler</code> from XPCOM scope.</li> + <li><a href="/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIWebContentHandlerRegistrar#registerProtocolHandler">XPCOM Interface Reference > nsIWebContentHandlerRegistrar > registerContentHandler</a> - This shows how to use this function XPCOM scope</li> +</ul> 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 +--- +<div>{{Fx_minversion_header(3)}}</div> + +<h2 id="Background" name="Background">背景</h2> + +<p>利用非http协议,从网页链接到一些别的资源,这种做法是相当普遍的。比如 <code>mailto:</code> 协议:</p> + +<div style="overflow: hidden;"> +<pre class="brush:html"><a href="mailto:webmaster@example.com">Web Master</a></pre> +</div> + +<p>当Web页面作者想直接从网页上,为用户提供一个方便的方式发送一个电子邮件,时可以使用mailto:链接。激活链接时,浏览器应该启动默认的桌面应用程序来处理电子邮件。你可以认为这是一个<em>基于桌面的</em>协议处理器。</p> + +<p>基于网络的协议处理程序也允许基于web的应用程序参与这一过程。随着越来越多的类型的应用程序迁移到web,这变得越来越重要。事实上,有许多基于web的电子邮件处理的应用程序可以处理一个mailto链接。</p> + +<h2 id="Registering" name="Registering">注册</h2> + +<p>设置一个web应用程序作为一个协议处理器不是一个很麻烦的过程。web应用程序可以使用<a href="/en-US/docs/Web/API/navigator.registerProtocolHandler">registerProtocolHandler()</a>注册到浏览器上,从而对于一个给定的协议来讲,作为一个潜在的处理程序。例如:</p> + +<pre class="brush: js">navigator.registerProtocolHandler("mailto", + "https://www.example.com/?uri=%s", + "Example Mail"); +</pre> + +<p>参数为:</p> + +<ul> + <li>协议名称.</li> + <li>url模板。%s用来替换链接的<code>href</code>属性,之后通过这个url来发起一个GET请求.</li> + <li>一个对用户友好的协议处理器的名字.</li> +</ul> + +<p>当一个浏览器执行这段代码时,它应该向用户显示一个请求,让用户许可为处理这个协议而注册一个web应用程序的请求。Firefox在通知栏区域显示一个提示:</p> + +<p><img alt="Image:wph-notification.png" src="/@api/deki/files/972/=Wph-notification.png"></p> + +<div class="note"><strong>Note:</strong>试图执行登记或注册时,当前网页必须与提供的URL模板在相同的域,否则将会失败。例如,http://example.com/homepage.html可以为<code class="plain" style="font-size: 14px;">http://example.com/handle_mailto/%s</code><span style="line-height: 1.5;">注册一个协议处理程序</span><span style="line-height: 1.5em;">, 但</span><code class="plain" style="font-size: 14px;">http://example.<em><strong>org</strong></em>/handle_mailto/%s不可以</code><span style="line-height: 1.5em;">.</span></div> + +<p> </p> + +<p>多次注册相同的协议处理程序会弹出不同的通知,表明协议处理器已经注册。因此,发起一个注册协议处理程序的请求,之后检查是否注册是一个很好的方法。比如下面的例子。</p> + +<h3 id="Example" name="Example">例子</h3> + +<pre class="brush: js"><!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> +</pre> + +<h2 id="Activating" name="Activating">激活</h2> + +<p>现在,只要用户点击链接,使用注册协议,浏览器将跳转到web应用程序注册时提供的URL。Firefox在默认情况下,跳转前会提示用户操作。</p> + +<p><img alt="Image:wph-launch.png" src="/@api/deki/files/971/=Wph-launch.png"></p> + +<h3 id="Example_2" name="Example_2">Example</h3> + +<pre class="brush: html"><!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> +</pre> + +<h2 id="Handling" name="Handling">处理</h2> + +<p>下一步是处理这个动作。浏览器在激活的链接中提取出href属性,之后与注册时提供的URL模板进行拼装,之后经由拼装好的URL发起一个HTTP GET请求.因此下面的例子中,浏览器会基于此URL发起一个GET请求:</p> + +<pre>http://starkravingfinkle.org/projects/wph/handler.php?value=fake:this%20is%20fake</pre> + +<p>服务端代码可以提取查询字符串的参数,执行所需的操作。</p> + +<div class="note"><strong>Note:</strong>服务端代码会接收到href的<strong>全部</strong>内容。这意味着服务端代码必须解析出数据中的协议。</div> + +<h3 id="Example_3" name="Example_3">Example</h3> + +<pre class="brush: php"><?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> +</pre> + +<h2 id="References" name="References">参考</h2> + +<ul> + <li><a href="http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#custom-handlers">http://www.w3.org/TR/2011/WD-html5-20110525/timers.html#custom-handlers</a></li> +</ul> + +<h2 id="See_also" name="See_also">See also</h2> + +<ul> + <li><a href="/en-US/docs/DOM/window.navigator.registerContentHandler" title="DOM/window.navigator.registerContentHandler">window.navigator.registerContentHandler</a></li> + <li><a href="/en-US/docs/XPCOM_Interface_Reference/nsIProtocolHandler" title="nsIProtocolHandler">nsIProtocolHandler</a> (XUL only)</li> + <li><a class="external" href="http://blog.mozilla.com/webdev/2010/07/26/registerprotocolhandler-enhancing-the-federated-web/" title="http://blog.mozilla.com/webdev/2010/07/26/registerprotocolhandler-enhancing-the-federated-web/">RegisterProtocolHandler Enhancing the Federated Web</a> at Mozilla Webdev</li> + <li><a href="https://developers.google.com/web/updates/2011/06/Registering-a-custom-protocol-handler">Register a custom protocolHandler</a> at Google Developers.</li> +</ul> |