aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/api/navigator/registerprotocolhandler
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 14:40:17 -0500
commit33058f2b292b3a581333bdfb21b8f671898c5060 (patch)
tree51c3e392513ec574331b2d3f85c394445ea803c6 /files/zh-cn/web/api/navigator/registerprotocolhandler
parent8b66d724f7caf0157093fb09cfec8fbd0c6ad50a (diff)
downloadtranslated-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.html151
-rw-r--r--files/zh-cn/web/api/navigator/registerprotocolhandler/web-based_protocol_handlers/index.html133
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 &gt; nsIWebContentHandlerRegistrar &gt; 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">&lt;a href="mailto:webmaster@example.com"&gt;Web Master&lt;/a&gt;</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">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
+&lt;html lang="en"&gt;
+&lt;head&gt;
+ &lt;title&gt;Web Protocol Handler Sample - Register&lt;/title&gt;
+ &lt;script type="text/javascript"&gt;
+ var url = "http://starkravingfinkle.org/projects/wph/handler.php?value=%s";
+ if (!navigator.isProtocolHandlerRegistered("fake", url)) {
+ navigator.registerProtocolHandler("fake", url, "Fake Protocol");
+ }
+ &lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+ &lt;h1&gt;Web Protocol Handler Sample&lt;/h1&gt;
+ &lt;p&gt;This web page will install a web protocol handler for the &lt;code&gt;fake:&lt;/code&gt; protocol.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</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">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
+&lt;html lang="en"&gt;
+&lt;head&gt;
+ &lt;title&gt;Web Protocol Handler Sample - Test&lt;/title&gt;
+&lt;/head&gt;
+&lt;body&gt;
+ &lt;p&gt;Hey have you seen &lt;a href="fake:this%20is%20fake"&gt;this&lt;/a&gt; before?&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</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">&lt;?php
+$value = "";
+if ( isset ( $_GET["value"] ) ) {
+ $value = $_GET["value"];
+}
+?&gt;
+
+&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
+&lt;html lang="en"&gt;
+&lt;head&gt;
+ &lt;title&gt;Web Protocol Handler Sample&lt;/title&gt;
+&lt;/head&gt;
+&lt;body&gt;
+ &lt;h1&gt;Web Protocol Handler Sample - Handler&lt;/h1&gt;
+ &lt;p&gt;This web page is called when handling a &lt;code&gt;fake:&lt;/code&gt; protocol action. The data sent:&lt;/p&gt;
+ &lt;textarea&gt;
+&lt;?php echo(htmlspecialchars($value, ENT_QUOTES, 'UTF-8')); ?&gt;
+ &lt;/textarea&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+</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>