【问题标题】:Safari doesn't set the JavaScript variable properlySafari 没有正确设置 JavaScript 变量
【发布时间】:2021-12-22 09:56:50
【问题描述】:

我使用的是 Safari 12.0.3。我有:

function doThisOnlyOnce() {
  if (MyNamespace.firstUserGesture) {
    console.log('Do stuff only once!')
  }
  MyNamespace.firstUserGesture = false
}

function init() {
  window.MyNamespace = {} // Easy access to some vars.
  MyNamespace.firstUserGesture = true

  MyNamespace.vid = document.getElementById("vid")
  MyNamespace.vid.addEventListener('click', doThisOnlyOnce)
}
<body onload="init()">
  <div id="vid">x</div>
</body>

问题

在 Safari 上,doThisOnlyOnce() 在每次点击时运行。 MyNamespace.firstUserGesture 根本没有设置为 false

在任何其他浏览器上,doThisOnlyOnce() 仅在第一次点击时运行,正如预期的那样。

我错过了什么?

【问题讨论】:

  • Mac OS Safari 还是 iOS Safari? (或两者兼而有之?)
  • @T.J.Crowder 抱歉,我删除了 mobile-safari 标签。我现在只能确认桌面 Safari :)
  • @T.J.Crowder 这很奇怪。但是在这篇 StackOverflow 帖子中,当我使用相同的 Safari 12 浏览器运行代码 sn-p 时,该函数只运行一次!我很困惑:(
  • @user3405291 很明显,您的本地代码在某些方面与您在 SO 上发布的代码不同
  • Safari 似乎不太可能以如此根本的方式被破坏,这表明还有更多的事情发生。例如,如果您有无效的 HTML 标记(将 p 元素放入 span 元素中,诸如此类),不同浏览器在构建 DOM 时“修复”它的方式在浏览器供应商之间并不总是 100% 一致。我怀疑这就是这里发生的事情。在 Safari 上,我建议右键单击 vid 元素并选择“检查”(或在 Safari 上调用的任何内容)来查看 实际 DOM(不是查看源代码)。听起来点击正在重新加载页面。

标签: javascript html safari


【解决方案1】:

使用 Safari JS 调试器逐行检查代码表明 doThisOnlyOnce 函数的语句之一正在引发异常。去除异常原因,也去除了这种奇怪的行为。

【讨论】:

  • 由于某种原因,其他浏览器不会抛出该异常。
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 2014-03-24
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多