2009-05-06 11 views
7

Il y avait un fil à ce sujet dans comp.lang.javascript récemment où victoire a été annoncée, mais aucun code n'a été affiché:comment trouver les coordonnées d'un bouton HTML ou d'une image, navigateur croisé?

Sur une page HTML comment trouvez-vous les coordonnées de coin inférieur gauche d'un élément (l'image ou le bouton , disons) de manière fiable à travers les navigateurs et les styles de page? La méthode préconisée dans "Ajax in Action" (copie que j'ai) ne semble pas fonctionner dans IE dans certaines circonstances. Pour simplifier le problème, supposons que nous pouvons définir le style de document global comme étant «traditionnel» ou «transitoire» ou autre. S'il vous plaît fournir un code ou un pointeur au code s'il vous plaît (une fonction complète qui fonctionne sur tous les navigateurs) - ne dites pas simplement "c'est facile" et blather sur ce qui traverse le DOM - si je veux lire ce genre de chose je vais revenir à comp.lang.javascript. S'il vous plaît, grondez-moi si c'est une répétition et montrez-moi la solution - j'ai essayé de le trouver.

+2

Saint (* & ^. Je viens de regarder la solution de jquery: ajouter un élément caché au DOM contenant toutes les étiquettes concevables, puis inverser les conventions de géométrie.Le web est un endroit vraiment incroyable! –

+1

Il y a des dragons ici –

Répondre

9

Dans mon expérience, la seule façon infaillible pour obtenir des trucs comme ça au travail est l'utilisation JQuery (ne pas avoir peur , c'est juste un fichier de script externe que vous devez inclure). Ensuite, vous pouvez utiliser une instruction comme

$('#element').position() 

ou

$('#element').offset() 

pour obtenir les coordonnées actuelles, qui fonctionne très bien sur tout et tous les navigateurs que j'ai rencontrés jusqu'à présent.

+0

30k pour cela? Eh bien, au moins je peux regarder et essayer de voir comment ils l'ont implémenté - en supposant que je puisse trouver une source non compressée. –

+1

Je viens de jeter un oeil à la source JQuery et les fonctions semblent être fortement interdépendantes.Trop pour extraire juste quelques lignes de code (du moins à mon goût). Je déteste habituellement les gens qui font cela, mais je vais aller de l'avant et en devenir un maintenant: JQuery vous épargnera beaucoup de soucis à tous les niveaux et 30k n'est pas vraiment beaucoup de données pour quelque chose qui va être caché demandes de toute façon. Prenez-le de quelqu'un qui déteste généralement les cadres ;-) – Udo

1

Essayez ceci:

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, c'est ce qui ne marche pas (parfois). –

+0

Pouvez-vous donner un exemple concret de quand cela ne fonctionne pas? – Greg

+0

Bien sûr http://aaron.oirt.rutgers.edu/myapp/docs/W.intro. Si j'essaie de positionner les notes de bas de page en utilisant cet algorithme sur IE, elles apparaissent sur la page vers la droite. –

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

Je l'ai utilisé, fonctionne à la fois pour IE et 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

Comme mentionné, cela ne fonctionne pas de manière cohérente. Il se peut que si j'utilise "strict" html ou quoi que ce soit, il va commencer à travailler. S'il vous plaît informer si c'est le tour. La bibliothèque de jquery semble indiquer que vous devez également prendre en compte des choses comme les marges, qui ne sont pas traitées par ce qui précède. –

4

J'ai trouvé cette solution sur le web ... Ce problème a été entièrement résolu. Veuillez vérifier ce lien pour l'origine. 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}; 
    } 
} 

fonctionne parfaitement dans Firefox, IE8, Opera (Hope dans d'autres aussi) Merci à tous ceux qui partagent leurs connaissances ... Cordialement,

adynamiques

Questions connexes