2009-02-09 4 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); 
} 

EDIT:

Спасибо за ответы - я модифицировал предложения немного, так что я мог бы иметь более чем один 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 cally сохраняет все открытые окна с ссылкой на самой функции. Когда функция срабатывает, проверьте, нет ли окна или не было закрыто - так, запустите всплывающее окно. В противном случае сосредоточьтесь на существующем всплывающем окне для этого запроса.

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() 
    } 
} 
+0

yep, вот как бы я это сделал - более низкая площадь, больше повторного использования, автономно +1 – annakata

+3

+1 отлично работает.Одна вещь, однако, у вас есть 'winRefs' в оригинальной проверке, но затем вы опечатаете ее позже как' winrefs' – Rondel

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) –

+0

это не фокусирует окно, если оно уже открыто, а также никогда не загружается с новым URL – SCC

2

Вы можете проверить, как это :

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

Возможные проблемы с нулевым указателем в этой форме – annakata

+0

@annakata - I * think * проблема с нулевым указателем отсутствует, потому что если '! Winref' истинно, тогда вторая часть IOR -' winref.closed' - никогда не должна проверяться. Это кажется вам правильным? Или я мертв неправильно? –

20

Вам необходимо выполнить 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(); 
} 
+0

Отличное решение как кросс-браузер – SCC

+0

Но он перезагружает окно, даже если URL-адрес тот же – SCC

+0

@ user2826057 в соответствии с примечанием в моей комментарий в коде - если вы не хотите перезагружать контент, если он является одним и тем же URL, вы можете проверить 'if (winRef.location.href! = myNewURL) {...}' только для перезагрузки, если он отличается. – scunliffe

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();  
    } 
} 
Смежные вопросы