getSelection === null au lieu de rangeCount === 0
getSelection === null au lieu de rangeCount === 0
Hallo ragazo/ragaza,
Il m'arrive un phénomène étrange : dans une application getSelection me renvoit parfois null, au lieu de me renvoyer une selection avec un rangeCount égale à zéro.
Ceci n'est pas conforme à ce qui est dit dans le MDC, puisqu'il y est dit que lorsqu'aucune selection n'est présente dans le document, alors selection.rangeCount renvoie zéro.
Ensuite, le fait d'obtenir un objet null pour tout objet selection rend même impossible la création d'une selection, puisqu'une selection se met en place en créant un range à l'aide createRange, puis en ajoutant ce range à l'objection renvoyé par getSelection. Cette remarque ennuyeuse semble bien confirmer qu'il s'agit d'un bug.
Je ne peux malheureusement pas reproduire les condition exact dans un extrait de code simple.... mais peut-être que quelqu'un(e) a déjà entendu parler de ce cas ?
Shoukran lik pour toute information quelconque à ce sujet
Message envoyé avec : Opera/9.23 (Windows NT 5.1; U; fr)
Il m'arrive un phénomène étrange : dans une application getSelection me renvoit parfois null, au lieu de me renvoyer une selection avec un rangeCount égale à zéro.
Ceci n'est pas conforme à ce qui est dit dans le MDC, puisqu'il y est dit que lorsqu'aucune selection n'est présente dans le document, alors selection.rangeCount renvoie zéro.
Ensuite, le fait d'obtenir un objet null pour tout objet selection rend même impossible la création d'une selection, puisqu'une selection se met en place en créant un range à l'aide createRange, puis en ajoutant ce range à l'objection renvoyé par getSelection. Cette remarque ennuyeuse semble bien confirmer qu'il s'agit d'un bug.
Je ne peux malheureusement pas reproduire les condition exact dans un extrait de code simple.... mais peut-être que quelqu'un(e) a déjà entendu parler de ce cas ?
Shoukran lik pour toute information quelconque à ce sujet
Message envoyé avec : Opera/9.23 (Windows NT 5.1; U; fr)
Une petite solution de contournement, mais un peu bancale tout de même : l'objet renvoyé par getSelection semble être un singleton (une instance unique d'un objet qui est toujours le même, même si son état change). Alors on peut stocker la référence obtenu par le dernier appel qui a fonctionné, et prendre cette référence de secours quand l'appel à getSelection renvoie nul.
Deux remarques :
Il faut que le premier appel réussisse, et le petit bug ne doit donc jamais s'exprimer lors du premier appel. Ensuite, il faudrait vraiment être certain que c'est un signleton (je n'en suis pas sûr, et c'est pour cette raison que je préfère relire getSelection chaque fois que je dois utiliser la selection).
En toute simplicité, cela peut ressembler à ça :
Pour être plus fiable, il ne faut pas oublier que les selection sont attachées à une fenêtre, et c'est pourquoi je stoque la valeur oldSelectionObject dans l'objet Window plutôt que dans une variable globale. La fonction prend un objet fenêtre en argument.
Pour en faire une fonction avec argument optionel, on peut ajouter
au début de la fonction.
Oilà,
En tous cas ça a l'air de marcher dans l'application
Message envoyé avec : Opera/9.23 (Windows NT 5.1; U; fr)
Deux remarques :
Il faut que le premier appel réussisse, et le petit bug ne doit donc jamais s'exprimer lors du premier appel. Ensuite, il faudrait vraiment être certain que c'est un signleton (je n'en suis pas sûr, et c'est pour cette raison que je préfère relire getSelection chaque fois que je dois utiliser la selection).
En toute simplicité, cela peut ressembler à ça :
Code : Tout sélectionner
function getTheSelectionObject (w)
{
var sel;
sel = w.getSelection();
if (sel !== null) {
w.oldSelectionObject = sel;
return sel;
}
else {
return w.oldSelectionObject;
}
}
Pour en faire une fonction avec argument optionel, on peut ajouter
Code : Tout sélectionner
if (w) { }
else { w = window; }
Oilà,
En tous cas ça a l'air de marcher dans l'application
Message envoyé avec : Opera/9.23 (Windows NT 5.1; U; fr)
Dernière modification par hibou57 le 06 nov. 2007, 18:25, modifié 1 fois.
juste une remarque, une variable globale dans le cadre d'un window est un membre de ce window, c'est la même chose.hibou57 a écrit : Pour être plus fiable, il ne faut pas oublier que les selection sont attachées à une fenêtre, et c'est pourquoi je stoque la valeur oldSelectionObject dans l'objet Window plutôt que dans une variable globale. La fonction prend un objet fenêtre en argument.
Sinon pour l'éventuel bug, je ne trouve pas la page de MDC en question, mais effectivement çà ne me semble pas normal que getSelection puisse renvoyer null. Je ne sais pas s'il a été implémenté comme un singleton dans Firefox, mais puisqu'il doit renvoyer la collection de ranges du document, il ne peut n'y en avoir qu'une.
Il faudrait quand même un testcase réduit pour voir si c'est un bug de Firefox ou de ton application... Ah , la chasse aux bugs

