【问题标题】:document.getElementById().onClick() not firing on clickdocument.getElementById().onClick() 没有在点击时触发
【发布时间】:2018-04-23 19:20:43
【问题描述】:

我的 Rails 应用程序中的普通 HTML5 页面上有 webpack。

我在 Webpack 中定义了 onClick 处理程序:

$(document).ready(()=> {
  document.getElementById('add-card').onClick = () => {
    $('.ui.modal').modal('show');
  }
});

按钮在页面上呈现为:

<a class="ui button" id="add-card">Click me</a>

点击它什么也不做。但是,在控制台中,我可以看到处理程序已定义:

document.getElementById('add-card').onClick
ƒ () {
    $('.ui.modal').modal('show');
  }

当我使用document.getElementById('add-card').onClick() 执行它时,它运行良好!

如何让我的 onClick 处理程序在元素被点击时触发?

编辑:对于挑剔的观察者,我已经通过 Webpack 正确安装和配置了 jQuery。

【问题讨论】:

  • 为什么要混合使用 jQuery 和 vanilla JS?
  • 点击,而不是点击
  • 不应该是 $(document).ready()=> { 在第一行吗?看起来你有一个额外的“(”
  • @Rexa 不,.ready() 接受回调。见:learn.jquery.com/using-jquery-core/document-ready
  • @amingilani 啊,哎呀!我现在明白了!

标签: javascript jquery webpack


【解决方案1】:

您正在混合香草 js 和 jquery。你可以这样做

$(document).ready(()=> {
    document.getElementById('add-card').addEventListener('click', () => {
        $('.ui.modal').modal('show');
    })
});

或者你可以这样做

$(document).ready(()=> {
    $('#add-card').on('click', () => {
        $('.ui.modal').modal('show');
    });
});

当您执行document.getElementById('add-card') 时,您会返回一个Node,而不是一个jQuery 对象,因此没有onClick(虽然有onclick,但最好使用addEventListener)。如果你执行$('#add-card'),你会得到一个 jQuery 对象,所以你可以在它上面使用 jQuery 方法。

【讨论】:

  • OP 确实提到这是一个 Rails 应用程序,请注意。 JQuery 需要导入、库文件本身或 cdn。 Webpack 不会安装 jQuery,除非你告诉它这样做。
  • 等等,这行得通。为什么这是一个问题?我一直认为 jQuery 是原生 JS 的语法糖。
  • 是的,但是当您执行document.getElementById('add-card') 时,您会返回一个Node,而不是一个jQuery 对象,因此没有onClick(虽然有onclick,但最好是使用addEventListener)。如果你执行$('#add-card'),你会得到一个 jQuery 对象,所以你可以在它上面使用 jQuery 方法。
  • 也就是说,混合它们是没有问题的,但是你只需要知道你什么时候有什么类型的对象。
  • 这很好地解释了它。您能否将这个onClick vs onclick 移动到正文中,以便对 jQuery 和 Vanilla JS 进行解释,我会接受您的回答 :)
【解决方案2】:

onClick 替换为onclick

$(document).ready(()=> {
  document.getElementById('add-card').onclick = () => {
    $('.ui.modal').modal('show');
  }
});

【讨论】:

  • 不要鼓励他在这种情况下使用 jQuery。他甚至没有安装它,也没有在问题中标记
  • @Callat 呃,什么?
  • @Callat 我确实安装了 jQuery。谢谢回答者,这一定是我长期以来犯的最愚蠢的错误。
猜你喜欢
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多