【问题标题】:What's wrong with this javascript statement? [duplicate]这个 javascript 语句有什么问题? [复制]
【发布时间】:2013-11-27 23:24:46
【问题描述】:

致那些因为之前有人问过而投反对票的好人:我的问题不是关于隐式事件参数。我不知道。事件参数是答案,而不是问题。


function myEventHandler() {
  var eventSrcType=(event.srcElement) ? event.srcElement.type : 'type undefined';
  alert(eventSrcType);
}

当用户单击图像(“onclick”)时调用该函数,例如

<a href="javascript:void(0)" onclick="myEventHandler();">

显然分配有问题,因为alert 从未被执行。这里有什么问题?

(我试过window.event,但Dreamweaver 没有提示eventwindow 的成员。无论如何,它也不起作用)

编辑
所有答案都暗示隐式传递的event。所以我将它添加为函数的参数(不带参数调用),

function myEventHandler(event) {
  var eventSrcType=(event.srcElement) ? event.srcElement.type : 'type undefined';
  alert(eventSrcType);
}

但我仍然没有收到警报。

this 作为参数传递会显示“类型未定义”,但我希望这里是锚类型。

【问题讨论】:

  • @downvoter:请解释为什么这不是一个好问题。
  • 我没有DV,但可能是因为之前被问过多次
  • Ehh...停止使用内联事件处理程序(切换到 addEventListener )和愚蠢的 javascript:void(0) 可憎。
  • @bažmegakapa:既然你打电话给javascript:void(0) 既愚蠢又可憎,你能告诉我们什么是正确的方法吗?链接没问题。
  • @GeertGoeteyn 很高兴你问:)。当您需要一个除了调用 Javascript click 事件处理程序之外什么都不做的元素时,请使用 <button type="button">,而不是链接,它旨在指向某些东西 - 因此,使用 javascript:void(0) 只不过是可憎的。这是一种应该被遗忘的做法,是过去的糟糕记忆,但过时的 Javascript 教程仍然存在。 Read more

标签: javascript events


【解决方案1】:

您在函数中缺少event 参数,因此您可能遇到了空引用异常。

function myEventHandler(event) {
  var eventSrcType=(event.srcElement) ? event.srcElement.type : 'type undefined';
  alert(eventSrcType);
}

【讨论】:

  • 我在onclick事件中传递什么?另外,我不应该显示“类型未定义”吗?
  • @stevenh 你什么都没通过。每个事件处理程序都会自动获取事件对象作为其第一个参数。您的代码因错误而失败,因为 event 未定义,因此它不能具有 srcElement 属性或任何其他属性。请学习检查您的浏览器控制台,您会看到这样的错误。
  • @bažmegakapa 如果有人在没有参数的情况下调用它,则不会,通过将 "myEventHandler()" 分配给他们的元素 onclick 属性
【解决方案2】:

event 变量未在任何地方定义。它通常作为第一个参数传递给事件回调,但它不包含在您的函数签名中。试试这个函数签名:

function myEventHandler(event) {

【讨论】:

    【解决方案3】:

    以上所有答案都是正确的。您未能理解的是您必须将该事件对象传递给您使用它的函数。我检查了你的代码,你的点击处理程序是 function onclick(event) { showFS();} 但应该是function onclick(event) { showFS(event);}

    【讨论】:

    • 我明白你的意思,但是我的代码和你说的不一样。我没有在我的事件处理程序中调用 showFS。我将 指定 showFS 作为 事件处理程序。因此,我希望它涵盖相同的参数列表。
    【解决方案4】:

    onclick中有一个隐式事件参数

    function myfunction(event)
    {
        console.log("srcElement " + event.srcElement);
    }
    

    http://javascript.info/tutorial/obtaining-event-object

    IE9之前的IE没有通过,所以你需要检查window.event。

    【讨论】:

      【解决方案5】:

      此外,您的问题是未指定 event 参数是您附加事件监听器的方式。

      您通过将元素的 onclick 属性设置为 "myEventHandler()" 来附加点击事件处理程序,这有点糟糕,因为

      • 必须对字符串进行评估,才能进行函数调用
      • 您正在直接调用您的函数,传递零个参数

      如果您省略括号,只设置onclick="myEventHandler",您将不会再显式调用没有参数的函数。但它仍然是一个字符串值,必须对其进行评估才能获得对实际函数的引用。

      您可能想要做的是通过EventTarget.prototype.addEventListener 附加您的事件监听器,例如

      var images = document.getElementsByTagName ("img");
      
      [].forEach.call (images, function (img) {
        img.addEventListener ("click", myEventHandler);
      })
      

      你的函数可能看起来像这样

      function myEventHandler(event) {
        var eventSrc = event.srcElement || event.target || {},
            eventSrcType = eventSrc.type || "type undefined";
      
            alert(eventSrcType);
      }
      

      【讨论】:

        【解决方案6】:

        HTML 代码必须如下所示

        <img onclick="myEventHandler(this)" />
        

        JS:

        function myEventHandler(event) {
            var eventSrcType=(event.srcElement) ? event.srcElement.type : 'type undefined';
            alert(eventSrcType);
        }
        

        您应该会看到显示的“未定义类型”。

        根据您是否省略this 和/或event,您会得到不同的结果。尝试每种组合,直到获得所需的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多