2009-03-25 6 views
9

J'essaie d'amener le focus à la fenêtre en utilisant jquery. La fenêtre est pop-up lancée par un clic sur la page parente. J'ai des appels ajax qui se passent dans la fenêtre enfant, donc les données sont mises à jour. Mon problème est que si l'utilisateur clique sur la fenêtre parent et cache l'enfant derrière, je voudrais ramener cette fenêtre enfant au premier plan s'il y a une mise à jour des données.Comment mettre l'accent sur une fenêtre dans jquery?

intérieur $ (document) .ready câbler jusqu'à ces événements:

$(window).blur(function(){ 
    WindowHasFocus =false; 
}).focus(function(){ 
    WindowHasFocus =true; 
}); 

Ensuite, si les données sont mises à jour, j'appelle cette fonction:

function FocusInput(){ 

if(!WindowHasFocus){ 
    $(window).focus(); 
} 
} 

Cela fonctionne comme prévu dans IE8, mais dans FireFox (et tous les autres navigateurs) l'événement Blur never semble se déclencher si je clique sur la fenêtre parent. Des suggestions/idées sur la façon d'y parvenir?

mise à jour:

total instant facepalm: Dans FireFox: * Outils * Options ... * onglet Contenu * bouton Avancé « Activer JavaScript » * cochez la case nommée « Élever ou Abaisser de Windows "

+0

Mettez votre réponse dans une réponse distincte afin que nous puissions la mettre en surbrillance et faire sortir la question de la liste sans réponse. –

Répondre

2

total instant facepalm: Dans FireFox:

  • Outils
  • Options ...
  • onglet Contenu
  • bouton Avancé à côté de « Activer JavaScript »
  • cocher la case intitulée « Raise ou inférieur Windows »

Ceci est désactivé par de défaut et doit être activé. Et aussi, j'ai supposé que puisque cela ne fonctionnait pas dans Chrome, ce Safari serait le même, mais vous savez ce qu'ils disent de "supposer" (cela fonctionne dans Safari, mais pas Chrome).

1

Il semble que vous ne devriez pas vous soucier de savoir quand votre fenêtre s'est estompée. Lorsque vos données sont mises à jour, votre fenêtre n'est pas mise au point, auquel cas vous souhaitez la mettre au point, ou elle est déjà mise au point, et la mise au point à nouveau ne vous nuit pas.

+0

Eh bien, le raisonnement est que la fenêtre enfant a une entrée de texte, et je ne veux pas que le focus soit retiré de ça. Mais dans tous les cas, $ (window) .focus() ne semble rien faire dans FF. –

+1

Avez-vous essayé de faire 'window.focus()' sans l'appel de jquery? – levik

2

S'il n'y a pas une bonne raison pour avoir deux fenêtres séparées, il serait préférable d'utiliser des "boîtes modales", il y a beaucoup d'exemples là-bas et des plugins jquery pour y parvenir. Un exemple d'un tel plugin: http://www.84bytes.com/2008/06/02/jquery-modal-dialog-boxes/

+0

ne peut pas utiliser un modal, ce doit être une fenêtre séparée. –

+1

Dans ce cas, essayez d'appeler l'attention de la fenêtre parent: url = 'someURL' newwin = window.open (url, "helpWin", "caractéristiques"); ... newWin.window.focus() – Miquel

+0

L'une des raisons est forte sécurité: la fenêtre parent peut être http' régulière 'et la nécessité d'ouvrir une fenêtre qui est' https'. – JohnK

1

Vous avez absolument raison. Dans FF, il semble que cela déclenche l'événement, mais en même temps, il semble que cela n'indique pas que l'élément est focalisé. Par conséquent, l'événement de flou ne peut jamais être déclenché. Je ne suis pas sûr de l'avoir expliqué correctement ... Le code suivant dit tout.

Dans cet exemple, la boîte est masquée par défaut, mais est affichée via l'écouteur d'événement de mise au point. Dans IE 8, si vous cliquez sur la fenêtre principale, il tire encore flou, mais dans FF il n'a pas:

<html> 
<head> 

</head> 
<body> 
    <div id="hiddenWin" style="width: 100px; height: 100px; background-color: Black; display: none;"></div> 

    <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script> 
    <script type="text/javascript"> 
     var something = 12; 
     something += 4; 

     $(document).ready(function()   
      { 

       $("#hiddenWin").focus(function() 
        { 
         $(this).show(); 
        } 
       ).blur(function() 
        { 
         $(this).hide(); 
        }    
       )    

       $("#hiddenWin").focus(); 
      } 
     ); 
    </script> 

</body> 
</html> 

Pour vos besoins, serait-il possible de configurer un arrière-plan de recouvrement? Quelque chose qui est une position fixe @ top: 0 et à gauche: 0 qui occupe tout l'écran et a un z-index qui est inférieur à votre popup. De cette façon, quand ils cliquent sur la superposition, il va voler le focus et ensuite vous pouvez tout cacher ...? IDK, juste une suggestion. Je vais continuer à déconner et voir si je peux comprendre. Bonne question.+1

+0

non, l'idée est de permettre à la personne de naviguer sur le site et de ne faire apparaître la fenêtre enfant qu'à l'avant lorsqu'il y a eu une mise à jour des données. –

+0

trouvée ... im un idiot: Dans FireFox: Outils * * Options ... * onglet Contenu * bouton Avancé à côté de « Activer JavaScript » * cochez la case nommée "Élever ou Abaisser Windows" –

0

Ouais la chose modale est probablement le chemin à parcourir, mais parfois il est nécessaire de le faire de la façon dont vous voulez le faire.

J'utiliser le bon vieux JavaScript. Nommez la fenêtre et mettez-la en évidence.

function showImageWindow(imageURL) 
    { 
     var imageWindow = window.open(imageURL,"My_Window","width=1000px,height=1000px,menubar=0,titlebar=0,toolbar=0,location=0,scrollbars=0,status=0"); 
     imageWindow.focus(); 
    } 
Questions connexes