【问题标题】:empty event listener: Is this ok?空事件监听器:这样可以吗?
【发布时间】:2012-10-03 17:10:29
【问题描述】:

一些快速背景

我正在构建一个在某些区域使用 html 网络视图的 iOS 应用程序。我想确保这些页面上的 html 按钮在外观和感觉上都尽可能像 iOS 按钮。为此,我想要一个点击状态,以便在点击时按下 html 按钮。现在在 HTML 中这很容易。您只需为 :active 或 :hover 或其他设置样式。我实际上已经定义了这个。然而,在 iOS 中,这些状态不会在点击时参与 - 至少在正常情况下是这样。所以我的目标是编写一个小脚本,为按钮添加一个类来改变它在touchstart时的外观。

问题

然而,事实证明我不需要那么复杂......纯属偶然,我使用以下代码进行了测试:

document.addEventListener('touchstart', function(event) {
    console.log("test");
}, true);

我对 javascript 和 jQuery 非常熟悉,所以我打算做的只是检查我的语法并确保在我点击按钮时触发了 eventListener。令我惊讶的是,css 中按钮的 :active 状态被触发(以及 :hover 状态)。那段代码……解决了我的问题!

我的问题

所以这是我的问题:上面的代码有效吗?我的意思是,这样做不好吗?就好像空的 eventListener 只是触发了桌面浏览器已经提供的行为。使用这种方法有什么问题吗?我是绿色的,但我不想养成坏习惯。如果这是一种糟糕的编码方式,我不想使用它。

感谢你们提供的任何见解!

【问题讨论】:

  • 如果你愿意,你可以有空的事件监听器,但我认为 console.log() 会在 IE 中给出一个 js 错误
  • 空听众没有错。但是您拥有的每个听众都会增加您可能不应该关心的那一点点开销。检查console 和console.log 很重要,因为除非打开调试控制台(如Firebug 或开发者工具),否则它们可能不可用——而不是基于浏览器。
  • 我致力于保持代码精简和平均。出于本文的目的,我将 console.log 命令留在代码中以说明我的初衷。之后,我确实删除了它,只是将事件侦听器完全留空。
  • 你确定没有听众他们就不能工作吗?在我看来,更改脚本碰巧刷新了缓存。
  • 是的,我很肯定。我删除了监听器,他们再次停止显示 :active :hover 状态。我完全不知道为什么添加一个空的侦听器会触发移动 safari 显示 :active :hover 状态的能力,但它似乎这样做了。

标签: javascript jquery ios mobile button


【解决方案1】:

我个人认为空事件侦听器没有任何问题(除了函数调用的开销 --- 无论如何在这里听起来可以忽略不计)。我建议你利用 jQuery 的 noop 函数,但如果你必须添加一个事件监听器但让它什么都不做:

$(document).on('touchstart', $.noop);

// or

document.addEventListener('touchstart', $.noop);

【讨论】:

  • 您介意解释一下这样做的好处吗?我不熟悉noop。 ...感谢您的反馈!
  • 我用谷歌搜索 noop 并想出了这个“当你希望传递一个什么都不做的函数时,你可以使用这个空函数。这对于提供可选回调的插件作者很有用;在这种情况下没有给出回调,像 jQuery.noop 这样的东西可以执行。”但是,我想知道这样做有什么好处?是否纯粹是为了区分代码位做某事和不做某事?
  • 它基本上是一个已经制作好的空函数。与其“实例化”你自己的,不如使用一个已经准备好使用的! :D 您引用的文本描述了如何以更复杂的方式使用它,例如如果您必须绝对不问问题调用一个函数,但您不确定是否你将有一个实际的函数要调用,你可以回退到调用$.noop()。
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2014-02-21
  • 2019-12-29
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多