Opera a t'il les mêmes symptômes sur ce point avec ton appli ?
Pas tout à fait Martin : l'objet global dépend du contexte dans lequel on se trouve, et on peut tout à fait accéder au élément attachés à une fenêtre depuis le contexte d'une autre fenêtre. Si je suis dans la fenêtre N°1 et que j'accéde à la selection de la fenêtre N°2, alors les objet attaché à la fenêtre N°2 et le contexte global, ne sont pas les mêmes (le contexte globale ce sont là les objet attaché à la fenêtre N°1).martin a écrit : juste une remarque, une variable globale dans le cadre d'un window est un membre de ce window, c'est la même chose.
Disont que dans la plupart des cas c'est la même chose, mais il faut faire attention aux cas où ça ne l'est pas.
Voilà : http://developer.mozilla.org/en/docs/DO ... rangeCountmartin a écrit :Sinon pour l'éventuel bug, je ne trouve pas la page de MDC en question, mais effectivement çà ne me semble pas normal que getSelection puisse renvoyer null.

Oui, beh, tu m'en demande trop là LOL Pffff.... pas envie de passer du temps à réduire l'application, j'ai pas le courage lol. Pour Opera, non, je n'ai pas trouvé ce bug, ni sous Safari (pourtant Safari pour Windows est un nid à bug). Malgré tout, comme je base la portabilité sur la detection d'objet, le code applique ce correctif à tous les navigateurs qui connaissent getSelection..... sans que cela ne pose de problème.martin a écrit :Il faudrait quand même un testcase réduit pour voir si c'est un bug de Firefox ou de ton application... Ah , la chasse aux bugs.
Opera a t'il les mêmes symptômes sur ce point avec ton appli ?
Si par hasard je trouve une idée pour isoler le bug je repasse pour en parler. Pour l'instant je suis satisfait, vu que le correctif fonctionne.
Message envoyé avec : Opera/9.23 (Windows NT 5.1; U; fr)
Ok, parfait, on dit bien la même chosehibou57 a écrit :Pas tout à fait Martin : l'objet global dépend du contexte dans lequel on se trouve, et on peut tout à fait accéder au élément attachés à une fenêtre depuis le contexte d'une autre fenêtre. Si je suis dans la fenêtre N°1 et que j'accéde à la selection de la fenêtre N°2, alors les objet attaché à la fenêtre N°2 et le contexte global, ne sont pas les mêmes (le contexte globale ce sont là les objet attaché à la fenêtre N°1).martin a écrit : juste une remarque, une variable globale dans le cadre d'un window est un membre de ce window, c'est la même chose.

Oulà, non, je proposais çà au cas où le bug était bloquanthibou57 a écrit :Oui, beh, tu m'en demande trop là LOL Pffff.... pas envie de passer du temps à réduire l'application, j'ai pas le courage lol. Pour Opera, non, je n'ai pas trouvé ce bug, ni sous Safari (pourtant Safari pour Windows est un nid à bug). Malgré tout, comme je base la portabilité sur la detection d'objet, le code applique ce correctif à tous les navigateurs qui connaissent getSelection..... sans que cela ne pose de problème.martin a écrit :Il faudrait quand même un testcase réduit pour voir si c'est un bug de Firefox ou de ton application... Ah , la chasse aux bugs.
Opera a t'il les mêmes symptômes sur ce point avec ton appli ?
Si par hasard je trouve une idée pour isoler le bug je repasse pour en parler. Pour l'instant je suis satisfait, vu que le correctif fonctionne.


Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités