getting the X/Y coordinates of a mouse click on an image with jQuery [duplicate]
Asked Answered
N

5

103

I would like to use jQuery to get the X/Y coordinates of a click event on an image. The coordinates should be relative to the image, not relative to the whole page

Nabokov answered 29/1, 2010 at 0:21 Comment(1)
These 3 links provide good answers stackoverflow.com/a/4249711 stackoverflow.com/a/3236129 stackoverflow.com/a/10429969Chronological
P
178

You can use pageX and pageY to get the position of the mouse in the window. You can also use jQuery's offset to get the position of an element.

So, it should be pageX - offset.left for how far from the left of the image and pageY - offset.top for how far from the top of the image.

Here is an example:

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

I've made a live example here and here is the source.

To calculate how far from the bottom or right, you would have to use jQuery's width and height methods.

Pru answered 29/1, 2010 at 0:36 Comment(7)
@Brian : Thanks so much for your solution!!! This resolves my problem when webpage zooms in/out.Antimacassar
still doesn't work hen you scroll the page it spits different resultsGlossography
This was exactly what I was looking for, but took me a while to put into words what I was looking for.Thanksgiving
As @Glossography mentioned, this doesn't work when scrolling the page. If you need the coordinates based on the page rather than the viewable window, use e.pageX and e.pageY instead.Thanksgiving
Exactly! In most cases e.pageX and e.pageY is what you want.Flickertail
Sorry @BrianMcKenna, I don't want to get the position, I want direct click in the position of the <canvas> tag. How to do this?Sven
@vanloc did you find solution on your <canvas> click?Minister
H
26

note! there is a difference between e.clientX & e.clientY and e.pageX and e.pageY

try them both out and make sure you are using the proper one. clientX and clientY change based on scrolling position

Hipped answered 31/8, 2011 at 16:46 Comment(0)
A
20

Here is a better script:

$('#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);

});
Advent answered 26/12, 2012 at 19:10 Comment(3)
For sure better than the selected one.Aramanta
Simple and effective. Thanks!Sogdian
Why is this better? Anyone has some constructive reasoning for this?Pitchdark
M
9

The below code works always even if any image makes the window scroll.

$(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);

    });
});

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

Marquita answered 16/5, 2014 at 1:22 Comment(0)
B
4

Take a look at http://jsfiddle.net/TroyAlford/ZZEk8/ for a working example of the below:

<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>

Note that the above will get you the x and the y relative to the image's box - but will not correctly take into account margin, border and padding. These elements aren't actually part of the image, in your case - but they might be part of the element that you would want to take into account.

In this case, you should also use $div.outerWidth(true) - $div.width() and $div.outerHeight(true) - $div.height() to calculate the amount of margin / border / etc.

Your new code might look more like:

<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>
Bother answered 20/6, 2012 at 22:52 Comment(1)
My solution, also, needs to be updated to reflect pageX and pageY - just noted the above comments. This will not work correctly when scrolling - but there is already an accepted answer. :)Bother

© 2022 - 2024 — McMap. All rights reserved.