Как закрыть диалог

Представьте что у вас на странице есть 5 разных диалогов, они могут быть открыты в любой последовательности но два сразу открытыми быть не могут. Значит надо закрывать все открытые, но как их ывыбрать, не хранить же 5 ссылок на диалоги.

Первый пришедший в голову вариант был прост как двери


$("#dialog1", "#dialog2", "#dialog3", "#dialog4", "#dialog5").dialog("close");

но если хотя бы один диалог не был создан при старте страницы то вылетит Exception. Естественно создавать диалоги при старте бессмысленно. ни один может не понадобиться а ресурсов они отъедают нормально. Второй вариант был таким


for (var i=1, j=5; i<j; i++){
	try {
		$("#dialog"+i).dialog("close");
	} catch(e) {
		// do nothing
	}
}

и несколько дней эта конструкция муляла мне глаза. Наконец я переписал это примерно так


for (var i=1, j=5, d; i<j; i++){
	d = $("#dialog"+i);
	if (d.data("dialog")) {
		d.dialog("close");
	}
}

стало лучше но еще не совершенно, последним вариантом стало


$("div:data(dialog)").dialog("close");

теперь я доволен, а какие еще есть варианты?

8 Комментарии “Как закрыть диалог

  1. Я не тестировал на скорость выборку по data, но еще есть более очевидный и простой для понимания

    
    $('#dialogs > div')
    
  2. если 5 диалогов то как все вместе закрыть? надо указать в селекторе 5 айдишников, верно? а в моем последнем случаи ничего указывать не надо.

  3. блять, без кода самого метода и хтмля я больше не скажу, потому что может получица разговор глухого со слепым.
    что вернет $(«div:data(dialog)»)? набор элементов соответствующих критерию, тоже что и $(‘#dialogs > div’), если конечно хтмл будет соответствовать. только выборка по data(dialog) мне кажеца будет выполняться дольше.

  4. если диалог открывается $(«#dialog»).dialog({}) то $(«div:data(dialog)») вернет $(«#dialog») на котором можно вызвать метод .dialog(«close»).

  5. Предположу, что:
    if([d = $(‘div[id^=»dialog»]’), d.length][1]) d.dialog(«close»);
    На счет производительности не уверен.

  6. красиво завернул в массив, но бессмысленно, в общем случаи это тоже самое что $(‘div’).dialog(«close»); а этот код бросает эксепшн

Комментарии закрыты