2009-02-09 29 views
5

这是一个后续行动,我的最后一个问题Open a window if the window does not already exist 从本质上讲,我现在保持已被打开的页面中的所有窗口引用的列表,并只允许它们被打开,如果他们不已经打开。然后出现一个潜在的问题 - 用户当然可能关闭原始窗口并再次打开,从而失去窗口引用列表。如何在另一个窗口中检查打开的URL?

是否可以循环浏览器中打开的窗口,检查特定的URL?

编辑: 在这里(和另一个问题)有很多有用的评论之后,这里是应用程序启动器的最终代码。本质上,它试图用合适的名称来获取打开窗口的位置。如果这导致例外(由于隐私问题),则判定应用程序已被加载。如果它是“about:blank”,那么它是一个新窗口。这适用于Firefox,IE7和Google Chrome。它感觉脏...

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]; 
    } 
    if (winRef == null || winRef.closed) { 
     winRef = window.open('', l_windowName, l_params); 
     var l_openNew = 0; 
     try { 
      if (winRef.location == 'about:blank') { 
       l_openNew = 1; 
      } 
     } 
     catch (e) { 
      l_openNew = 0; 
     } 
     if (l_openNew === 1) 
     { 
      winRef.location = l_url; 
      winRef.moveTo(0,0); 
      winRef.resizeTo(l_width, l_height); 
     } 
     g_urlarray[l_url] = winRef; 
    } 
} 

回答

0

@annakata(即使你储存它们,你将无权再关闭它们)

事实并非如此。如果您有窗口的名称,即使关闭并重新打开了开启器,也可以使用window.open重新建立窗口的链接。例如:

<script> 
function winOpen(url){ 
    return window.open(url,getWinName(url)); 
} 
function winClose(url){ 
    var win = window.open("",getWinName(url)); 
    win.close(); 
} 
function getWinName(url){ 
    return "win" + url.replace(/[^A-Za-z0-9\-\_]*/g,""); 
} 
</script> 
<a href="#" onclick="winOpen('http://google.com');return false;">Click me first</a>, close and open this window, then 
<a href="#" onclick="winClose('http://google.com');return false;">click me to close the other window</a> 
4

不,这将是一个安全/隐私问题。


因为别人都带来了所有权/ Cookie状态存储:这只是如果你也是其中推开窗,即在用户关闭窗口向下并重新打开,然后这些引用的情况相同的文档作品确实已经丢失(即使您存储它们,您也无权再关闭它们)

+0

您的评论居然把我的路径解决方案上 - 如果想获得该窗口的位置抛出一个异常,那么它必须已经装载(因为约:空白不抛出异常)。非常感谢。 – 2009-02-10 10:04:36

+0

这是一个非常好的方式来通过它 – annakata 2009-02-10 10:12:48

2

在JavaScript中,您只能获得对当前窗口的引用,以及任何用window.open打开的窗口。

你可以检查winRef.closed,看看用户关闭窗口,虽然。不过,我不确定这是否适用于所有浏览器。

2

如果您给每个窗口一个唯一的窗口名称(window.open的第二个参数),再次调用window.open以相同的窗口名称将打开窗口,如果它关闭,或返回对现有窗口的引用而无需打开新窗口。

0

你实际上可以用cookies做到这一点,但是......如果你问我,你就不会这样做。

0

设置一个数组,当你打开他们的窗口引用增加它...

var wins = new Array(); 

function openWindow(url) { 
    wins.push(window.open(url)); 
} 

然后,当你想检查窗口的状态,您可以通过他们循环就是这样,并删除未打开的窗户......

function updateWindowArray() { 
    for(var i = 0, l = wins.length; i < l; i++) { 
    if(wins[i] == null || wins[i].closed) 
     arrayRemove(wins, i, i + 1); 
    } 
} 

function arrayRemove(array, from, to) { 
    var rest = array.slice((to || from) + 1 || array.length); 
    array.length = from < 0 ? array.length + from : from; 
    return array.push.apply(array, rest); 
} 

最好的问候......

相关问题