2010-06-05 4 views
0

Я хочу показать диалог через n секунд и скрыть его через несколько секунд, но это не работает для меня!открытие и закрытие диалога jquery не работает

$(document).ready(function() { 
    var advanced = $("div#advanced"); 
    $(advanced).dialog({ autoOpen: false, 
     modal: true, 
     buttons: { "Try it now": function() { window.location = 'myURL'; }, 
      "No thank's": function() { $(this).dialog("close"); } 
     }, 
     show: 'fade', 
     width: 350, 
     height: 130, 
     draggable: false, 
     resizable: false 
    }); 
    window.setTimeout(function() { 
     $(advanced).dialog("open"); 
    }, n); 
    window.setTimeout(function() { 
     $(advanced).dialog("close"); 
    }, m);}); 
+0

Вы знаете, что будут открыты для (m - n) секунд? Я не вижу никаких других проблем ... – MvanGeest

+1

Это избыточно, чтобы установить 'advanced' в' $ («div # advanced») ', а затем всегда ссылаться на него как' $ (расширенный) '- это ненужный вызов функции – Pointy

ответ

1

Переместите setTimeout, который закроет диалог в обратном вызове для таймера, который открывает диалог. Вероятно, вы также захотите очистить таймер, когда диалог закроется.

$(function() { 
    var advanced = $("div#advanced"); 
    advanced.dialog({ autoOpen: false, 
     modal: true, 
     buttons: { "Try it now": function() { 
         window.location = 'myURL'; 
        }, 
      "No thank's": function() { 
         $(this).dialog("close");; 
        } 
     }, 
     close: clearTimer, 
     show: 'fade', 
     width: 350, 
     height: 130, 
     draggable: false, 
     resizable: false 
    }); 
    var closeTimer = null; 

    setTimeout(function() { 
     advanced.dialog("open"); 
     closeTimer = setTimeout(function() { 
      closeTimer = null; 
      advanced.dialog("close"); 
     }, m); 
    }, n); 

    function clearTimer() { 
     if (closeTimer) { 
      clearTimeout(closeTimer); 
      closeTimer = null; 
     } 
    } 

}); 
+0

хорошо, ваше слово подходит отлично, но я хочу, чтобы мой подход был таким же;) – Sadegh

+0

@Sadegh - вам не нужно закрывать окно, если оно не открыто. Поскольку это зависимые события, код закрытия * должен * быть зависеть от открываемого диалога. Вы устанавливаете их как независимые события, и в то время как это будет работать, если вы измените время истечения, чтобы второе заняло больше времени, чем первое, оно зависит от правильных чисел. Мой способ не запускает таймер закрытия до тех пор, пока диалог не будет открыт, затем он запустит 'm' ms позже, чтобы закрыть его, если он уже не был закрыт пользователем. Настройка таймера закрытия в открытом диалоговом окне даже может быть лучше/более надежной. – tvanfosson

+0

Извините, я понимаю ваши средства как плохое/нехорошее решение, на самом деле я не понимаю ваших средств в первую очередь. спасибо 'за более подробное объяснение. Объяснение – Sadegh

1

Попробуйте изменить код немного, как это:

$(document).ready(function() { 
    var advanced = $("div#advanced"); 
    advanced.dialog({ autoOpen: false, 
     modal: true, 
     buttons: { 
      "Try it now": function() { window.location = 'myURL'; }, 
      "No thank's": function() { $(this).dialog("close"); } 
     }, 
     show: 'fade', 
     width: 350, 
     height: 130, 
     draggable: false, 
     resizable: false 
    }); 
    setTimeout(function() { 
     advanced.dialog("open"); 
    }, n); 
    setTimeout(function() { 
     advanced.dialog("close"); 
    }, m); 
}); 

Как Понтий указывает в комментариях, вы клонировать advanced элемент by wrapping it in $() again, а это означает, что элемент вы создания в диалоговом окне и в элементе вы находитесь , пытаясь его открыть. on - это отдельные клоны, ни оригиналы. Просто используйте advanced прямо как я уже выше, это уже объект jQuery :)

+0

@Nike ;-) Спасибо снова маленькому герою, ваше местоположение - рай (بهشت در قرآن کریم) – Sadegh

+1

Я не думаю, что на самом деле имеет значение, что он клонирует элемент jQuery в этом случае, так как диалог повторно использует базовые элементы DOM. Если виджет поддерживает некоторое состояние вне DOM, то, вероятно, это произойдет, но воссоздание виджета диалогового окна не должно иметь значения. В любом случае, похоже, я не тестирую. Я согласен, что как только вы создали элемент, вы должны просто его использовать, но я не думаю, что это вызывает проблему. – tvanfosson

Смежные вопросы