【问题标题】:getting the X/Y coordinates of a mouse click on an image with jQuery [duplicate]使用 jQuery 获取鼠标单击图像的 X/Y 坐标 [重复]
【发布时间】:2011-01-10 16:05:32
【问题描述】:

我想使用 jQuery 来获取图像上单击事件的 X/Y 坐标。坐标应该是相对于图像的,而不是相对于整个页面的

【问题讨论】:

标签: jquery


【解决方案1】:

您可以使用pageX and pageY 来获取鼠标在窗口中的位置。你也可以使用jQuery的offset来获取元素的位置。

所以,应该是pageX - offset.left 表示离图像左侧多远,pageY - offset.top 表示离图像顶部多远。

这是一个例子:

$(document).ready(function() {
  $('img').click(function(e) {
    var offset = $(this).offset();
    alert(e.pageX - offset.left);
    alert(e.pageY - offset.top);
  });
});

我做了一个live example herehere 是来源。

要计算距底部或右侧的距离,您必须使用 jQuery 的 widthheight 方法。

【讨论】:

  • @Brian :非常感谢您的解决方案!!!当网页放大/缩小时,这解决了我的问题。
  • 当你滚动页面时仍然无法正常工作,它会吐出不同的结果
  • 这正是我要找的东西,但我花了一段时间才把我要找的东西用文字表达出来。
  • 正如@beerwin 提到的,这在滚动页面时不起作用。如果您需要基于页面而不是可视窗口的坐标,请改用e.pageXe.pageY
  • 没错!在大多数情况下,e.pageX 和 e.pageY 就是您想要的。
【解决方案2】:

注意! e.clientX & e.clientYe.pageXe.pageY 之间有区别

尝试它们并确保您使用的是正确的。 clientXclientY 根据滚动位置变化

【讨论】:

    【解决方案3】:

    这是一个更好的脚本:

    $('#mainimage').click(function(e)
    {   
        var offset_t = $(this).offset().top - $(window).scrollTop();
        var offset_l = $(this).offset().left - $(window).scrollLeft();
    
        var left = Math.round( (e.clientX - offset_l) );
        var top = Math.round( (e.clientY - offset_t) );
    
        alert("Left: " + left + " Top: " + top);
    
    });
    

    【讨论】:

    • 肯定比选的那个好。
    • 简单有效。谢谢!
    • 为什么这样更好?有人对此有建设性的推理吗?
    【解决方案4】:

    即使任何图像使窗口滚动,以下代码也始终有效。

    $(function() {
        $("#demo-box").click(function(e) {
    
          var offset = $(this).offset();
          var relativeX = (e.pageX - offset.left);
          var relativeY = (e.pageY - offset.top);
    
          alert("X: " + relativeX + "  Y: " + relativeY);
    
        });
    });
    

    参考:http://css-tricks.com/snippets/jquery/get-x-y-mouse-coordinates/

    【讨论】:

      【解决方案5】:

      查看http://jsfiddle.net/TroyAlford/ZZEk8/ 以获取以下工作示例:

      <img id='myImg' src='/my/img/link.gif' />
      
      <script type="text/javascript">
          $(document).bind('click', function () {
              // Add a click-handler to the image.
              $('#myImg').bind('click', function (ev) {
                  var $img = $(ev.target);
      
                  var offset = $img.offset();
                  var x = ev.clientX - offset.left;
                  var y = ev.clientY - offset.top;
      
                  alert('clicked at x: ' + x + ', y: ' + y);
              });
          });
      </script>
      

      请注意,上面的内容将为您提供相对于图像框的 x 和 y - 但不会正确考虑边距、边框和填充。在您的情况下,这些元素实际上并不是图像的一部分 - 但它们可能是您想要考虑的元素的一部分。

      在这种情况下,你还应该使用$div.outerWidth(true) - $div.width()$div.outerHeight(true) - $div.height()来计算margin/border/等的数量。

      您的新代码可能看起来更像:

      <img id='myImg' src='/my/img/link.gif' />
      
      <script type="text/javascript">
          $(document).bind('click', function () {
              // Add a click-handler to the image.
              $('#myImg').bind('click', function (ev) {
                  var $img = $(ev.target);
      
                  var offset = $img.offset(); // Offset from the corner of the page.
                  var xMargin = ($img.outerWidth() - $img.width()) / 2;
                  var yMargin = ($img.outerHeight() - $img.height()) / 2;
                  // Note that the above calculations assume your left margin is 
                  // equal to your right margin, top to bottom, etc. and the same 
                  // for borders.
      
                  var x = (ev.clientX + xMargin) - offset.left;
                  var y = (ev.clientY + yMargin) - offset.top;
      
                  alert('clicked at x: ' + x + ', y: ' + y);
              });
          });
      </script>
      

      【讨论】:

      • 我的解决方案也需要更新以反映 pageX 和 pageY - 刚刚注意到上述 cmets。滚动时这将无法正常工作 - 但已经有一个可接受的答案。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多