Эх. Обнаружил и у себя косяк, поэтому пришлось одну строчку добавить, так что мой код не короче. Вот работающий пример. Он показывает ошибки без дубликатов + продляет таймер. Собственно, по этим вопросам и тереблю форум целый день
<script src="http://code.jquery.com/jquery-latest.js"></script>
<button onclick="showErrors(['Ошибка 1'])">Ошибка 1</button>
<button onclick="showErrors(['Ошибка 1','Ошибка 2'])">Ошибка 1, Ошибка 2</button>
<button onclick="showErrors(['Ошибка 2','Ошибка 3'])">Ошибка 2, Ошибка 3</button>
<div id="cont"></div>
<script>
function showErrors(errors) {
if (!$('#elem').length) {
var $elem = $('<div id="elem"></div>').appendTo('#cont').each( function () {
//Устанавливаем задержку перед удалением или продлеваем старую, если она была
var el = $(this)
el.data('reload', function () {
clearTimeout(el.data('timer'))
el.data('timer', setTimeout((function (elem) {
return function () { elem.remove() }
})(el), 5000))
return el
})
return this
}).data('reload')()
} else {
var $elem = $('#elem').eq(0).data('reload')()
//Удаляем дубликаты
$elem.find('span').each(function () {
var errDel = $.inArray(this.innerHTML, errors)
if (errDel > -1) errors.splice(errDel,1)
})
}
for (var i in errors) { $elem.append('<span>' + errors[i] + '</span>. ') }
}
</script>