2016-03-01 2 views
1

Я пытаюсь реализовать функцию JQuery стиля уведомлений. Вот то, что я до сих порСкрыть экземпляр элемента через 5 секунд с помощью JQuery

function notify(message, type, autohide, delay) { 
    message = message; 
    type = type || ""; 
    autohide = autohide || false; 
    delay = delay || 0; 
    $('#notification-container').append("<div class='notice " + type + "'>" + message + "<div class='close-container'><span class='glyphicon glyphicon-remove'></span></div></div>"); 
}; 

Вызов этой функции добавляет уведомление правильно, но я не был в состоянии сделать что конкретный элемент будет удален после того, как «задержка» периода времени без удаления всех других уведомлений. Я искал, но нашел только решения на основе #id или основанные на классе. Я не хочу добавлять идентификаторы в каждое новое уведомление, и если я удалю его с помощью .notice, все уведомления истекут в одно и то же время. Самое близкое, что я получил, должно было использовать

if (autohide) { 
    setTimeout(function() { 
    $('#notification-container .notice:last-child').remove(); 
    }, delay); 
} 

Но я уверен, что вы все видите, как это испорчено. Любая помощь или предложения будут оценены.

+0

Я не вижу ничего плохого в вашем коде , Вы видите какие-либо ошибки в консоли? Где это, если утверждение доступно в вашем основном коде? –

+0

http://stackoverflow.com/questions/3655627/jquery-append-object-remove-it-with-delay –

+0

@ ÁlvaroTouzón Я уже видел этот вопрос, но он удаляет его на основе класса. – WiseOlMan

ответ

1

Вы можете сделать элемент объект JQuery и использовать эту ссылку, чтобы удалить его

function notify(message, type, autohide, delay) { 
    message = message; 
    type = type || ""; 
    autohide = autohide || false; 
    delay = delay || 0; 
    var $notification = $("<div class='notice " + type + "'>" + message + "<div class='close-container'><span class='glyphicon glyphicon-remove'></span></div></div>"); 
    $('#notification-container').append($notification); 


    if (autohide) { 
    setTimeout(function() { 
     $notification.remove();  
    }, delay); 
    } 
} 
+0

Вау, я действительно этот ответ, хотя я не уверен, как это работает. Как jquery знает, о каком уведомлении $, о котором я говорю, когда вы говорите $ notification.remove(); – WiseOlMan

+0

Вместо добавления анонимной строки html, которая преобразуется в элементы dom. Вы добавляете элемент dom, который представлен объектом jQuery. Ссылка на объект не теряется во время добавления – charlietfl

+0

Что касается знания того, что ... в каждом экземпляре вызова функции есть только один объект переменной области видимости – charlietfl

1

Вы могли бы попробовать что-то вроде этого:

var deleteNotice = function(elem,delay){ 
    var tout = setTimeout(function(){ 
     clearTimeout(tout); 
     elem.remove() 
    },delay);//Now this acts on only this element 
} 

function notify(message, type) { 
    $('#notification-container').append("<div class='notice " + type + "'>" + message + "<div class='close-container'><span class='glyphicon glyphicon-remove'></span></div></div>"); 
    //Now assign this element to a variable, so everytime your function is called el represents the latest notice 
    var el = $('#notification-container .notice:last-child'); 
    deleteNotice(el,10000);//A function to delete this selected element 
}; 
+0

Позвольте мне попробовать, но разве это не проблема с удалением последнего элемента из # notification-container, который может быть уведомлением, которое было добавлено после? – WiseOlMan

+0

Scoping избавит вас от этого! Последним ребенком, которого вы отправляете, чтобы удалить уведомление, является элемент jquery, а не «последний ребенок» для каждого сообщения. – Anubhab

+0

Работает! Очень хорошо сделано. Выбор в качестве ответа, как только это позволит мне. – WiseOlMan

0

Я хотел бы создать элементы и хранить их в локальных переменных, таким образом только элементы для этого вызова функции будут удалены. Что-то вроде

function notify(message, type, autohide, delay) { 
    var div = $('<div />', { 
     'class' : 'notice' + (type ? ' '+type : ''), 
     text : message || '' 
    }), 
     close = $('<div />', { 
      'class' : 'close-container', 
      on  : { 
       click : function() { 
        div.remove(); 
       } 
      }, 
      html : $('<span />', { 
       'class' : 'glyphicon glyphicon-remove' 
      }) 
    }); 

    if (autohide) { 
     div.delay(delay||0).hide(0, function() { 
      $(this).remove(); 
     }); 
    } 

    $('#notification-container').append(div.append(close)); 
} 

FIDDLE

Here's a version that supports animations

+0

Я никогда не видел, как вы создавали div. Вы знаете хороший ресурс, где я мог бы это прочитать? Или даже то, что называется? – WiseOlMan

+0

@WiseOlMan - Конечно, это в документации [** jQuery **] (http://api.jquery.com/jquery/#entry-examples-1) и является предпочтительным способом создания элемента. – adeneo

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