【问题标题】:Scrolling messes up my canvas mouse coordinates - Javascript Telerik Mobile滚动弄乱了我的画布鼠标坐标 - Javascript Telerik Mobile
【发布时间】:2015-01-27 20:59:38
【问题描述】:

在画布上获取鼠标坐标总是有效的,除非我必须滚动然后它出错了。 y 在画布上时可能最终为负数。这是我的代码:

创建画布的代码块:

var width = (document.getElementById('assessmentSectionForm' + platform).clientWidth);
        var height = Math.round(theSection.thePicture.ySize * (width / theSection.thePicture.xSize))
        var canvas = buildCanvas(Math.round(width), height, false, true);
        //var canvas = document.getElementById('assessmentImage');
        var ctx = canvas.getContext("2d");
        _context = ctx;
        _canvas = canvas;
        canvas.addEventListener("mousedown", relMouseCoords, false);

获取坐标的函数:

function relMouseCoords(event) {
    var totalOffsetX = 0;
    var totalOffsetY = 0;
    var canvasX = 0;
    var canvasY = 0;
    var sect = _currentSection;
    var currentElement = this;

    do {
        totalOffsetX += currentElement.offsetLeft - currentElement.scrollLeft;
        totalOffsetY += currentElement.offsetTop - currentElement.scrollTop;
    } while (currentElement = currentElement.offsetParent)

    if (event.pageX || event.pageY) { 
        canvasX = event.pageX - totalOffsetX;
        canvasY = event.pageY - totalOffsetY;
    }

    //alert( 'x: ' + canvasX + '         y: ' + canvasY);
    for (var x = 0; x < _currentSection.allHotSpots.length; x++) {
        if (_currentSection.allHotSpots[x].myPicZoom === _currentPicZoomCode) {
            scaleTheHotSpot(_currentSection.allHotSpots[x], _currentSection.thePicture);
        }
    }

    for (var i = 0; i < _currentSection.allHotSpots.length; i++) {
        if (canvasX > _currentSection.allHotSpots[i].topLeft[0] &&
            canvasX < _currentSection.allHotSpots[i].bottomRight[0] &&
            canvasY > _currentSection.allHotSpots[i].topLeft[1] &&
            canvasY < _currentSection.allHotSpots[i].bottomRight[1] &&
            _currentSection.allHotSpots[i].myPicZoom === _currentPicZoomCode) {...

relMouseCoords 的其余部分无关紧要,因为鼠标坐标在我到达切断它的位置之前应该是正确的。为什么这段代码不考虑滚动?看起来应该。我从This stack overflow answer. 得到它值得一提的是,我正在构建一个 Telerik Mobile 应用程序,但是我发现大部分时间的 javascript 工作方式与在网页中的工作方式相同。如果此代码中的错误没有明显的原因,我最好在 Telerik 论坛上询问。

【问题讨论】:

    标签: javascript mobile canvas telerik coordinates


    【解决方案1】:

    您可以使用event.layerX 而不是event.pageX,它返回事件发生的元素的坐标值。这样您就不必担心偏移量以及窗口可能发生的任何其他事情。

    请注意,不建议将 pageX/Y 和 layerX/Y 都用于生产,因为目前没有人知道它们会发生什么。

    https://developer.mozilla.org/en-US/docs/Web/API/UIEvent.layerX

    var canvas = document.createElement('canvas');
    document.body.appendChild(canvas);
    canvas.addEventListener('mousedown', function(e) {
      alert("X: " + e.layerX + ' Y: ' + e.layerY);
      })
    canvas {
      border: 1px solid;
      }

    【讨论】:

    • 谢谢,我刚刚在我的问题中添加了它是我正在制作的 Telerik 移动应用程序。我认为这可能是它表现不同的原因。我尝试了您的代码,但滚动时 y 轴仍然错误。
    • 不客气。嗯,您删除了所有偏移计算并仅尝试了图层属性,对吗?我对 Telerik 一无所知,但我在一些移动应用上使用过这种方法来滚动页面。
    • 是的,将canvas.addEventListener eventListener 更改为您的上述代码。一定与 Telerik 的滚动方式有关。
    • 这太奇怪了。如果您发现他们的代码有问题,请告诉我们。
    猜你喜欢
    • 2015-06-12
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2014-08-27
    相关资源
    最近更新 更多