javascript - 当所有代码都在一个脚本标记中时,为什么该脚本不会执行?

标签 javascript canvas mouseevent

我正在尝试制作最初在 Objective C 中创建的按钮的 JavaScript 版本。该方法涉及创建两个函数。第一个在 Canvas 上绘制五个圆圈并保存它们的中心坐标。第二个将圆坐标与每次鼠标单击的坐标进行比较,并使用毕达哥拉斯定理来检测事件是否发生在五个圆之一内。

<小时/>

编辑

之前阅读的段落

问题是,如果每个函数都放在单独的脚本中,则由绘图函数生成的圆是可见的。但不知何故,如果我将两个函数放在同一个脚本中(即通过注释掉 jsfiddle 中的第 52-53 行),它们就会从 Canvas 上完全消失。 当我引入第二个函数时出现问题,但我不明白为什么。

感谢Bashu's answer两个语法问题现已成功解决。原来的问题已被更改以反射(reflect)这一点。 jsfiddle 中的代码显示两个函数在同一个脚本中一起运行,其中 function(e) 显示一个 clickRing,其中鼠标单击 Canvas 并正确识别每个按钮。该代码示例现在包含一些缺失的鼠标初始化,这些初始化已阻止鼠标单击成功绘制 clickRing

<小时/>

这是第二个函数。

<script>

const mouse            = document.getElementById('canvas');
var ctx2               = mouse.getContext('2d');
var x2;                                                  // click x 
var y2;                                                  // click y

var clickRing          = function(e){
    x2                 = e.offsetX - hCentre;
    y2                 = e.offsetY - vCentre;
    var clickRadius    = buttonRadius * 0.85;       // clear button boundary
// show all Mouse hits including misses and near misses
  ctx2.beginPath();    
  ctx2.arc(x2, y2, clickRadius * 0.85, 0, Math.PI*2);
  ctx2.strokeStyle     = "black";
  ctx2.stroke();
        for (i = 0; i < numberOfButtons; i++) {
        x1             = xButtonCoords[i];
        y1             = yButtonCoords[i];
    //                          ctx1 ctx2
        var xSquared   = Math.pow((x1 - x2),2);
        var ySquared   = Math.pow((y1 - y2),2);
    // find distance from button centre coordinates to clickpoint
        var hypotenuse = Math.sqrt(xSquared + ySquared);
        var distance   = parseFloat(hypotenuse).toFixed(0);
        if (distance < (buttonRadius - clickRadius)) {  
            alert("button : "+(i+1)+"\n"+ 
                  "distance from centre to Mouse : "+distance);
            }
        }
    }
        document.addEventListener('mousedown', clickRing);
</script>

这是 jsfiddle 中的完整代码.

我是 Javascript 新手,正在搜索 here , here , herehere试图了解更多关于 DOM 的知识,但到目前为止,没有任何线索告诉我下一步该尝试什么。我欢迎提出建议。提前致谢。

最佳答案

问题出在传递给 mousedown 事件监听器的回调中。

document.addEventListener('mousedown', function(e));

首先,这是不正确的语法 - 您声明的函数没有要执行的代码块。 function(e){} 是函数声明,function(e) 不是。如果我在开发者控制台打开的情况下运行 Jsfiddle,我们确实可以看到抛出语法错误:

未捕获的语法错误:意外的标记“)”

这解释了为什么当您将脚本的前半部分与后半部分放在一起时,脚本的前半部分不会执行。

只需在运行 Js Fiddle 时打开开发者控制台,您就可以看到同样的错误,我鼓励您养成监视控制台的习惯,以了解脚本中的其他错误。

其次,您已经定义了 clickRing 函数,但实际上并未使用它。 document.addEventListener('mousedown', function(e){}) 是正确的语法,但它没有引用您定义的函数,可以使用变量 clickRing 访问该函数。所以你可以这样做

document.addEventListener('mousedown', clickRing);

至于您的其他按钮单击/悬停外观问题,它们是无关的,我鼓励您单独研究它们。不过,我怀疑您会发现 CSS 不适用于按钮,因为它们是在 Canvas 中绘制的,并且不是 DOM 的一部分。

否则,谢谢,这是一个写得很好的问题。

关于javascript - 当所有代码都在一个脚本标记中时,为什么该脚本不会执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60213960/

相关文章:

javascript - 如何使用 JavaScript 对包含数据的日期数组进行排序?

javascript - 获取数据后异步响应渲染组件

iphone - 将此 Flash 应用程序转换为 iPhone 兼容的最佳方法?

javascript - RxJS:锁定水平或垂直鼠标拖动

c# - Unity 编辑器脚本 - 使用 MouseOver 获取游戏对象

javascript - 使用 AsyncStorage 实例化持久应用程序状态

javascript - 文本字段中的 css,因此文本作为一个词被删除

python - 使用 Tkinter 实现滚动条时 Canvas 大小的问题

c# - WPF: Canvas 中的中心文本 block

javascript - 鼠标滚轮使用部分标签滚动到部分。如何?