2009-05-06 55 views
7

Hubo un hilo sobre esto en comp.lang.javascript recientemente donde se anunció victoria, pero no fue publicada código:cómo encontrar las coordenadas de un botón o imagen HTML, ¿cruzar el navegador?

en una página HTML ¿cómo encontrar las coordenadas de la esquina inferior izquierda de la imagen (un elemento o botón , por ejemplo) de manera confiable en todos los navegadores y estilos de página? El método defendido en "Ajax en acción" (copia que tengo) no parece funcionar en IE bajo algunas circunstancias. Para facilitar el problema, supongamos que podemos establecer que el estilo del documento global sea "tradicional" o "transitorio" o lo que sea.

Proporcione un código o un puntero al código por favor (una función completa que funciona en todos los navegadores) - no solo diga "eso es fácil" y bromee sobre lo que atraviesa el DOM - si quiero leer ese tipo de todo, volveré a comp.lang.javascript. Por favor, repórtenme si esto es una repetición y apúntenme a la solución - Intenté encontrarlo.

+2

Santo (* & ^. Acabo de ver la solución jquery: agregue un elemento oculto al DOM que contenga todas las etiquetas imaginables y luego realice ingeniería inversa en las convenciones de geometría. ¡La web es un lugar verdaderamente sorprendente! –

+1

Hay dragones aquí –

Respuesta

9

En mi experiencia, la única manera segura de conseguir cosas como esta para el trabajo está utilizando JQuery (no tenga miedo , es solo un archivo de script externo que debe incluir). A continuación, puede utilizar una declaración como

$('#element').position() 

o

$('#element').offset() 

para obtener las coordenadas actuales, que funciona de manera excelente a través de cualquier y todos los navegadores que he encontrado hasta ahora.

+0

30k para eso. Bueno, al menos puedo mirar y tratar de ver cómo lo implementaron, suponiendo que puedo encontrar una fuente sin comprimir. –

+1

Acabo de echar un vistazo a la fuente de JQuery y las funciones parecen ser muy interdependientes.Demasiado para extraer solo unas pocas líneas de código (al menos para mi gusto). Normalmente odio a las personas que hacen esto, pero voy a seguir adelante y convertirme en uno ahora: JQuery te ahorrará muchas preocupaciones en general y 30k no son realmente tantos datos para algo que se almacenará en caché. solicitudes de todos modos. Tómelo de alguien que generalmente odia los frameworks ;-) – Udo

1

Prueba esto:

var elm = document.getElementById('foo'); 
var point = {x:0,y:elm.offsetHeight}; // Change to y:0 to get the top-left 

while (elm) 
{ 
    // This will get you the position relative to the absolute container, 
    // which is what you need for positioning an element within it 
    if (elm.style.position == 'absolute') 
     break; 

    point.x += elm.offsetLeft; 
    point.y += elm.offsetTop; 

    elm = elm.offsetParent; 
} 
+0

Greg, esto es lo que no funciona (a veces). –

+0

¿Puedes dar un ejemplo concreto de cuándo no funciona? – Greg

+0

Sure http://aaron.oirt.rutgers.edu/myapp/docs/W.intro. Si intento posicionar las notas al pie usando ese algoritmo en IE, aparecen en la página de la derecha. –

1

En jQuery:

var jq = $('#yourElement'); 
var position = jq.offset(); 
alert('x: ' + position.left + ', y: ' + position.top); 

var bottomLeftPixelPosition = 
    { left: position.left, top: position.top + jq.height() - 1; }; 
2

He estado usando esto, funciona tanto para IE como para Firefox.

 
var Target = document.getElementById('SomeID'); 
var Pos = findPos(Target); 

AnotherObj = document.getElementById('AnotherID'); 
AnotherObj .style.top = Pos[1] + "px"; 
AnotherObj .style.left = Pos[0] + "px"; 

//------------------------------------ 
function findPos(obj) { 
//---------------------------------------- 
    var curleft = curtop = 0; 
    if (obj.offsetParent) { 
    do { 
      curleft += obj.offsetLeft; 
      curtop += obj.offsetTop; 
    } while (obj = obj.offsetParent); 
    return [curleft,curtop]; 
    } 
} 
+0

Como se mencionó, esto no funciona de manera consistente. Puede ser que si uso html "estricto" o lo que sea que empiece a funcionar. Por favor, informe si ese es el truco. La biblioteca de jquery parece indicar que también debe tener en cuenta factores como los márgenes, que no se manejan de la forma anterior. –

4

Encontré esta solución de la web ... Esto solucionó totalmente mi problema. Por favor, consulte este enlace para el origen. http://www.quirksmode.org/js/findpos.html

/** This script finds the real position, 
* so if you resize the page and run the script again, 
* it points to the correct new position of the element. 
*/ 
function findPos(obj){ 
    var curleft = 0; 
    var curtop = 0; 

    if (obj.offsetParent) { 
     do { 
     curleft += obj.offsetLeft; 
     curtop += obj.offsetTop; 
     } while (obj = obj.offsetParent); 

     return {X:curleft,Y:curtop}; 
    } 
} 

funciona perfectamente en Firefox, Internet Explorer 8, Opera (Esperanza en otros también) Gracias a los que comparten sus conocimientos ... Saludos,

adinámicas

Cuestiones relacionadas