web-dev-qa-db-fra.com

Focus onglet ou fenêtre

pour une petite application, j'ouvre quelques fenêtres/onglets de mon script. Que le navigateur ouvre une fenêtre ou un onglet n’est bien sûr pas entre mes mains.

Cependant, je garde les références aux objets window nouvellement créés et je change leur contenu "à distance" depuis une autre fenêtre. Tout cela se passe sous le même document.domain donc pas de problème xss.

Le problème est que je ne peux pas focus de manière fiable ces fenêtres/onglets créés. Étant donné que j'écris une application très spécifique pour un client, je ne cible que Firefox en tant que navigateur. Une de mes options est bien sûr de faire un remoteWindow.alert('foobar'); pour amener cette fenêtre/onglet à l’avant, mais c’est plutôt moche, n’est-ce pas.

J'ai trouvé cette réponse Comment faire pour se concentrer fenêtre/onglet comme alert ()?

et il est dit ici que Firefox a une option pour autoriser le focus des scripts. Donc finalement ma question est, quelle est cette option? J'ai cherché le about:config pour "onglets" et "focus" mais je n'ai rien trouvé de pertinent.

Comment configurer?

17
jAndy

La seule solution que je vois est de forcer le popup dans une nouvelle fenêtre, car il ne semble pas y avoir de moyen de mettre au point un autre onglet. Cette solution nécessite également de modifier les paramètres de sécurité Javascript par défaut dans Tools > Options > Content tab, de cliquer sur le bouton Advanced en regard de la case à cocher Enable Javascript et de cocher la case du milieu pour autoriser la mise au point sur les fenêtres. 

Pour forcer l'utilisation d'une fenêtre plutôt que d'un onglet, utilisez win = window.open("http://www.google.com", "test" ,"modal=yes");, puis appelez win.focus(); chaque fois que vous le souhaitez.

EDIT: En fait oublié de mentionner le fait que c'est FF seulement.

7
zatatatata

Ce qui suit semble fonctionner dans IE8 et FF13:

<script type="text/javascript">
// Stupid script to force focus to an existing tab when the link is clicked.
// And yes, we do need to open it twice.
function openHelp(a) {
    var tab = window.open(a.href, a.target);
    tab.close();
    tab = window.open(a.href, a.target);
    return false;
}
</script>
<a href="help.html" target="help" onclick="return openHelp(this);">Help</a>
13
Alex

Avez-vous essayé window.focus () ?

2
pradeek

Il n'y a pas vraiment de moyen de le faire pour la simple raison que si les sites Web avaient cette possibilité, ils finiraient par l'utiliser pour cibler automatiquement des annonces ou autres.

Cela peut être fait, mais seulement dans Firefox SI l’utilisateur l’a activé, ce qu’il ne fera probablement pas.

2
skimberk1

Voir la documentation de Mozilla: https://developer.mozilla.org/en/Code_snippets/Tabbed_browser .

  var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator);
  var browserEnumerator = wm.getEnumerator("navigator:browser");

  // Check each browser instance

  while (browserEnumerator.hasMoreElements()) {
    var browserWin = browserEnumerator.getNext();
    var tabbrowser = browserWin.gBrowser;

    // Check each tab of this browser instance
    var numTabs = tabbrowser.browsers.length;
    for (var index = 0; index < numTabs; index++) {
      var currentBrowser = tabbrowser.getBrowserAtIndex(index);
      if (/*some logic*/) {

        // For an example
        tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];

        // Focus *this* browser-window
        browserWin.focus();
        break;
      }
    }

Voici une approche événementielle plus facile - https://developer.mozilla.org/En/Listening_to_events_on_all_tabs .

2
Kirill Dubovikov

Avez-vous essayé dans le menu Outils -> Options… -> onglet Contenu -> bouton Avancé à côté de "Activer JavaScript" pour cocher la case "Relever ou baisser les fenêtres"?

Vous trouverez un exemple sur la manière de définir le focus ici .

1
harrymc

C’est sale et moche, c’est donc seulement des informations: si vous appelez un alert () dans l’un des onglets/fenêtres ouverts, cet onglet sera mis en évidence.

1
rhinoeli

Pour répondre à votre question: J'ai trouvé http://www.gtalbot.org/FirefoxSection/Popup/PopupAndFirefox.html#RaiseLowerSetting , qui indique que le paramètre que vous recherchez est appelé "autoriser" lève et baisse les fenêtres ".

Un autre paramètre serait about:config/dom.disable_window_flip (à false), trouvé ici .

1
Bergi

Développer la contribution d'Alex ci-dessus. Le cas d'utilisation est d'avoir un CMS. Lorsqu'un propriétaire de site est connecté au CMS et que le serveur frontal est chargé dans un autre onglet. Vous fournissez au propriétaire du site un lien sur le serveur frontal qui recharge l’onglet.

Placez ce javacript sur les premières pages (ou incluez-le dans un fichier JS global):

<script type="text/javascript">
// Stupid script to force focus to an existing tab when the link is clicked.
// And yes, we do need to open it twice.
function loadAdmin(a) {
    var tab = window.open(a.href, a.target);
    tab.close();
    tab = window.open(a.href, a.target);
    return false;
}
</script>

J'aime mettre le lien CMS juste après le contenu H1. Encore une fois, cela s’applique uniquement s’ils sont connectés au CMS. Dans ce cas, je pointe vers un CMS encadré, il doit donc savoir quoi charger dans le cadre principal (jeu de mots voulu).

<h1>
    Page Heading
    <a href="/admin/main/?load=pages/page.cfm?id=#request.pageid#" title="Edit this page"
        onclick="return loadAdmin(this);"
        target="#cgi.server_name#wvAdmin"            
    ><img src="/media/admin/icon-edit.png" alt="Edit this page"/></a>
</h1>

Ceci pour s'assurer que l'onglet est unique, si plusieurs navigateurs sont présents dans mon navigateur (prend en charge plusieurs clients):

target = "# cgi.server_name # wvAdmin"

Enfin, sur le chargeur de cadres dans le CMS, ajoutez ceci ...

<script type="text/javascript">
    window.name = '#cgi.server_name#wvAdmin';
</script>

... pour garantir que si l'utilisateur a ouvert le CMS lui-même, nous pouvons toujours l'utiliser.

0
Jules

La réponse simple est: vous ne pouvez pas. Les navigateurs n'exposent pas ce type d'API à JavaScript.

0
WTK