2014-09-01 8 views
9

Предположим, что у меня есть страница с раскладкой из двух столбцов, где левый столбец представляет собой набор ссылок, и он загружает связанную html-страницу/шаблон в правый столбец при нажатии этой ссылки.События и элементы DOM

При загрузке шаблона есть обработчик шаблон, который инициализируется как одноточечного через requirejs и определяет некоторые методы и обработчики, как:

SomePage.prototype.saveHandler: function(e) { ... }; // Page handler has a handler 

SomePage.prototype.initialize: function() { 
    $('#btnSave').on('click', saveHandler); 
} 

Тогда я прикрепление события DOM через метод инициализации каждого время загрузки страницы.

SomePage.initialize(); // This attaches the click event 

Теперь, когда я нажимаю другую ссылку на левой стороне, другой шаблон страницы загружается и выше процесс повторяется для этой страницы.

Мне интересно, что происходит с событием клика, которое ранее было прикреплено к элементу btnSave? Является ли это теперь зависающим обработчиком событий в кеше jQuery?

Если я попытаюсь удалить его, когда одна и та же страница загрузится снова, действительно ли она удалит исходное событие?

$('#btnSave').off('click', saveHandler); 

Выполняет ли следующий блок предотвращение утечки памяти/оборванных ссылок?

// The potential problem here is that btnSave is part of the newly loaded template 
// and not the element i attached the handler to earlier (which doesn't exist anymore) 
$('#btnSave').off('click', saveHandler); 

$('#btnSave').on('click', saveHandler); 

Каков наилучший способ гарантировать, что я не получаю оборванных ссылок и утечек памяти. Это потенциальный вопрос для простого javascript. Я понимаю, что приведенное выше не будет работать, когда страница шаблона будет обновлена. Я собираюсь экспериментировать с ним в то же время, но было бы неплохо узнать, как это делают специалисты. Благодаря!

+1

Я определенно использую 'off', а затем' on' справа после этого, как и вы. Но есть ли какой-либо возможный способ вызывать 'off' * before *, вы перезагружаете шаблон? – dthree

+0

Я думал об этом шаблоне в качестве решения, но я не уверен, что мне это нужно, поскольку jQuery может обрабатывать его внутренне.Если каждая страница реализовала интерфейс и после загрузки зарегистрировала себя как текущую страницу, тогда глобальный обработчик ссылок мог бы сделать что-то вроде app.cache.currentPage.cleanup(), в котором могли бы быть все пропуски. – theoutlander

+2

Я думаю, что вы правы в том, что он создает элемент-призрак, не делая этого ... – dthree

ответ

0

Когда вы загружаете новый tmpl, вам нужно прикрепить событие только для этого. Например:..

$ ("# btnSave", $ (newly_tmpl)) на ("клик", .....

1

Взгляните на этот слайд с Энди Osmani Javascript гуру Вы будете найти ответ на вопрос о утечке памяти и циклических ссылках здесь: https://speakerdeck.com/addyosmani/javascript-memory-management-masterclass

+0

Спасибо за сообщение. Отлично! Я знаком с инструментами памяти в хром-отладчике. В один из этих дней я попытаюсь найти время, чтобы профилировать его через профайлер памяти и раскрыть тайну. Еще одна вещь, которую я в конечном итоге сделаю, - это изучить источник jQuery. Я думаю, что легкое решение для этого было бы представить функциональность, которая позволяет передавать уникальный идентификатор при регистрации события, а внутренне jQuery может заменить существующий обработчик на новый. – theoutlander

0

Вместо крепления события нажатия на кнопку, вы должны прикрепить на функции щелчка по времени кнопки запуска после шаблона нагрузки, как этого

var element = $("<div id='tempDiv' class='main_container o-hidden'><button value='Click' id='btnSave'/></div>"); 

$("#btnSave",element).each(function(){ 
    $(this).attr("onclick","tryMe();"); 
}); 

It. добавит функцию tryMe click к вашему b utton, элементная переменная должна быть создана из вашего содержимого шаблона.

0

Почему бы не просто сделать его более делегированное событие и только зарегистрировать его один раз:

$(".someParentThatsAlwaysOnPage #btnSave").on("click", function() { 
    var somePage = getMeContextOfProperObject(); 
    somePage.saveHandler(); 
}); 

Таким образом, событие щелчка только один раз и связанного JQuery обновит сферу слушателя, как изменяется DOM. Все, что вам нужно сделать, это предоставить средства для получения надлежащего объекта. Не видя больше своего кода, я не могу вам помочь.

+0

Спасибо! Сохранить - просто пример. На большинстве страниц будут разные слушатели событий, основанные на их содержании. Ваше предложение хорошее, но оно работает только при наличии интерфейса, который может реализовать каждая страница. Тем не менее, это невозможно в этом случае, потому что страницы не имеют общего знаменателя после сохранения/отмены типа функциональности. – theoutlander

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