2008-09-26 6 views
7

Est-il possible de dire si l'utilisateur d'un site Web utilise plusieurs moniteurs? J'ai besoin de trouver la position d'un popup, mais il est très probable que l'utilisateur aura une configuration de plusieurs moniteurs. Alors que window.screenX etc donnera la position de la fenêtre du navigateur, il est inutile pour plusieurs moniteurs.Test de plusieurs écrans avec javascript

+2

Popups sucent. Mais si vous devez absolument * les * utiliser, placez-les par rapport à leur fenêtre parente - N'utilisez PAS de coordonnées absolues. – Shog9

+0

@ Shog9 Salut, pourriez-vous s'il vous plaît clarifier pourquoi ne devrions-nous pas utiliser des coordonnées absolues lors de l'ouverture de nouvelles popups? Ce sera très utile pour moi. – Vadim

+0

C'est probablement un sujet approprié pour une question complètement distincte, @Vadim - mais la réponse courte est qu'il y a une chance raisonnable que vous allez positionner le popup quelque part qui ne me convient pas. J'ai souvent une fenêtre de navigateur ouverte dans la moitié droite de mon moniteur secondaire qui est plus grande que mon moniteur principal et positionnée à sa droite; Si vous n'en tenez pas compte, il y a de fortes chances que vous mettiez votre popup sur une autre application ou même hors écran. – Shog9

Répondre

0

Je ne crois pas que ce soit possible maintenant; cependant js devient plus populaire pour l'utilisation de bureau dans les widgets en plus du développement web et ce serait une excellente fonctionnalité à demander pour une future version

+0

Je me demande si c'est quelque chose qu'un projet comme Gears pourrait mettre en œuvre? – slashnick

+0

Gears consiste à stocker des données. – Till

0

J'ai trouvé cela comme une solution que quelqu'un a utilisé ... Je ne vois pas pourquoi vous ne pouviez pas lui faire confiance.

[si la largeur est supérieure à (hauteur/3) * 4> (screen.width) ALORS]

