JavaScript: 事件侦听器函数无法识别超过屏幕上特定点的事件

JavaScript: Event Listener Function Not Recognizing an Event Past Certain Point on Screen

我在 JavaScript 中内置了一个游戏,你可以将硬币从龙下面拖到金库中来得分。

参考游戏:https://codeeverydamnday.com/projects/dragondrop/dragondrop.html

只有将硬币丢在金库范围内才能获得积分。金库边界在这些绝对位置内:

保险库的左边缘:距屏幕左侧 645 像素
保险库的右边缘:距屏幕左侧 915 像素
保险库的上边缘:距屏幕上边缘 290 像素
保险库的底部边缘:距屏幕顶部边缘 540 像素

关于 运行 当你丢硬币时的功能,我有一个“如果”语句,只有当你丢的硬币有新的 x-y 坐标落在金库边界内时,你的分数才会加起来(只显示相关代码,如果需要可以提供更多):

function moveDrop(e) {
  e.preventDefault ();
  coin.style.left = e.pageX - myX + 'px';
  coin.style.top = e.pageY - myY + 'px';
    // myX and myY are the coin's original x-y coordinates. This line resets their new x-y coordinates after the drop
    if (
      coin.style.left > "645" && 
      coin.style.left < "915" && 
      coin.style.top > "290" && 
      coin.style.top < "540") {
        // Function that adds your score each time you drop a coin in the vault
    }
}

上面的函数按原样完美运行。老实说,我不确定如何,因为 coin.style.left 会有一个像 700px 这样的值,我要求它检查它是否大于 645(没有 px),但是它有效。

但是,我试图简单地将保险库向右移动 200 像素,使其新的 x 坐标范围是从屏幕左侧开始的 845 到 1115 像素(而不是 645 和 915)。

当我将库图像的绝对位置更新为 845px 时,它移动得很好。当我在上面的 if 语句中将 coin.style.left > "645" 更新为 coin.style.left > "845" 时,它工作正常。

但是,当我将 coin.style.left < "915" 更新为 coin.style.left < "1115" 时,我可以将硬币拖到金库中,但掉落侦听器没有识别出硬币已落入金库边界内并且是因此不加分。

我做了一些测试,结果证明它一直有效,直到我将左边缘 属性 更改为 coin.style.left < "999"。一旦我将其更改为 1000 或更多,它就会中断。我不确定这是否与数字 1000 本身有关,或者它现在是 4 个字符而不是 3 个字符。

movedrop 事件处理程序正在侦听对 body 元素的操作,所以我认为文档正文可能只有 1000 像素。但是,我在 css.

中将其设置为 1200px
body {
  width: 1200px;
  height: 650px;
}

我尝试使用 Chrome 开发工具检查元素,看看 1000 像素之后是否有一些隐藏边距。我什么也看不见。有右边距,但只能超过 1200px。

我在我的 index.html、style.css 和 script.js 文件中到处搜索“1000”,看看是否有任何其他设置为 1000,但什么也没有。有什么我遗漏的东西可能会阻止 运行 正确超过 1000px 的功能吗?

如果需要,我可以提供完整的代码。

我找到了问题的答案。我试图比较两个字符串值而不是两个数值。

在下面的代码中(从上面的描述中缩短为相关代码),coin.style.left 值最终可能类似于 "760px",例如。

function moveDrop(e) {
  coin.style.left = e.pageX - myX + 'px';
  if (
    coin.style.left > "645" {
      // Do some stuff
  }
}

然后,在 if 语句中,我询问“760px”是否大于“645”。因为我在值周围使用引号,所以我比较的是字符串而不是数字。我还不如问“狗”是否大于“椅子”。该函数不知道如何处理它。

我通过使用以下子字符串方法首先将 coin.style.left 值转换为后面没有“px”的数字来修复此问题:

function moveDrop(e) {
  coin.style.left = e.pageX - myX + 'px';
  var finalLeft = coin.style.left.substr(0, coin.style.left.length-2);
  if (
    finalLeft > 645 {
      // Do some stuff
  }
}

变量finalLeftcoin.style.left中取值,比如说“760px”,求出字符串的长度(本例中为5),从末尾减去2个字符就可以了只有“760”。然后if语句可以比较760是否大于645。

进行此更新后,我能够成功地将宽度增加到 1200px,没有任何问题。