noty Jquery плагин тайм-аут не происходит
Тайм-аут плагинов Jquery noty не работает при наличии списка сообщений. Я получаю список сообщений от сервлета и вызываю Ноти так.
<script>
function callNotification()
{
<c:foreach var = "message" items = "${sessionScope.notification}">
notify('${message}');
</c:foreach>
}
function notify(message)
{
noty({
"text": message,
"theme": noty_theme_facebook",
"layout": topRight,
"information","animateOpen":{"height":"toggle"},
"information","animateOpen":{"height":"toggle"},
"speed":500,
"timeout":5000,
"closeButton":true,
"closeOnSelfClick":true,
"closeOnSelfOver":false,
"modal":false
})
</script>
В идеале это должно зациклить сообщения и распечатать их с таймаутом 5000 мс. Но это печатает все сообщения сразу. Далее я попытался использовать встроенную функцию javascript setTimeout и заменил свою callNotification этим.
function callNotification()
{
<c:foreach var = "message" items = "${sessionScope.notification}">
(function(message){
setTimeout(function(){notify('${message}');},5000)
}('${message}')
}}
</c:foreach>
}
Но это также оказалось неэффективным. Странно, тайм-аут, кажется, работает нормально, когда я заменяю "layout":center
в методе уведомления. Куда я иду не так. Я хочу, чтобы сообщения отображались со временем 5 секунд, после чего первое сообщение автоматически стирается, а следующее отображается.
7 ответов
Noty закодирован так, что если у вас есть кнопки в Noty, он отключает тайм-аут. Это не имеет смысла для меня, но это так.
Это виновник (строка 62):
60: // If we have button disable closeWith & timeout options
61: this.options.closeWith = [];
62: this.options.timeout = false;
Просто удали this.options.timeout = false;
и это сохранит время ожидания, если у вас есть ноти с кнопками.
Чтобы заставить это работать, я изменил следующее в jquery.noty.js ...
self.$bar.delay(self.options.timeout).promise().done(function () {
self.close();
});
к этому...
setTimeout(function () {
self.close();
}, self.options.timeout);
Мой ответ для v2.3.7.
Noty возвращает объект javascript, следовательно, если вы проверите его в firebug, выполнив console.dir(n), вы найдете все методы и свойства возвращаемого объекта.
Следующее установит тайм-аут на 3 секунды:
var n = noty({text: 'noty - a jquery notification library!'});
n.setTimeout(3000);
Пытаться closeWith
с опцией тайм-аута надеюсь, что она будет работать нормально
function generate(type, text) {
var n = noty({
text : text,
type : type,
dismissQueue: true,
layout : 'topRight',
closeWith : ['click','timeout'],
theme : 'relax',
maxVisible : 10,
timeout :7000,
animation : {
open : 'animated bounceInRight',
close : 'animated bounceOutRight',
easing: 'swing',
speed : 500
}
});
Вы должны предоставить эту опцию в качестве параметра: "buttons: false"
В вашем jquery.noty.packaged.js создайте глобальную переменную с именем "master_self" file.Now в строке 103 или 104 должна быть строка var self = this;
чуть ниже этой линии присвойте master_self значение self master_self = self;
Теперь создайте функцию в том же файле:
function autoTimeout(timeoutVal){
setTimeout(function(){
var self = master_self;
if (typeof self.options.animation.close == 'string') {
self.$bar.addClass(self.options.animation.close).one('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function() {
if(self.options.callback.afterClose) self.options.callback.afterClose.apply(self);
console.log(self);
self.closeCleanUp();
});
} else {
self.$bar.clearQueue().stop().animate(
self.options.animation.close,
self.options.animation.speed,
self.options.animation.easing,
function() {
if(self.options.callback.afterClose) self.options.callback.afterClose.apply(self);
})
.promise().done(function() {
self.closeCleanUp();
});
}
},timeoutVal);
}
Теперь явно вызовите эту функцию для уведомления, для которого вы хотите тайм-аут таким образом сразу после вызова объекта-ноти для создания уведомления:
autoTimeout(1000);
Вы также можете добиться этого, указав этот параметр во время инициализации
buttons: false
Больше здесь http://ned.im/noty/