2010-10-13 13 views
1

J'ai la fonction javascript suivante dans mon extension:Une idée de pourquoi la position X, Y de cet élément est 0,0?

function findPos(obj) { 

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

Et mon exemple simplifié html est la suivante:

<span id="a"></span> 
<span id="b"></span> 
<span id="c"></span> 
<span id="d"></span> 

Pour chaque balise span j'ajouter un élément enfant

<div id="a2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div> 
<div id="b2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div> 
<div id="c2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div> 
<div id="d2" style="display: block; position: absolute; height: 50px; width: 50px; border: 1px solid #abcdef; z-index: 9999998;"></div> 

Maintenant, lorsque la page est statique (c'est-à-dire, si je modifie manuellement le code HTML pour avoir les enfants div), findPos renvoie le curleft droit & curtop pour les deux document.getElementById ('a') & a2, cependant si je crée le div dynamiquement à partir de l'extension et l'ajouter à l'étendue, findPos renvoie 0,0 sur le nouvel élément.

Des idées pourquoi?

ajouter les divs et exécuter le code findPos du contexte d'une barre latérale Firefox comme ceci:

var mydiv = document.createElement('div'); 
mydiv.setAttribute('style', 

« display: block; position: absolute; hauteur: 50 px; largeur: 50px; border: 1px solide #abcdef z-index: 9999998; '); Mydiv.id = 'a2' var myspan = gBrowser.contentDocument.getElementById myspan.appendChild (mydiv);

où gBrowser est défini comme:

// For accessing browser window from sidebar code. 
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIWebNavigation) 
        .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
        .rootTreeItem 
        .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIDOMWindow); 
var gBrowser = mainWindow.gBrowser; 

J'ai essayé d'ajouter le code de findPos à la page elle-même, mais même chose.

+1

Etes-vous sûr de ne pas avoir d'éléments avec des ID en double? Erreur commune (bien que je ne comprends pas pourquoi c'est si commun, personne ne sait ce qu'est un ID?!). –

+0

Positif. Dans le cas d'ID en double, Firefox renvoie toujours le premier (au moins d'après ce que j'ai vu dans 3.5-4.0b7) – Ivan

+0

Non lié à votre problème, mais j'utilisais presque ce même extrait de code (qui peut être raccourci par quelques lignes: http://www.quirksmode.org/js/findpos.html) et j'ai remarqué que curtop est une variable GLOBAL. puisque ce n'est pas déclaré avec 'var'. Peu susceptible de causer un problème, mais il devrait déclencher un avertissement dans Firefox au moins. (Dans mon cas cela a causé un problème parce que j'ai utilisé 'top' au lieu de' curtop', qui est DÉJÀ une variable globale – MatrixFrog

Répondre

0

Je trouve la question quand je rédigeais des détails supplémentaires, nous espérons que cela aide quelqu'un quand ils essaient de comprendre pourquoi un élément a 0, 0 coordonnées lorsqu'il est ajouté au dom à partir d'une extension firefox (dans une barre latérale ou une barre d'outils).

Le problème se trouve dans cette ligne anodine de code:

var mydiv = document.createElement('div'); 

Nous créons mydiv dans le document du navigateur Chrome. Nous pouvons l'ajouter à l'élément dans le gBrowser, et il apparaît visuellement, cependant nous trouvons que nous nous donnons 0,0.

Toutefois, si nous changeons à:

var mydiv = gBrowser.contentDocument.createElement('div'); 

Nous obtenons les bonnes valeurs pour findpos.

+0

Si quelqu'un pouvait pointer vers un document où quelque chose de cette nature est déclaré, je serais très reconnaissant, afin d'empêcher les JOURS de passer au dépannage tous les problèmes secondaires qui ont découlé de ce bug. – Ivan

+0

Oups, je l'ai deviné dans mon autre commentaire, mais 2 jours trop tard! Content que vous ayez trouvé la solution. Je n'ai rien trouvé de documenté sur le problème non plus. –

+0

Merci Amitay Dobo pour votre persistance à essayer de m'aider à résoudre ce problème, si vous ne m'aviez pas demandé plus d'informations, je serais toujours me gratter la tête. – Ivan

0

Juste une supposition ici, mais element.getOffsetParent retournera null (ainsi que getOffsetLeft/Right retournant 0 je pense) si le style d'affichage de l'élément est défini sur "none".

Vous pouvez vérifier le style calculé en utilisant:

document.defaultView.getComputedStyle(document.getElementById("a"), "").display 
+0

Cela peut être vrai, mais tous les éléments que j'essaie de trouver affichent: block; En utilisant votre extrait de code, le confirmez – Ivan

+0

Mauvais devinez alors :) Peut-être pourriez-vous poster un code pour reproduire le problème: comment les éléments sont-ils? ajouté dynamiquement, quand la routine findPos() est appelée. –

+0

J'ai mis à jour la question pour donner plus d'informations. – Ivan