2016-03-01 51 views
1

我試圖實現通知樣式JQuery函數。這裏是我到目前爲止使用JQuery 5秒後隱藏元素的實例

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的解決方案或基於類。我不想在每個新通知中都加上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

哇,我真的這個答案,雖然我不知道它是如何工作的。當你說$ notification.remove()時,jquery如何知道我正在談論哪個$通知? – WiseOlMan

+0

而不是附加一個匿名html字符串,該字符串被轉換爲dom元素..你正在附加一個由jQuery對象表示的dom元素。對象的引用在追加過程中不會丟失 – 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

範圍界定將爲您節省開支!您傳遞的最後一個孩子要刪除通知是一個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 documentation **](http://api.jquery.com/jquery/#entry-examples-1)中,並且是創建元素的首選方式。 – adeneo