[L'utilisateur a double écran]

[End If]

+2

Euh ... J'empile mes écrans. Hauteur> Largeur. Aucun des deux écrans n'a la même largeur, donc si vous étreignez la largeur maximale, vous finirez hors de l'écran au-delà d'une certaine hauteur. Sans parler de deux-dessus, un en dessous des configurations. – Shog9

+0

De plus, beaucoup de moniteurs ont des rapports d'aspect plus larges que 4: 3 – Neall

+0

Certaines machines (la mienne) sont configurées comme deux postes de travail séparés, de sorte que la hauteur et la largeur ne sont renvoyées que sur l'écran du navigateur. – slashnick

0

Vous pouvez Ne fais pas ça. Vous pouvez cependant positionner la fenêtre centrée sur la fenêtre parent. Je pense que c'est une meilleure idée de montrer un "div" comme un dialogue au milieu de votre site Web, parce que la chance que ceci soit bloqué par popup est plus petite et c'est OMI moins ennuyeux.

0

Qu'en est-il de la taille de l'écran? Les écrans multiples ont généralement une grande taille. Il suffit de vérifier les tailles et de décider s'il est raisonnable d'être sur un ou plusieurs écrans.

0

Vous pouvez faire une conjecture bien éduquée avec JavaScript screen.width (.availWidth) et screen.height (.availHeight). Mon idée était de supposer (!) Que les moniteurs suivent généralement un certain ratio, alors que la largeur. [Avail] devrait être en dehors de celle-ci parce que l'écran est dupliqué seulement en termes de largeur, mais pas de hauteur.

En écrivant cette réponse, cela ressemble à un hack sévère. Rien sur quoi je comptais vraiment.

+3

Cela ne fonctionnera pas. 'availwith' et' availHeight' vous indiquent en fonction du moniteur actuel. Si la fenêtre du navigateur est sur le second moniteur, elle peut être déduite de 'availTop' et' availLeft', mais si la fenêtre du navigateur est sur le moniteur principal, alors ces propriétés ne pourront pas vous dire qu'un second moniteur existe réellement. –

1

Ceci est une solution trop compliquée. Je recommande fortement de refactoriser ceci - il n'a pas été utilisé sur un site de production, seulement comme une preuve de concept rapide pour moi-même.

À droite, mise en garde.

J'ai d'abord supposé que l'utilisateur pourrait ne pas avoir une configuration à double moniteur, mais ils pourraient avoir un très grand moniteur et donc la même fonctionnalité pourrait être appliquée de toute façon.

var newWindow, 
    screenSpaceLeft = window.screenX, 
    screenSpaceTop = window.screenY, 
    screenSpaceRight = screen.availWidth - (window.screenX + window.outerWidth), 
    screenSpaceBottom = screen.availHeight - (window.screenY + window.outerHeight), 
    minScreenSpaceSide = 800, 
    minScreenSpaceTop = 600, 
    screenMargin = 8, 

    width = (screen.availWidth/2.05), 
    height = screen.availHeight, 
    posX = (screen.availWidth/2), 
    posY = 0; 

e.preventDefault(); 

if (screenSpaceRight > screenSpaceLeft && screenSpaceRight > screenSpaceTop && screenSpaceRight > screenSpaceBottom && screenSpaceRight > minScreenSpaceSide) { 
    if (width > screenSpaceRight) { 
     width = screenSpaceRight - screenMargin; 
    } 
    if (posX < (screen.availWidth - screenSpaceRight)) { 
     posX = window.screenX + window.outerWidth + screenMargin; 
    } 
} else if (screenSpaceLeft > screenSpaceRight && screenSpaceLeft > screenSpaceTop && screenSpaceLeft > screenSpaceBottom && screenSpaceLeft > minScreenSpaceSide) { 
    if (width > screenSpaceLeft) { 
     width = screenSpaceLeft - screenMargin; 
    } 

    posX = 0; 
} else if (screenSpaceTop > screenSpaceRight && screenSpaceTop > screenSpaceLeft && screenSpaceTop > screenSpaceBottom && screenSpaceTop > minScreenSpaceTop) { 
    posX = 0; 
    posY = 0; 
    width = screen.availWidth; 
    height = (screen.availHeight/2.05); 
    if (height > screenSpaceTop) { 
     height = screenSpaceTop - screenMargin; 
    } 
} else if (screenSpaceBottom > screenSpaceRight && screenSpaceBottom > screenSpaceLeft && screenSpaceBottom > screenSpaceTop && screenSpaceBottom > minScreenSpaceTop) { 
    posX = 0; 
    width = screen.availWidth; 
    if (window.screenY + window.outerHeight + screenMargin > (screen.availHeight/2)) { 
     posY = window.screenY + window.outerHeight + screenMargin; 
    } else { 
     posY = (screen.availHeight/2); 
    } 
    height = (screen.availHeight/2.05); 
    if (height > screenSpaceBottom) { 
     height = screenSpaceBottom - screenMargin; 
    } 
} 

newWindow = window.open(this.href, "_blank", "width=" + width + ",height=" + height + ",location=yes,menubar=no,resizable=yes,scrollbars=yes,status=yes,menubar=yes,top=" + posY + ",left=" + posX); 

Il vérifie la quantité d'espace disponible à l'écran il y a, et si un montant minimum si elle est disponible (800 x 600), il ouvre la fenêtre là. S'il n'y a pas assez d'espace, il recouvre la fenêtre sur le côté droit de l'écran, en prenant à peu près la moitié de celui-ci.

Notes:

D'abord, il devrait être modifié pour savoir où le montant maximum de l'espace est plutôt que Recherche de gauche arbitrairement, à droite, en haut, en bas. Deuxièmement, je soupçonne que dans certains endroits où screen.availHeight a été utilisé, screen.height devrait être utilisé à la place. De même pour la largeur. C'est parce que nous ne sommes pas trop intéressés par la barre des tâches lorsque nous décidons si l'utilisateur a un second moniteur ou pas (ou beaucoup d'espace sur l'écran).

Troisièmement, cela ne fonctionnera pas dans IE < 8. Cela peut facilement être rectifié en utilisant screenLeft et screenTop plutôt que screenX/screenY, le cas échéant. Quatrièmement, le code est désordonné et pourrait être rendu beaucoup plus élégant que ce qu'il fait. Je ne m'en excuse pas. Cependant, vous ne devez PAS utiliser un JS aussi horrible et inaccessible nulle part et BESOINS pour être réécrit. Je l'ai seulement placé ici parce que c'est dans ma ligne de pensée en ce moment et j'oublierai probablement de poster une bonne solution ici quand j'écrirai ceci correctement car cela n'arrivera pas pendant quelques mois.

Droite. Voilà. Je n'accepte aucune responsabilité pour rendre votre javascript horrible, laid et carrément difficile de faire quoi que ce soit avec. :)