【问题标题】:check event handler parameter检查事件处理程序参数
【发布时间】:2012-09-28 10:42:06
【问题描述】:

我在学习 Javascript 时得到了这段代码:

myLink.onmouseover = showLinkAttr;
function showLinkContent(evt) {
    if (evt) {
        var url = evt.target;
    }
    else {
        evt = window.event;
        var url = evt.srcElement;
    }
..............

我不知道为什么我们需要在创建事件处理程序参数“evt”之前检查它。我的想法是这段代码是多余的,因为“evt”不存在(这段代码在脚本文件的开头),表明我们应该在不检查的情况下创建它,如下所示:

  myLink.onmouseover = showLinkAttr;
  function showLinkContent(evt) {
        evt = window.event;
        var url = evt.srcElement;

但是,由于我是 JavaScript 新手,下面的代码是由专家编写的。那么,你能告诉我为什么她使用它而不是我在下面写的那个吗? 谢谢。

【问题讨论】:

  • 要接受其他一些问题的答案,您需要单击答案评分下方的勾号轮廓。

标签: javascript javascript-events


【解决方案1】:

你已经成功了一半...evt只有在客户端运行被称为 IE 的浏览器的那个可怜的借口时是未定义的。

IE 不会将事件对象传递给处理程序,但只有 1 个全局事件对象。这就是为什么您的事件处理程序检查事件对象是否已作为参数传递,如果没有,它会获取全局事件对象。不过,这可以写得更短:

evt = evt || window.event;//evt is equal to itself, if it's not undefined, else it's a reference to the global object

目标同上(你称它为var url,这令人困惑,可能是错误的):

var target = evt.target || evt.srcElement;

target(或 srcElement)返回对 DOM 元素(触发事件的元素)的引用,而不是 url,就像您的 varname 会让您相信的那样。
双管道|| 被称为默认运算符。

【讨论】:

    【解决方案2】:

    该代码迎合了不同浏览器之间的不一致性。详情看这篇文章:http://www.quirksmode.org/js/introevents.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多