Wie steuern Sie bei Verwendung von Javascript window.open () auf einem System mit mehreren Monitoren, welcher Monitor oder wo im Anzeigebereich das Popup geöffnet wird? Es scheint mir unkontrolliert und ansonsten zufällig in seinem Verhalten.
Das Ergebnis der Suche nach "window.open dual-screen" ergab dieses ausgefallene Nugget: Dual Monitors und Window.open
"Wenn der Benutzer mit window.open auf einen Link klickt, der ein neues Fenster öffnet, wird das Fenster auf demselben Monitor wie das übergeordnete Fenster angezeigt."
// Find Left Boundry of the Screen/Monitor
function FindLeftScreenBoundry()
{
// Check if the window is off the primary monitor in a positive axis
// X,Y X,Y S = Screen, W = Window
// 0,0 ---------- 1280,0 ----------
// | | | --- |
// | | | | W | |
// | S | | --- S |
// ---------- ----------
if (window.leftWindowBoundry() > window.screen.width)
{
return window.leftWindowBoundry() - (window.leftWindowBoundry() - window.screen.width);
}
// Check if the window is off the primary monitor in a negative axis
// X,Y X,Y S = Screen, W = Window
// 0,0 ---------- -1280,0 ----------
// | | | --- |
// | | | | W | |
// | S | | --- S |
// ---------- ----------
// This only works in Firefox at the moment due to a bug in Internet Explorer opening new windows into a negative axis
// However, you can move opened windows into a negative axis as a workaround
if (window.leftWindowBoundry() < 0 && window.leftWindowBoundry() > (window.screen.width * -1))
{
return (window.screen.width * -1);
}
// If neither of the above, the monitor is on the primary monitor whose's screen X should be 0
return 0;
}
window.leftScreenBoundry = FindLeftScreenBoundry;
Nachdem der Code geschrieben wurde, können Sie jetzt mit window.open ein Fenster auf dem Monitor öffnen, auf dem sich das übergeordnete Fenster befindet.
window.open(thePage, 'windowName', 'resizable=1, scrollbars=1, fullscreen=0, height=200, width=650, screenX=' + window.leftScreenBoundry() + ' , left=' + window.leftScreenBoundry() + ', toolbar=0, menubar=0, status=1');
Wenn es Ihnen erfolgreich ermöglicht, ein Popup auf demselben Bildschirm wie das Dokument zu öffnen, das es startet, sollte es mit ähnlichem Aufwand möglich sein, es so zu ändern, dass es sich anders verhält.
Beachten Sie, dass es, wie die Länge des Codes impliziert, keine eingebaute Funktion zum Verstehen mehrerer Monitore in jquery/javascript/browsers gibt, nur dass der Dual-Screen-Desktop einfach eine vergrößerte einzelne kartesische Ebene anstelle von zwei diskreten Ebenen ist.
Update
Der Link ist tot. Verwenden Sie dieser Waybackmachine-Link
window.screenX
gibt die Position des aktuellen Bildschirms an.
angenommen, die Monitorbreite beträgt 1360
für Monitor 1 window.screenX = 0;
für Monitor 2 window.screenX = 1360;
also durch Hinzufügen der linken Position mit window.screenX
, Popup in erwarteter Position geöffnet.
function openWindow() {
var width = 650;
var left = 200;
left += window.screenX;
window.open(thePage,'windowName','resizable=1,scrollbars=1,fullscreen=0,height=200,width=' + width + ' , left=' + left + ', toolbar=0, menubar=0,status=1');
return 0;
}
FUNKTION:
function PopupCenter(url, title, w, h, opts) {
var _innerOpts = '';
if(opts !== null && typeof opts === 'object' ){
for (var p in opts ) {
if (opts.hasOwnProperty(p)) {
_innerOpts += p + '=' + opts[p] + ',';
}
}
}
// Fixes dual-screen position, Most browsers, Firefox
var dualScreenLeft = window.screenLeft != undefined ? window.screenLeft : screen.left;
var dualScreenTop = window.screenTop != undefined ? window.screenTop : screen.top;
var width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width;
var height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height;
var left = ((width / 2) - (w / 2)) + dualScreenLeft;
var top = ((height / 2) - (h / 2)) + dualScreenTop;
var newWindow = window.open(url, title, _innerOpts + ' width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
// Puts focus on the newWindow
if (window.focus) {
newWindow.focus();
}
}
VERWENDUNG:
PopupCenter('http://www.google.com','google.com','900','500', {toolbar:1, resizable:1, location:1, menubar:1, status:1});
Es funktioniert auch bei minimierten Fenstern
Eine javascriptbasierte Lösung funktioniert aus Sicherheitsgründen nicht.
Ich habe eine andere Idee für Sie, warum nicht eine chrome= Erweiterung für die Positionierung verwenden. (Kein Sicherheitsproblem dort) Es ist natürlich nur für Chrom (vielleicht ist das in Ordnung für Sie).
Hintergrund: Wir hatten damit verbundene Schwierigkeiten. Interne Webanwendung, die mehrere Dokumente in Windows öffnet und auf anderen Monitoren platziert werden muss. Das Javascript unterstützt dies aus Sicherheitsgründen nicht und nur eine native Erweiterung kann ordnungsgemäß mit den Tabs/Windows-Objekten arbeiten.
Aus diesem Grund haben wir eine Open Source-Erweiterung chrome) erstellt, um genau das zu tun: Flexible Fensterpositionierung über mehrere Monitore hinweg.
In Ihrem Fall können Sie einfach eine Regel pro Monitor definieren, wo und wie sie angezeigt werden soll. Sie können dies auf der Optionsseite der chrome extension. (Als Shorcut können Sie nach der Installation direkt dorthin gehen sing )
Die Erweiterung chrome heißt "MultiWindow Positioner" und ist komplett kostenlos. Sie erhalten sie im chrome store here
Den eigentlichen Quellcode findest du in github im Projekt chrome-multiwindow-positioner
Haftungsausschluss: Ich bin der Betreuer des Open Source (MIT) Github-Projekts. Wenn es interessante Ideen oder Kommentare gibt, können Sie diese gerne teilen hier .
Keine der oben genannten Lösungen funktioniert ordnungsgemäß. in Bezug auf die genaue Mitte,
Ich habe es versucht, es funktioniert gut für mich in chrome und Firefox
var sY = screenY;
if (sY < 0) {
sY = 0;
}
var totalScreenWidth = (screenX + window.outerWidth + sY);
if (totalScreenWidth > screen.width) {
totalScreenWidth = totalScreenWidth / 2;
} else {
totalScreenWidth = 0;
}
windowobj.moveTo(totalScreenWidth + ((screen.width - h) / 2), ((screen.height - h) / 2));
Dies ist jedoch auch dann problematisch, wenn der Browser des zweiten Monitors in der ersten Hälfte und in der zweiten Hälfte angezeigt wird.
/**
* Display popup window in the center of the screen.
*/
function popupWindow(url, title, w, h) {
// Use window.screenX to center the window horizontally on multi-monitor
// setup.
var left = window.screenX + (screen.width / 2) - (w / 2);
var top = (screen.height / 2) - (h / 2);
return window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
},