Проблемма с множественным срабатыванием на событие
В общем ситуация следующая, имеется страница, в которую посредством 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?
при замене контента то ясен пень будет .... |
Цитата:
|
Тьфу, перепутал всё. Код то в родительском окне работает, а задача была реализовать всё внутрях iframe.
|
Так ведь событие срабатывает во фрейме. Я даже в комменте написал что этот код нужно расположить внутри фрейма. Странный вы человек. Просите предожить вариант, обещаете сами разобраться, а в итоге приходится чуть ли не силой все втолковывать.
|
Я нашел для себя решение, когда будет время разберусь с подробнее...
А у вас весь код на родительском исполняется. Не заметили, не? Бинды в родительском и т.д. у меня цель была, еще раз объясняю - внутри! Так что не я тут странный... |
Цитата:
Еще раз (последний!): Событие возникает внутри фрейма!!!!!!!!!! <body> <button id="cleaner">Удалить содержимое</button> <div id="container"><iframe id="iframe"></iframe></div> <div id="message"></div> <script> // пишем во фрейм. В реале писать ничего не надо, а нужно просто разместить нужный код в самом документе фрейма. var frameContent = '<script>onunload = function(){ parent.message.innerHTML = "Я фрейм блеядь!!! И это событие во фрейме!!!!!!!!!!!" }</' + 'script>'; iframe.document.open(); iframe.document.write(frameContent); iframe.document.close(); cleaner.onclick = function() { alert('Ща удаляем innerHTML'); container.innerHTML = ''; } </script> </body> Так понятнее? Тут дело не в странности, а в знаниях. Если у вас их недостаточно прислушивайтесь к тем, у кого они есть,а не тупо спорьте. |
Я не собираюсь мериться знаниями в js c вами, у меня их достаточно.
А в ответах я ориентировался на приведенном у вас коде, так что вытрите пену сударь и пожалуй закроем вопрос ... Мы просто друг друга не поняли ... ) |
Цитата:
Цитата:
Я ведь писал: Цитата:
|
danik.js, моё призвание за рамками вашей компетенции ...
На подобных форумах крайне редко бываю, работы много да и не нуждаюсь в подпитке профессионального эго. Спасибо за пожелания, и вам всего хорошего ) |
Часовой пояс GMT +3, время: 20:11. |