Проблемма с множественным срабатыванием на событие
В общем ситуация следующая, имеется страница, в которую посредством ajax запросов и jTemplate вставляются разнообразные html шаблончики...
Среди них имеется один с встроенным iframe, внутри которого грузится файлик со скриптами... в них есть код типа
$(window.parent.document).on('click', '#blablaId', function(){
// bla bla code
});
Странички периодически меняются, но есть шанс, что эта (с iframe) будет загружаться несколько раз, соответственно скрипты внутри срабатывают при каждой загрузке и в итоге при нажатии на какую нибудь кнопку идет допустим тройное выполнение "bla bla code". Пробовал разное... При каждой загрузке всё начинается с:
$(window.parent.document).off('click', '#blablaId');
фигня, не помогает ... В родительском окне хранится индикатор, загружался ли ифрейм до этого ... - перестает вообще работать (я так понимаю новое же пространство создается в iframe каждый раз) Мозг крошится... может кто подскажет как тут быть? (jQuery 1.7.2) |
Документ во фрейме должен слушать событие unload и удалять обработчики. Хотя возможно события unload не возникнет. Впрочем его можно генерировать "вручную" перед удалением фрейма. Хотя наверно есть решение по-проще.
|
Не срабатывает оно при удалении фрейма...
|
Значит нужно генерить вручную. Или придумать другой способ нотификации фрейма об его удалении. Либо выставлять некий флаг и его проверять дабы не плодить обработчики.
|
function Bla(){
// bla bla code
}
$(window.parent.document).on('click', '#blablaId', Bla);
...
$(window.parent.document).off('click', '#blablaId', Bla);
|
Суть в том что в коде навешивается обработчик события click на родительский документ. При выгрузке фрейма обработчик остается. При попытке off мы ничего не получим, ибо загружен уже новый объект jQuery и в его реестре нет старого обработчика данного обработчика. Возможно я ошибаюсь.
|
Короче говоря выхода тут не нашлось, пришлось кастыли прикручивать и переносить некоторые в "родительский" код.
Где то нашел вариант с зачисткой с помощью смены src - в моём случае не помогло... Всем спасибо за помощь, но если кто то найдет способ - пишите! Сам поэкспериментирую ) |
Цитата:
<script>
function onFrameLoaded (frame) {
alert('Фрейм загрузился');
message.innerHTML = '';
frame.contentWindow.document.body.innerHTML = 'Содержимое фрейма';
// обработчик должен навешиваться самим фреймом, это просто для демонстрации.
frame.contentWindow.onunload = function() {
// alert будет заблокирован, так что выводим сообщение другим способом.
message.innerHTML = 'onunload! Выгрузка фрейма, подчищаем за собой(удаляем обработчики и прочее)';
}
}
</script>
<body>
<button id="loader">Обновить HTML</button>
<div id="container"></div>
<div id="message"></div>
<script>
var html = '<iframe onload="onFrameLoaded(this)" src="/"></iframe>';
loader.onclick = function() {
alert('Ща обновляем innerHTML');
container.innerHTML = html;
}
</script>
</body>
|
danik.js Вы удалять пробовали iframe?
при замене контента то ясен пень будет .... |
Цитата:
|
| Часовой пояс GMT +3, время: 04:31. |