IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Activer un onglet


Sujet :

JavaScript

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut Activer un onglet
    Bonjour,

    Mon problème concerne le pestiféré Internet Explorer (version 8 qui plus est). Tout code spécifique à cette version est accepté.

    Dans le cadre d'une application internet, nous avons un site web qui aime bien ouvrir une popup par fonction.
    Nous avons forcé IE à ouvrir les popup dans des onglets, histoire que ce soit moins le bordel.

    En raison de problèmes de contextes et de lisibilité, on m'a demandé de "fusionner" deux onglets. C'est à dire que lorsqu'on lance la fonction A ou la fonction B, on arrive dans le même onglet.

    Pas de souci, ça se fait en indiquant le même nom à window.open

    Seulement, si un onglet du même nom existe déjà, au lieu de prendre le focus comme lors de la création d'un nouvel onglet, il se contente de clignoter bêtement.

    Pire, vu que les utilisateurs aiment bien avoir plusieurs fenêtres en plus des onglets, il suffit que l'onglet soit dans une autre fenêtre que la fenêtre active, et l'utilisateur passe 10 minutes à cliquer sur son lien, puis à appeler l'équipe système, avant qu'on lui explique gentilement de faire alt+tab...

    Bref, pas très ergonomique.

    Comment faire, si window.open se contente de remplacer le contenu d'un onglet actif, pour que ce dernier prenne le focus ?

    J'ai essayé sans succès :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var handle = window.open("http://www.google.com", "test");
    handle.focus();

    Ainsi que l'option "alwaysRaised", sans plus de succès...

    Le code pour être exact :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    function openFullscreenfocus(page, target)
    {
    	if (target)
    	{
    		dest = target;
    	}
    	else
    	{
    		dest = '_blank';
    	}
     
    	var options = 'location=no, toolbar=no, directories=no, status=yes, menubar=no, scrollbars=yes, resizable=yes, alwaysRaised=yes';
    	var t = window.open(encodeURI(page), dest, options);
    	t.moveTo(0, 0);
    	t.resizeTo(screen.availWidth, screen.availHeight);
    	t.focus();
    }

    Et je l'appelle de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    openFullscreenfocus("?sourceview=I_PER" + typtie + "_E_F&cinematic=forward(0)&chp:Sigtie=" + sigtie + "&chp:Nomtie="+nomtie+"&chp:Typtie=" + typtie + "&entity=" + entity, "Tiers");
    PS : Pas taper pour le code hein... Il s'agit de faire des adaptations dans un ERP, c'est pas moi qui ai écrit le bousin, et je risque pas de me coltiner les 400 Mo de code pour tout passer en CSS3 :o

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Vu qu'à la création de l'onglet, j'ai bien le focus, une autre alternative, ce serait de parcourir la liste des onglets ouverts, et de fermer celui qui a le même nom, s'il existe...

    Mais je fais comment pour parcourir les onglets ouverts ?

    Autant je peux conserver un handle dans l'onglet ouvrant, autant... si l'onglet à été ouvert à partir d'une autre page, j'ai pas le handle...

  3. #3
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    non
    tu ne peux pas fermer les onglet ouverts.

    par contre si tu as déjà ouvert l'onglet tu dois avoir une référence dessus et donc tu peux le fermer
    la première fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var handle = window.open("http://www.google.com", "test");
    if (handle) {//obligatoire la fenêtre n'a peut être pas été créé (popup interdit par le navigateur par exemple)
       ...
    }
    plus tard dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (handle) {
       handle.close();
    }handle = window.open("http://www.google.com", "test");
    if (handle) {//obligatoire la fenêtre n'a peut être pas été créé (popup interdit par le navigateur par exemple)
       ...
    }
    A+JYT

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Le souci, comme je disais, c'est que la popup (enfin, l'onglet) a pu être ouvert par une autre page, fermée depuis.

    Donc je n'ai pas de copie locale du handle sur l'onglet pour pouvoir le fermer : il faudrait déjà que je puisse le rechercher avec un code du genre :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (w in window.list)
    {
      if (w.name == "test")
      {
         w.close();
         break;
      }
    }

  5. #5
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    tu peux récupérer le handler sur la fenêtre avant de la fermer

    exemple
    page 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var handle = window.open("http://www.google.com", "test");
    if (handle) {//obligatoire la fenêtre n'a peut être pas été créé (popup interdit par le navigateur par exemple)
       ...
    }
    changement de page
    page 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var handle = window.open("about:blank", "test");
    if (handle) {// on vérifie qu'on a bien récupéré le handler pour fermer la fenêtre
       //si c'est le cas on peux la fermer.
       handle.close();
    }
    handle = window.open("http://www.google.com", "test");
    if (handle) {//obligatoire la fenêtre n'a peut être pas été créé (popup interdit par le navigateur par exemple)
       ...
    }
    A+JYT

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Non, c'est pas ça.

    J'ai une page d'accueil qui permet d'ouvrir le portail des achats, de vente, des tiers, etc.

    Chaque "portail" s'ouvre dans un onglet.

    Donc si j'ouvre, depuis la page d'accueil le portail des achats, il s'ouvre dans un onglet.
    Si j'ouvre, depuis la page d'accueil le portail des ventes, il s'ouvre dans un nouvel onglet.

    Maintenant, j'ouvre, depuis le portail des achat, une commande d'achat => Encore un nouvel onglet.
    Je ferme la page d'accueil et le portail des achats.

    Il me reste donc :
    - l'onglet du portail des ventes, qui ne peut posséder aucun handle vers personne puisqu'il n'a rien ouvert. Il est orphelin.
    - l'onglet de la commande d'achat, qui ne possède non plus aucun handle et est aussi orphelin.

    Maintenant, j'ouvre une commande de vente, depuis le portail de vente.
    Je veux que cette commande de vente s'ouvre à la place de la commande d'achat qui est déjà ouverte.

    Donc, en collant en target le nom "commande" par exemple, j'ai aucun souci, ça remplace bien mon onglet.
    Sauf qu'il ne récupère pas le focus.

    Donc soit :
    - je trouve un moyen de lui donner le focus (y compris avec du code spécifique IE 8, même déprécié)
    - je trouve un moyen de fermer mon onglet "commande", juste en connaissant son nom, sans aucun handle à disposition, toujours y compris avec du code spécifique IE 8 si nécessaire

    Mais je n'ai AUCUN moyen de me trimbaler les handles d'une fenêtre à l'autre : cela nécessiterait des traitements particulièrement complexes pour maintenir à jour la liste sur chaque onglet, et je ne peux pas me permettre d'adapter des centaines de Mo de code JS/HTML d'autant qu'une grande partie est standard (tel que livré par l'éditeur), et que je ne dois donc pas le modifier.

  7. #7
    Expert éminent
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Points : 9 127
    Points
    9 127
    Par défaut
    tu n'as pas compris mon deuxième script

    dans n'importe quelle page si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var handle = window.open("about:blank", "test");
    tu récupère un handle sur l'onglet 'test" si cet onglet à été ouvert par une autre page disparu ou encore vivante ne change rien à la donne tu récupère un handler sur l'onglet. si l'onglet n'existait pas il est créé.

    donc à moins que le navigateur interdise les fenêtres filles et onglet fils tu vas récupérer un handler dessus.

    vu que tu as un handler tu peux fermer l'onglet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (handle) {// on vérifie qu'on a bien récupéré le handler pour fermer la fenêtre
       //si c'est le cas on peux la fermer.
       handle.close();
    }
    maintenant que tu à fermé l'onglet tu peux le recréer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    handle = window.open("http://www.google.com", "test");
    if (handle) {//obligatoire la fenêtre n'a peut être pas été créé (popup interdit par le navigateur par exemple)
       ...
    }
    A+JYT

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 166
    Points : 7 418
    Points
    7 418
    Billets dans le blog
    1
    Par défaut
    Oups.

    Désolé pour le délai, j'étais passé à autre chose et j'avais pas vu la réponse.

    La solution est on ne peut plus crade, mais elle me plaît bien

    -- Edit : Et elle marche Bon, ça fait clignoter un peu, mais tant pis...

    Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Activer un onglet dans une page internet en VBA Access
    Par mmmxtina dans le forum VBA Access
    Réponses: 0
    Dernier message: 25/05/2009, 16h39
  2. activer l'onglet d'un tabcontrol
    Par skunkies dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/01/2009, 14h02
  3. Activer un onglet déjà ouvert
    Par edouardj dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2008, 17h45
  4. Activer un onglet
    Par kingtang dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/09/2007, 16h12
  5. activer 1 onglet
    Par bib34690 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/05/2007, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo