// Pops a window relative to the current window position
function popup(url, winName, xOffset, yOffset) {
var x = (window.screenX || window.screenLeft || 0) + (xOffset || 0);
var y = (window.screenY || window.screenTop || 0) + (yOffset || 0);
return window.open(url, winName, 'top=' +y+ ',left=' +x))
}
Rufen Sie es wie folgt auf und es wird über dem aktuellen Fenster geöffnet
popup('http://www.google.com', 'my-win');
Oder machen Sie es leicht versetzt
popup('http://www.google.com', 'my-win', 30, 30);
Der Punkt ist, dass window.screenX/screenLeft Ihnen die Position in Bezug auf den gesamten Desktop, nicht nur den Monitor, gibt.
window.screen.left wäre der ideale Kandidat, um Ihnen die benötigten Informationen zu liefern. Das Problem ist, dass es gesetzt wird, wenn die Seite geladen wird und der Benutzer das Fenster auf den anderen Monitor verschieben könnte.
Mehr Forschung
Eine endgültige Lösung für dieses Problem (abgesehen von der Verschiebung von der aktuellen Fensterposition) erfordert die Kenntnis der Abmessungen des Bildschirms, in dem sich das Fenster befindet. Da das Bildschirmobjekt nicht aktualisiert wird, wenn der Benutzer ein Fenster verschiebt, müssen wir einen eigenen Weg finden, um die aktuelle Bildschirmauflösung zu ermitteln. Das habe ich mir ausgedacht
/**
* Finds the screen element for the monitor that the browser window is currently in.
* This is required because window.screen is the screen that the page was originally
* loaded in. This method works even after the window has been moved across monitors.
*
* @param {function} cb The function that will be called (asynchronously) once the screen
* object has been discovered. It will be passed a single argument, the screen object.
*/
function getScreenProps (cb) {
if (!window.frames.testiframe) {
var iframeEl = document.createElement('iframe');
iframeEl.name = 'testiframe';
iframeEl.src = "about:blank";
iframeEl.id = 'iframe-test'
document.body.appendChild(iframeEl);
}
// Callback when the iframe finishes reloading, it will have the
// correct screen object
document.getElementById('iframe-test').onload = function() {
cb( window.frames.testiframe.screen );
delete document.getElementById('iframe-test').onload;
};
// reload the iframe so that the screen object is reloaded
window.frames.testiframe.location.reload();
};
Wenn Sie also möchten, dass das Fenster immer oben links auf dem Monitor geöffnet wird, auf dem es sich befindet, könnten Sie Folgendes verwenden:
function openAtTopLeftOfSameMonitor(url, winName) {
getScreenProps(function(scr){
window.open(url, winName, 'top=0,left=' + scr.left);
})
}
0 Stimmen
Keine einzige dieser "Lösungen" funktioniert bei mir. Haben Sie einen Weg gefunden.
0 Stimmen
@oma ich habe eine Lösung, die für mich funktioniert, in diesem Beitrag beantwortet aber: stackoverflow.com/questions/6911138/
0 Stimmen
Du hättest es stattdessen hier posten sollen. Das andere ist ein Duplikat und dieser Thread hat mehr relevanten Kontext.
0 Stimmen
Stimmt, ich habe diese Frage erst gesehen, nachdem ich meine Antwort im anderen Thread gepostet hatte - ich werde meine Antwort hierher verschieben