diff options
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.html | 181 |
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<...></code> 事件处理器,使用以下几种不同的方式:</p> + +<ul> + <li>在元素上使用 HTML {{Glossary("attribute")}} <code>on<em>{eventtype}</em></code> ,例如:<br> + <code><button <u>onclick="return handleClick(event);"</u>></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<...>_属性值_和相应JavaScript">HTML的 on<...> 属性值 和相应JavaScript</h3> + +<p>通过 on<...> 元素属性注册的处理程序将通过相应的 on<...> 对象属性可用,相反,则不可用:</p> + +<pre><code><div id="a" onclick="alert('old')">Open the Developer Tools Console to see the output.</div> + +<script> +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') +} +</script></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><button onclick="alert(this)"> </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> |