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.
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?!). –
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
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