getSelection === null au lieu de rangeCount === 0

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
hibou57
Gecko
Messages : 52
Inscription : 13 juin 2005, 16:55

getSelection === null au lieu de rangeCount === 0

Message par hibou57 »

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)
hibou57
Gecko
Messages : 52
Inscription : 13 juin 2005, 16:55

Message par hibou57 »

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 :

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 ê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

Code : Tout sélectionner

if (w) { }
else { w = window; }
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)
Dernière modification par hibou57 le 06 nov. 2007, 18:25, modifié 1 fois.
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

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.
juste une remarque, une variable globale dans le cadre d'un window est un membre de ce window, c'est la même chose.

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 ?
hibou57
Gecko
Messages : 52
Inscription : 13 juin 2005, 16:55

Message par hibou57 »

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.
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).

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.
martin 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.
Voilà : http://developer.mozilla.org/en/docs/DO ... rangeCount :)

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 ?
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.

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)
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

hibou57 a écrit :
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.
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).
Ok, parfait, on dit bien la même chose :mrgreen: .


hibou57 a écrit :
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 ?
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.

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.
Oulà, non, je proposais çà au cas où le bug était bloquant ;) . Si çà fonctionne maintenant, hé bé çà fonctionne :) .
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 5 invités