jQuery EventBus - отписаться при выгрузке
Предположим, я хочу реализовать простой шаблон EventBus в javascript, используя jQuery. На странице есть div, где я загружаю некоторый динамический контент, используя $(). Load(). Этот контент имеет некоторый код JavaScript, который подписывается на некоторые события в $ (document).ready ()
page1.html:
$(document).ready(function() {
$eventBus.on("next", function() {
// do something
});
});
root.html
$("#content").load("page1.html"); // load page1 and invoke it's javascript
Как правильно отписаться от этого обработчика событий, когда другой контент с другим скриптом загружен в тот же div? Т.е. где лучше всего поместить $eventBus.off("next");
Чего я действительно хочу добиться, так это заставить внутренние страницы подписываться на некоторые события при загрузке и отписываться при выгрузке
1 ответ
Итак, во-первых, кажется, что вы хотите создать свою собственную структуру SPA. Зачем? Есть много там. Используйте угловатый, или тлеющий, или нокаут, или реакцию, или полет.
Далее, если вы собираетесь создать свой собственный фреймворк, вам нужно будет создать свой собственный фреймворк, не стоит его обманывать. Это означает, что вам нужен API, который оборачивает много jquery, чтобы иметь необходимые хуки.
С моей головы вы можете сделать что-то вроде этого
MyFramework.load({url: 'page1.html', target: '#content'}).then(...)
Тогда MyFramework.load будет так что-то вроде
MyFramework.load = (op) => {
return $.Deferred( (d) => {
$.get(op.url).then((html)=>{
if(currentContexts[op.target])
MyFramework.unload(currentContexts[op.target])
var ctx = $.extend({}, op);
ctx.subscriptions = MyFramework.events.trackSubscriptions(() => {
$(op.target).html(html);
});
d.resolve();
});
});
}
Все подписки на события должны будут проходить через ваш собственный API, или вам придется переопределить jquery.on
так что вы можете отслеживать их.
Вышеупомянутое не идеально, и вам все равно придется реализовать unload
, trackSubscriptions
свой собственный API подписки на сообщения и некоторый способ отследить события, на которые не были подписаны сразу, но эта основная идея будет работать.
Опять же, я буду осторожен. Это тяжело. Если вы не понимаете весь вышеприведенный код, вы даже не должны пытаться его выполнять (и, возможно, вам не следует даже делать это). Просто используйте существующий фреймворк.