aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/orphaned/web/guide/events/event_handlers/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'files/zh-cn/orphaned/web/guide/events/event_handlers/index.html')
-rw-r--r--files/zh-cn/orphaned/web/guide/events/event_handlers/index.html181
1 files changed, 181 insertions, 0 deletions
diff --git a/files/zh-cn/orphaned/web/guide/events/event_handlers/index.html b/files/zh-cn/orphaned/web/guide/events/event_handlers/index.html
new file mode 100644
index 0000000000..52471bde8e
--- /dev/null
+++ b/files/zh-cn/orphaned/web/guide/events/event_handlers/index.html
@@ -0,0 +1,181 @@
+---
+title: DOM 事件回调
+slug: orphaned/Web/Guide/Events/Event_handlers
+translation_of: Web/Guide/Events/Event_handlers
+original_slug: Web/Guide/Events/Event_handlers
+---
+<h2 id="概要">概要</h2>
+
+<p>Web平台提供了多种方式来获取 <a href="https://developer.mozilla.org/zh-CN/docs/Web/Events">DOM events</a> 的通知。两种常见的风格是:广义 {{domxref("EventTarget.addEventListener", "addEventListener()")}} 和一组特定的<em><strong>on-event</strong></em>处理器。本页重点介绍后者如何工作的细节。</p>
+
+<h3 id="注册on-event_处理器">注册<em>on-event</em> 处理器</h3>
+
+<p><em><strong>on-event </strong></em>处理器是由DOM元素提供的一组属性,以帮助管理元素如何对事件反应。元素可以使可交互性的(例如链接,按钮,图像,表单)或者非可交互的(比如基本文档本身等)。事件是异性行为,像点击,检测到按下按键,获得焦点等。<em><strong>on-event </strong></em>事件通常被相应地命名,诸如onclick,onkeypress,onfocus等。</p>
+
+<p>你可以为一个给定的对象的某个特定事件(比如{{event("click")}})指定一个 <code>on&lt;...&gt;</code> 事件处理器,使用以下几种不同的方式:</p>
+
+<ul>
+ <li>在元素上使用 HTML {{Glossary("attribute")}} <code>on<em>{eventtype}</em></code> ,例如:<br>
+ <code>&lt;button <u>onclick="return handleClick(event);"</u>&gt;</code>,</li>
+ <li>或者通过 JavaScript 设置相应的属性( {{Glossary("property/JavaScript", "property")}}),例如:<br>
+ <code>document.getElementById("mybutton")<u>.onclick = function(event) { ... }</u></code>.</li>
+</ul>
+
+<p>注意,每个对象对于给定的事件<strong>只能有一个</strong>事件处理器(尽管该处理程序可以调用多个子处理器)。这就是为什么{{domxref("EventTarget.addEventListener", "addEventListener()")}} 通常是获得事件通知的更好方法,特别是当你希望彼此独立地应用各种事件处理程序时,即使对于相同的事件和/或相同的元素也是如此。</p>
+
+<p>还要注意,事件处理器是自动调用的,而不是程序员的意志(尽管你可以使用像 <code>mybutton.onclick(myevent); )。</code>因为它们更多地用作可以<strong>分配</strong>真实处理器函数的占位符。</p>
+
+<h3 id="非元素对象">非元素对象</h3>
+
+<p>事件处理器也可以使用属性设置在生成事件的许多非元素对象上, 包括{{ domxref("window") }}, {{ domxref("document") }}, {{ domxref("XMLHttpRequest") }}, 和其他等等,例如:</p>
+
+<pre><code>xhr.onprogress = function() { ... }</code></pre>
+
+<h2 id="细节">细节</h2>
+
+<h3 id="HTML的_on&lt;...>_属性值_和相应JavaScript">HTML的 on&lt;...&gt; 属性值 和相应JavaScript</h3>
+
+<p>通过 on&lt;...&gt; 元素属性注册的处理程序将通过相应的 on&lt;...&gt; 对象属性可用,相反,则不可用:</p>
+
+<pre><code>&lt;div id="a" onclick="alert('old')"&gt;Open the Developer Tools Console to see the output.&lt;/div&gt;
+
+&lt;script&gt;
+window.onload = function () {
+ var div = document.getElementById("a");
+ console.log("Attribute reflected as a property: ", div.onclick.toString());
+ // Prints: function onclick(event) { alert('old') }
+ div.onclick = function() { alert('new') };
+ console.log("Changed property to: ", div.onclick.toString());
+ // Prints: function () { alert('new') }
+ console.log("Attribute value is unchanged: ", div.getAttribute("onclick"));
+ // Prints: alert('old')
+}
+&lt;/script&gt;</code></pre>
+
+<p>由于历史原因,{{HTMLElement("body")}} 和 {{HTMLElement("frameset")}} 元素中的某些元素属性/对象属性实际上是在其父 {{domxref("Window")}} 对象上设置了事件处理器(这些 HTML 命名: <code>onblur</code>, <code>onerror</code>, <code>onfocus</code>, <code>onload</code>, <code>onscroll</code>.)。</p>
+
+<h3 id="事件处理器的参数,this_绑定和返回值">事件处理器的参数,<code>this</code> 绑定和返回值</h3>
+
+<p>当事件处理程序被指定为 <strong>HTML 属性</strong>,指定的代码被包装在有 <strong>以下参数 </strong>的函数中:</p>
+
+<ul>
+ <li><code>event</code> - 对于所有的事件处理器,除了 {{domxref("GlobalEventHandlers.onerror", "onerror")}}.</li>
+ <li><code>event</code>, <code>source</code>, <code>lineno</code>, <code>colno</code>, and <code>error</code> 对于 {{domxref("GlobalEventHandlers.onerror", "onerror")}} 事件处理器。注意,<code>event</code> 参数实际上包含字符串的错误消息。</li>
+</ul>
+
+<p>当事件处理器被调用,事件处理器内部的 <code>this</code> 关键字被设置为注册该事件处理器的 DOM 元素。更多信息查看 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#In_an_in%E2%80%93line_event_handler">this 关键字文档</a><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#In_an_in%E2%80%93line_event_handler"> </a>.</p>
+
+<p>事件处理器的返回值决定了事件是否被取消。返回值的具体处理方式取决于事件的类型,更多信息查看 <a href="https://html.spec.whatwg.org/multipage/webappapis.html#the-event-handler-processing-algorithm">"The event handler processing algorithm" in the HTML specification</a>.</p>
+
+<h3 id="什么时候调用事件处理程序">什么时候调用事件处理程序</h3>
+
+<p>TBD (non-capturing listener)</p>
+
+<h3 id="术语">术语 </h3>
+
+<p>术语 <strong>事件处理器(event handler)</strong> 可用于指:</p>
+
+<ul>
+ <li>注册的事件通知的任何函数或对象,</li>
+ <li>或更具体地说,是通过HTML中的 <code>on... </code>属性或web API中的属性来注册事件监听器的机制,例如 <code>&lt;button onclick="alert(this)"&gt; </code>或 <code>window.onload = function() { /* ... */ }</code>。</li>
+</ul>
+
+<p>在讨论各种监听事件的方法时:</p>
+
+<ul>
+ <li> <strong>事件侦听器(event listener)</strong>是指通过 {{domxref("EventTarget.addEventListener()")}} 注册的函数或对象,</li>
+ <li>而<strong>事件处理器(event handler)</strong>是指通过 <code>on...</code>  属性注册的函数。</li>
+</ul>
+
+<h2 id="Specifications" name="Specifications">规范</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#event-handler-attributes', 'event handlers')}}</td>
+ <td>{{Spec2('HTML WHATWG')}}</td>
+ <td> </td>
+ </tr>
+ <tr>
+ <td>{{SpecName('HTML5 W3C', 'webappapis.html#event-handler-attributes', 'event handlers')}}</td>
+ <td>{{Spec2('HTML5 W3C')}}</td>
+ <td> </td>
+ </tr>
+ </tbody>
+</table>
+
+<h2 id="Browser_Compatibility" name="Browser_Compatibility">浏览器兼容性</h2>
+
+<p>{{ CompatibilityTable() }}</p>
+
+<div id="compat-desktop">
+<table class="compat-table">
+ <tbody>
+ <tr>
+ <th>Feature</th>
+ <th>Chrome</th>
+ <th>Firefox (Gecko)</th>
+ <th>Internet Explorer</th>
+ <th>Opera</th>
+ <th>Safari (WebKit)</th>
+ </tr>
+ <tr>
+ <td>Basic support</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<div id="compat-mobile">
+<table class="compat-table">
+ <tbody>
+ <tr>
+ <th>Feature</th>
+ <th>Android</th>
+ <th>Firefox Mobile (Gecko)</th>
+ <th>IE Mobile</th>
+ <th>Opera Mobile</th>
+ <th>Safari Mobile</th>
+ </tr>
+ <tr>
+ <td>Basic support</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ <td>{{ CompatVersionUnknown() }}</td>
+ </tr>
+ </tbody>
+</table>
+</div>
+
+<h3 id="Firefox_9中的事件处理器的变动">Firefox 9中的事件处理器的变动</h3>
+
+<p>为了更好地匹配规范,并提高跨浏览器兼容性,在Gecko 9.0 {{ geckoRelease("9.0") }} 中更改了基本级别事件处理器的实现方式。</p>
+
+<p>具体来说,在过去,事件处理器没有被正确地实现为标准的IDL属性。在 Gecko 9.0,这一点被改变。因此,Gecko的事件处理程序的某些行为已经改变。特别地,它们现在含有为标准IDL属性行为的所有特性。在大多数情况下,这不应该影响网页或附加内容。然而,还有一些具体的事情需要注意。</p>
+
+<h4 id="检测事件处理程序属性的存在">检测事件处理程序属性的存在</h4>
+
+<p>你可以使用 JavaScript 的 <code><a href="https://developer.mozilla.org/en-US/JavaScript/Reference/Operators/in" title="en/JavaScript/Reference/Operators/in">in</a> </code>运算符来检测事件处理器属性(例如,onload)的存在。例如:</p>
+
+<pre class="brush: js">if ("onsomenewfeature" in window) {
+  /* do something amazing */
+}
+</pre>
+
+<h4 id="事件处理程序和原型">事件处理程序和原型</h4>
+
+<p>您不能设置或访问DOM原型对象上任何IDL定义的属性的值,这意味着您不能更改 <code>Window.prototype.onload</code>。在过去,事件处理程序(onload等)没有被实现为Gecko中的IDL属性,所以可以这样做,而现在你不能这样做,这提高了兼容性。</p>