Usando jQuery como obter coordenadas de clique no elemento de destino


109

Eu tenho o seguinte manipulador de eventos para meu elemento html

jQuery("#seek-bar").click(function(e){
    var x = e.pageX - e.target.offsetLeft;
    alert(x);    
});

Preciso encontrar a posição do mouse na barra de busca # no momento de clicar. Eu teria pensado que o código acima deveria funcionar, mas dá um resultado incorreto


4
Posição em relação ao elemento, a janela de visualização ou o documento inteiro?
James

Fiz funcionar usando e.layerX - e.target.offsetLeft e para Oprea apenas usei e.offsetX
Roman

se você deseja obtê-lo em um site responsivo. experimente este artigo, você também pode obtê-lo em sites responsivos. kvcodes.com/2014/03/…
Kvvaradha

Respostas:


235

Você está tentando obter a posição do ponteiro do mouse relativepara o elemento (ou) simplesmente a localização do ponteiro do mouse

Experimente esta demonstração: http://jsfiddle.net/AMsK9/


Editar:

1) event.pageX, event.pageYfornece o documento relativo à posição do mouse!

Ref : http://api.jquery.com/event.pageX/
http://api.jquery.com/event.pageY/

2) offset(): Dá a posição de deslocamento de um elemento

Ref : http://api.jquery.com/offset/

3) position() : Fornece a posição relativa de um elemento, ou seja,

considere que um elemento está embutido em outro elemento

exemplo :

<div id="imParent">
   <div id="imchild" />
</div>

Ref : http://api.jquery.com/position/

HTML

<body>
   <div id="A" style="left:100px;"> Default    <br /> mouse<br/>position </div>
   <div id="B" style="left:300px;"> offset()   <br /> mouse<br/>position </div>
   <div id="C" style="left:500px;"> position() <br /> mouse<br/>position </div>
</body>

JavaScript

$(document).ready(function (e) {

    $('#A').click(function (e) { //Default mouse Position 
        alert(e.pageX + ' , ' + e.pageY);
    });

    $('#B').click(function (e) { //Offset mouse Position
        var posX = $(this).offset().left,
            posY = $(this).offset().top;
        alert((e.pageX - posX) + ' , ' + (e.pageY - posY));
    });

    $('#C').click(function (e) { //Relative ( to its parent) mouse position 
        var posX = $(this).position().left,
            posY = $(this).position().top;
        alert((e.pageX - posX) + ' , ' + (e.pageY - posY));
    });
});

9
+1 para os exemplos ... uma nota embora eu também adicionaria o código aqui, se o seu link morrer, essa questão se tornará inútil no futuro, eu colocaria o código para cada um e uma breve descrição aqui :)
Nick Craver

2
Existe uma maneira mais simples de fazer o caso de '#B': e.offsetXe e.offsetY. Eu acho que você gostaria de editá-lo. Já atualizei o violino aqui . Eu encontrei essa solução graças ao post, então obrigado.
toto_tico

Obrigado, porque eu confundi pessoalmente com offset () e position (), se alguém precisar de mais esclarecimentos, pode ler stackoverflow.com/questions/3202008/… por uma questão de conveniência
simongcc

Eu tinha um elemento fixo na parte inferior - que tinha 100% de largura, então usei a largura da janela como posX - então fui capaz de determinar se um usuário estava clicando em um "X" que foi feito com uma regra: após css que estava no canto superior direito.
amurrell de

Ótimo exemplo, mas não é óbvio qual é a diferença entre .position () e .offset (). Você deve envolver o elemento #C em algum div pai com alguma posição exemplar para ver que o clique em #C retorna a posição do mouse dentro do elemento que é pai de #C, que provavelmente é o menos frequentemente útil.
amik

15
$('#something').click(function (e){
    var elm = $(this);
    var xPos = e.pageX - elm.offset().left;
    var yPos = e.pageY - elm.offset().top;

    console.log(xPos, yPos);
});

3

Experimente isto:

jQuery(document).ready(function(){
   $("#special").click(function(e){
      $('#status2').html(e.pageX +', '+ e.pageY);
   }); 
})

Aqui você pode encontrar mais informações com DEMO


1

Em porcentagem:

$('.your-class').click(function (e){
    var $this = $(this); // or use $(e.target) in some cases;
    var offset = $this.offset();
    var width = $this.width();
    var height = $this.height();
    var posX = offset.left;
    var posY = offset.top;
    var x = e.pageX-posX;
        x = parseInt(x/width*100,10);
        x = x<0?0:x;
        x = x>100?100:x;
    var y = e.pageY-posY;
        y = parseInt(y/height*100,10);
        y = y<0?0:y;
        y = y>100?100:y;
    console.log(x+'% '+y+'%');
});

1

Se MouseEvent.offsetX for compatível com seu navegador (todos os principais navegadores realmente o suportam), o objeto jQuery Event conterá essa propriedade.

A propriedade somente leitura MouseEvent.offsetX fornece o deslocamento na coordenada X do ponteiro do mouse entre esse evento e a borda de preenchimento do nó de destino.

$("#seek-bar").click(function(event) {
  var x = event.offsetX
  alert(x);    
});

0

veja aqui insira a descrição do link aqui

html

<body>
<p>This is a paragraph.</p>
<div id="myPosition">
</div>
</body>

css

#myPosition{
  background-color:red;
  height:200px;
  width:200px;
}

jquery

$(document).ready(function(){
    $("#myPosition").click(function(e){
       var elm = $(this);
       var xPos = e.pageX - elm.offset().left;
       var yPos = e.pageY - elm.offset().top;
       alert("X position: " + xPos + ", Y position: " + yPos);
    });
});
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.