【问题标题】:JavaScript window.open only if the window does not already existJavaScript window.open 仅当窗口不存在时才打开
【发布时间】:2010-10-06 10:23:50
【问题描述】:

我有一个应用程序,在单击链接时会打开一个新窗口。这会生成一个包含 Java 小程序的页面。我遇到的问题是单击相同的链接会重新加载页面,从而重置 Java 应用程序。有什么办法可以捕获这个吗?两种可以接受的解决方案是:

  1. 允许从点击处理程序打开多个窗口
  2. 如果窗口已打开,则忽略后续请求

为成为 Javascript 新手而道歉 - 这并不是我的主要工作。

附加到处理程序的代码是

function launchApplication(l_url, l_windowName)
{
  var l_width = screen.availWidth;
  var l_height = screen.availHeight;

  var l_params = 'status=1' +
                 ',resizable=1' +
                 ',scrollbars=1' +
                 ',width=' + l_width +
                 ',height=' + l_height +
                 ',left=0' +
                 ',top=0';

  winRef = window.open(l_url, l_windowName, l_params);
  winRef.moveTo(0,0);
  winRef.resizeTo(l_width, l_height);
}

编辑:

感谢您的回复 - 我稍微修改了建议,以便可以通过该函数打开多个 URL。

编辑2: 此代码的另一个版本位于Check for a URL open on another window

var g_urlarray = [];

Array.prototype.has = function(value) {
    var i;
    for (var i in this) {
        if (i === value) {
            return true;
        }
    }
    return false;
};


function launchApplication(l_url, l_windowName)
{
  var l_width = screen.availWidth;
  var l_height = screen.availHeight;
  var winRef;

  var l_params = 'status=1' +
                 ',resizable=1' +
                 ',scrollbars=1' +
                 ',width=' + l_width +
                 ',height=' + l_height +
                 ',left=0' +
         ',top=0';
  if (g_urlarray.has(l_url)) {
    winRef = g_urlarray[l_url];
  }
  alert(winRef);
  if (winRef == null || winRef.closed) {
      winRef = window.open(l_url, l_windowName, l_params);
      winRef.moveTo(0,0);
      winRef.resizeTo(l_width, l_height);
      g_urlarray[l_url] = winRef;
  }
}

【问题讨论】:

    标签: javascript popup window


    【解决方案1】:

    我会这样做 - 基本上将所有引用的打开窗口存储在函数本身上。当函数触发时,检查窗口是否不存在或已关闭 - 如果是这样,启动弹出窗口。否则,请关注该请求的现有弹出窗口。

    function launchApplication(l_url, l_windowName)
    {
      if ( typeof launchApplication.winRefs == 'undefined' )
      {
        launchApplication.winRefs = {};
      }
      if ( typeof launchApplication.winRefs[l_windowName] == 'undefined' || launchApplication.winRefs[l_windowName].closed )
      {
        var l_width = screen.availWidth;
        var l_height = screen.availHeight;
    
        var l_params = 'status=1' +
                       ',resizable=1' +
                       ',scrollbars=1' +
                       ',width=' + l_width +
                       ',height=' + l_height +
                       ',left=0' +
                       ',top=0';
    
        launchApplication.winRefs[l_windowName] = window.open(l_url, l_windowName, l_params);
        launchApplication.winRefs[l_windowName].moveTo(0,0);
        launchApplication.winRefs[l_windowName].resizeTo(l_width, l_height);
      } else {
        launchApplication.winRefs[l_windowName].focus()
      }
    }
    

    【讨论】:

    • 是的,我就是这样做的 - 占用更少,重复使用更多,自包含 +1
    • +1 效果很好。但有一件事,您在原始支票中有winRefs,但后来您将其拼错为winrefs
    【解决方案2】:

    工作代码

    var newwindow = null;
    function popitup(url) {
        if ((newwindow == null) || (newwindow.closed)) {
            newwindow=window.open(url,'Buy','width=950,height=650,scrollbars=yes,resizable=yes');
            newwindow.focus();
        } else {
            newwindow.location.href = url;
            newwindow.focus();    
        }
    }  
    

    【讨论】:

      【解决方案3】:

      尝试检查:

      如果 (!winref || winref.closed || !winref.document) { }

      【讨论】:

        【解决方案4】:

        你可以这样检查:

        if(!winref || winref.closed)
        {
        }
        

        【讨论】:

        • @annakata -- 我认为 不存在空指针问题,因为如果!winref 为真,那么IOR 的第二部分 -- winref.closed --永远不应该检查。你觉得这对吗?还是我错了?
        【解决方案5】:

        您需要执行 2 次测试... 1 检查弹出窗口是否已定义,2 检查是否已关闭。

        if(typeof(winRef) == 'undefined' || winRef.closed){
          //create new
          winRef = window.open(....);
        } else {
          //it exists, load new content (if necs.)
          winRef.location.href = 'your new url';
          //give it focus (in case it got burried)
          winRef.focus();
        }
        

        【讨论】:

        • 优秀的跨浏览器解决方案
        • 但是即使 URL 相同也会重新加载窗口
        • @user2826057 根据我在代码中的注释中的注释 - 如果您不想重新加载内容(如果它是相同的 URL),您可以测试 if(winRef.location.href != myNewURL){...} 以仅在不同时重新加载。
        【解决方案6】:

        您可以在打开新窗口的页面中使用类似的内容:

        var newWindow = null;
        
        function launchApplication()
        {
          // open the new window only if newWindow is null (not opened yet)
          // or if it was closed
          if ((newWindow == null) || (newWindow.closed))
            newWindow = window.open(...);
        }
        

        【讨论】:

        • 或者简单地说:if (!newWindow || newWindow.closed)
        • 如果窗口已经打开,则不会聚焦窗口,也不会使用新 URL 加载
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-17
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        相关资源
        最近更新 更多