2009-02-09 49 views
21

我有一個應用程序在點擊一個鏈接時打開一個新窗口。這產生了一個包含Java小程序的頁面。我遇到的問題是單擊相同的鏈接重新加載頁面,該頁面會重置Java應用程序。有什麼辦法來捕捉這個?兩種解決方案是可以接受的是:JavaScript window.open只有當窗口不存在時

  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。

EDIT2: 有一個在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; 
    } 
} 

回答

19

我會這樣做 - basi在函數本身上存儲所有引用的打開窗口。當函數觸發時,檢查窗口是否存在或已經關閉 - 如此,啓動彈出窗口。否則,請關注該請求的現有彈出窗口。

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() 
    } 
} 
5

這段代碼的另一個版本,你可以使用像這樣在打開的新窗口的頁面:

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(...); 
} 
+1

或者乾脆(winref || winref.closed || winref.document!):如果( !newWindow || newWindow.closed) – 2009-02-09 16:16:45

+0

如果這個窗口已經打開並且沒有加載新的URL,那麼這個窗口沒有關注 – SCC 2014-03-08 12:12:19

2

你可以檢查這樣的:

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

這種形式的可能的空指針類型問題 – annakata 2009-02-09 16:09:47

+0

@annakata - 我*認爲*沒有空指針問題,因爲如果`!winref`爲真,那麼IOR的第二部分--winref.closed`不應該被檢查。這對你來說看起來是否合適?還是我錯了? – 2011-08-05 22:10:27

20

您需要執行2個測試... 1檢查是否定義了彈出窗口,並檢查它是否已關閉。

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(); 
} 
3

工作代碼

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();  
    } 
} 
相關問題