SELECT
REPLACE(REPLACE(authorid, ', Линус Торвальдс', ''), 'Линус Торвальдс, ', '') AS coauthors
FROM books
WHERE authorId LIKE '%Линус Торвальдс%'
SELECT
GROUP_CONCAT(
REPLACE(REPLACE(authorid, ', Линус Торвальдс', ''), 'Линус Торвальдс, ', '')
)AS coauthors
FROM books
WHERE authorId LIKE '%Линус Торвальдс%';
items[name] = new Item(name, $html.find('.-notification-timer'));
items[name] = $html.find('.-notification-timer');
// внутри функции обработчика
// добавляем контейнер для таймеров в DOM если его не существует
if (!$('.timers_container').length) {
$('body').append('<div class="timers_container"></div>');
}
AND m2.state = 'ПУСК'
AND m1.state = 'СТОП'
m2.num > m1.num
AND m1.state = 'ПУСК'
AND m2.state = 'СТОП'
добавьте к обьекту Items поле в котором вы будете хранить таймер, и через это поле получайте доступ к нему. Тогда идентификатор не будет нужен
а если без id, то необходимо составлять сложный объект , хранить ссылки на DOM блоков-контейров сообщений и работать с этим объектом, как-то так.
let Item = function(name, timer) {
this.name = name;
this.timer = timer;
}
const items = [];
// ....
// ....
// создаем JQuery объект из полученного HTML
let $html = $(data);
// подключите библиотеку отсюда
// https://www.queness.com/code-snippet/6523/generate-md5-hash-with-javascript
// получаем имя = текст из блока .inline-block.-notification-text
let name = calcMD5($html.find('.inline-block.-notification-text').text());
// передаем в объект Item хэш текста сообщения и ссылку НА таймер
items[name] = new Item(name, $html.find('.-notification-timer'));
// либо просто в массиве
items[name] = $html.find('.-notification-timer');
// ...
// соответственно по тексту сообщения/хеша,
// получаем элемент из списка объектов, хотя не знаю зачем так можно вообще просто:
// items[name] = $html.find('.-notification-timer');
// т.е. опять голый массив.
function startTimer(name) {
let $timer = items[name]; // либо если объект - items[name].timer
$timer.stop();
$timer.css("width", "100%");
$timer.animate(
{width: 0},
{duration: 10000,
complete: function() {
$(this).closest('.notice__info').remove();
delete items[name];
console.log(`Удален ${name}`);
}
}
);
}
$(document).on('click', '.notice__delete', function() {
let $timer = $(this).siblings().find('.notice__timer');
let name = calcMD5($(this).siblings().find('.inline-block.-notification-text').text());
$timer.stop();
$(this).parent().remove();
delete items[name];
});
// создаем JQuery объект из полученного HTML
let $html = $(data);
// получаем имя = текст из блока .inline-block.-notification-text
let name = $html.find('.inline-block.-notification-text').text();
// добавляем в items данный name
items[name] = 1;
// устанавливаем аттрибут data-name в полученном "таймере"
$html.find('.-notification-timer').data('name', name);
// ...
// добавляем "таймер" в контейнер
$('.timers_container').append($html);
// стартуем таймер
var ntNotification = {
templates: {},
notifications: [],
getTemplate: function(e, t) {
var i = this;
this.templates[e] ? t(i.templates[e]) : $.get("/html/ru_RU/utils/notification.html", function(n) {
i.templates[e] = n, t(i.templates[e])
})
},
getTop: function(e) {
return parseInt(e.css("top").replace("px", ""))
},
moveAll: function(e, t) {
var i = this;
_.forEach(i.notifications, function(n, o) {
if (o >= e)
if (e != o) {
var a = i.notifications[o - 1].elm;
t = t + a.outerHeight() + 5, n.elm.animate({
top: t + "px"
}, 200)
} else n.elm.animate({
top: t + "px"
}, 200)
})
},
deleteNotification: function(e, t) {
var i = this,
n = _.indexOf(i.notifications, e),
o = i.getTop(e.elm);
e.timeout && clearTimeout(e.timeout), i.notifications = _.without(i.notifications, e), e.elm.stop(!0, !0), t ? e.elm.animate({
left: e.elm.width() + "px",
opacity: 0
}, 200, function() {
e.elm.remove(), i.moveAll(n, o)
}) : e.elm.animate({
top: o - e.elm.outerHeight() + "px",
opacity: 0
}, 200, function() {
e.elm.remove(), i.moveAll(n, o)
})
},
shake: function(e) {
for (var t = 0; t < 6; t++) $(e).animate({
"margin-left": t % 2 == 0 ? 5 : -5
}, {
duration: 70,
queue: !0
});
$(e).animate({
"margin-left": 0
}, 70)
},
getPageX: function(e) {
var t = 0;
if ("touchstart" == e.type || "touchmove" == e.type || "touchend" == e.type || "touchcancel" == e.type) {
t = (e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]).pageX
} else "mousedown" != e.type && "mouseup" != e.type && "mousemove" != e.type && "mouseover" != e.type && "mouseout" != e.type && "mouseenter" != e.type && "mouseleave" != e.type || (t = e.pageX);
return t
},
show: function(e, t, i) {
var n = this,
o = CryptoJS.SHA1(t).toString(),
a = _.findWhere(n.notifications, {
id: o
}),
r = !_.isUndefined(i) && i;
if (a) {
if (a.elm.stop(!0, !0), n.shake(a.elm), a.timeout) {
clearTimeout(a.timeout);
var s = a.elm.find(".-notification-timer");
s.stop(!0, !0), s.css({
width: ""
}), s.animate({
width: 0
}, a.time), a.timeout = setTimeout(function() {
n.deleteNotification(a)
}, a.time)
}
} else this.getTemplate(e, function(a) {
window.view && window.view.translate && (t = window.view.translate(t));
var s = {
id: o,
elm: $(_.template(a)({
type: e,
message: t,
hasTimer: r
}))
};
if (s.elm.data("id", o), n.notification_box || (n.notification_box = $('<div class="-notification-box"></div>'), $(document).on("click", ".-notification-close, .-notification-box .-notification-icon", function() {
var e = _.findWhere(n.notifications, {
id: $(this).parent().eq(0).data("id")
});
e && n.deleteNotification(e)
}), $(document).on("touchstart", ".-notification", function(e) {
var t = _.findWhere(n.notifications, {
id: $(this).data("id")
});
t.elm.css("left", 0);
var i = n.getPageX(e),
o = t.elm.offset();
$(document).on("touchmove.notification", function(e) {
var a = n.getPageX(e),
r = a - i;
r > 0 ? t.elm.css({
left: r + "px"
}) : o.left < a ? i = a : $(document).off("touchmove.notification touchend.notification"), r > 100 && ($(document).off("touchmove.notification touchend.notification"), n.deleteNotification(t, !0))
}), $(document).on("touchend.notification", ".-notification", function() {
t.elm && t.elm.css({
left: 0
}), $(document).off("touchmove.notification touchend.notification")
})
}), n.notification_box.css({
top: 0
}), $("body").append(n.notification_box)), s.elm.css({
opacity: 0,
top: 0
}), n.notification_box.append(s.elm), 0 != n.notifications.length) {
5 == n.notifications.length && n.deleteNotification(n.notifications[n.notifications.length - 1]);
var c, d = function() {};
_.forEach(n.notifications, function(e, t) {
if (t == n.notifications.length - 1 && (d = function() {
s.elm.animate({
opacity: 1
}, {
duration: 100,
queue: !0
})
}), 0 != t) {
var i = n.notifications[t - 1].elm;
c = c + i.outerHeight() + 5, e.elm.animate({
top: c + "px"
}, 100, d)
} else c = s.elm.outerHeight() + 5, e.elm.animate({
top: c + "px"
}, 100, d)
})
} else s.elm.animate({
opacity: 1
}, 100);
n.notifications.unshift(s), r && (s.time = i, s.elm.find(".-notification-timer").animate({
width: 0
}, i), s.timeout = setTimeout(function() {
n.deleteNotification(s)
}, s.time))
})
},
showError: function(e, t) {
t = _.isUndefined(t) ? 5e3 : t, this.showMessage(e, "error", t)
},
showWarning: function(e, t) {
t = !0 === t && 5e3 || t, this.showMessage(e, "warning", t)
},
showSuccess: function(e, t) {
t = _.isUndefined(t) ? 5e3 : t, this.showMessage(e, "success", t)
},
showMessage: function(e, t, i) {
var n = this;
if (t = t || "error", i = _.isUndefined(i) ? "warning" == t ? 0 : 5e3 : i, /^\/[a-z]+/.test(e)) {
var o = $("body").data("lang");
$.get("/html/" + o + e, function(e) {
n.show(t, e, i)
})
} else n.show(t, e, i)
}
};
//........
o = CryptoJS.SHA1(t).toString(),
a = _.findWhere(n.notifications, {
id: o
})
//........ потом навешиваются
s.elm.data("id", o)
// далее использование:
$(document).on("click", ".-notification-close, .-notification-box .-notification-icon", function() {
var e = _.findWhere(n.notifications, {
id: $(this).parent().eq(0).data("id")
});
// ...
$(document).on("touchstart", ".-notification", function(e) {
var t = _.findWhere(n.notifications, {
id: $(this).data("id")
});
const items = [];
// ...............
// ...............
// добавляем контейнер для таймеров в DOM если его не существует
if (!$('.timers_container').length) {
$('body').append('<div class="timers_container"></div>');
}
// создаем JQuery объект из полученного HTML
let $html = $(data);
// получаем имя = текст из блока .inline-block.-notification-text
let name = $html.find('.inline-block.-notification-text').text();
// добавляем в items данный name
items[name] = 1;
// устанавливаем аттрибут data-name в полученном "таймере"
$html.find('.-notification-timer').data('name', name);
// ...
// добавляем "таймер" в контейнер
$('.timers_container').append($html);
// стартуем таймер
// ...