diff options
Diffstat (limited to 'files/zh-cn/web/guide/events/event_handlers/index.html')
| -rw-r--r-- | files/zh-cn/web/guide/events/event_handlers/index.html | 180 |
1 files changed, 0 insertions, 180 deletions
diff --git a/files/zh-cn/web/guide/events/event_handlers/index.html b/files/zh-cn/web/guide/events/event_handlers/index.html deleted file mode 100644 index 279d77159c..0000000000 --- a/files/zh-cn/web/guide/events/event_handlers/index.html +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: DOM 事件回调 -slug: Web/Guide/Events/Event_handlers -translation_of: 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> |
