首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让JavaScript在当前监视器上打开弹出窗口

如何让JavaScript在当前监视器上打开弹出窗口
EN

Stack Overflow用户
提问于 2008-09-11 21:06:22
回答 8查看 37.1K关注 0票数 22

场景:

  1. 用户有两个monitors.
  2. Their浏览器在辅助监视器上打开。
  3. 他们单击浏览器中的链接,该浏览器使用特定的顶部和左侧窗口偏移量调用window.open()。
  4. 弹出窗口始终在其主监视器上打开。

在JavaScript中,有没有办法让弹出窗口在与初始浏览器窗口(打开程序)相同的监视器上打开?

EN

回答 8

Stack Overflow用户

发布于 2008-09-11 21:15:09

您不能指定监视器,但可以将弹出窗口的位置指定为相对于单击导致窗口弹出的位置。

使用getMouseXY()函数获取要作为左参数和上参数传递给window.open()方法的值。(左侧和顶部的参数仅适用于V3和up浏览器)。

window.open文档:http://www.javascripter.net/faq/openinga.htm

代码语言:javascript
复制
function getMouseXY( e ) {
    if ( event.clientX ) { // Grab the x-y pos.s if browser is IE.
        CurrentLeft = event.clientX + document.body.scrollLeft;
        CurrentTop  = event.clientY + document.body.scrollTop;
    }
    else {  // Grab the x-y pos.s if browser isn't IE.
        CurrentLeft = e.pageX;
        CurrentTop  = e.pageY;
    }  
    if ( CurrentLeft < 0 ) { CurrentLeft = 0; };
    if ( CurrentTop  < 0 ) { CurrentTop  = 0; };  

    return true;
}
票数 22
EN

Stack Overflow用户

发布于 2011-01-14 00:11:02

这是我不知羞耻地从Facebook oauth API反向工程得到的东西。已在Firefox/Chrome的主显示器和辅助显示器上测试。

代码语言:javascript
复制
function popup_params(width, height) {
    var a = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft;
    var i = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop;
    var g = typeof window.outerWidth!='undefined' ? window.outerWidth : document.documentElement.clientWidth;
    var f = typeof window.outerHeight != 'undefined' ? window.outerHeight: (document.documentElement.clientHeight - 22);
    var h = (a < 0) ? window.screen.width + a : a;
    var left = parseInt(h + ((g - width) / 2), 10);
    var top = parseInt(i + ((f-height) / 2.5), 10);
    return 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + ',scrollbars=1';
}   

window.open(url, "window name", "location=1,toolbar=0," + popup_params(modal_width, modal_height));
票数 19
EN

Stack Overflow用户

发布于 2011-01-25 04:46:10

代码语言:javascript
复制
// 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))
}

像下面这样调用它,它将在当前窗口的顶部打开

代码语言:javascript
复制
popup('http://www.google.com', 'my-win');

或使其略有偏移

代码语言:javascript
复制
popup('http://www.google.com', 'my-win', 30, 30);

重点是window.screenX/screenLeft提供了与整个桌面相关的位置,而不仅仅是显示器。

window.screen.left将是为您提供所需信息的理想候选者。问题是,它是在页面加载时设置的,用户可以将窗口移动到另一个监视器。

更多研究

这个问题的最终解决方案(不仅仅是从当前窗口位置偏移)需要知道窗口所在屏幕的尺寸。由于screen对象不会随着用户移动窗口而更新,因此我们需要自己设计检测当前屏幕分辨率的方法。这是我想出来的

代码语言:javascript
复制
/**
 * 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();
};

因此,如果您想始终在窗口所在的监视器的左上角打开窗口,可以使用以下命令:

代码语言:javascript
复制
function openAtTopLeftOfSameMonitor(url, winName) {
  getScreenProps(function(scr){
    window.open(url, winName, 'top=0,left=' + scr.left);
  })
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档