Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.03.2013, 17:47
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Проблемма с множественным срабатыванием на событие
В общем ситуация следующая, имеется страница, в которую посредством 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)
Ответить с цитированием
  #2 (permalink)  
Старый 19.03.2013, 19:17
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Документ во фрейме должен слушать событие unload и удалять обработчики. Хотя возможно события unload не возникнет. Впрочем его можно генерировать "вручную" перед удалением фрейма. Хотя наверно есть решение по-проще.
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2013, 13:06
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Не срабатывает оно при удалении фрейма...
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2013, 16:00
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Значит нужно генерить вручную. Или придумать другой способ нотификации фрейма об его удалении. Либо выставлять некий флаг и его проверять дабы не плодить обработчики.
Ответить с цитированием
  #5 (permalink)  
Старый 20.03.2013, 17:32
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

function Bla(){
// bla bla code
}

$(window.parent.document).on('click', '#blablaId', Bla);

...

$(window.parent.document).off('click', '#blablaId', Bla);
Ответить с цитированием
  #6 (permalink)  
Старый 20.03.2013, 18:42
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Суть в том что в коде навешивается обработчик события click на родительский документ. При выгрузке фрейма обработчик остается. При попытке off мы ничего не получим, ибо загружен уже новый объект jQuery и в его реестре нет старого обработчика данного обработчика. Возможно я ошибаюсь.
Ответить с цитированием
  #7 (permalink)  
Старый 21.03.2013, 10:35
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

Короче говоря выхода тут не нашлось, пришлось кастыли прикручивать и переносить некоторые в "родительский" код.
Где то нашел вариант с зачисткой с помощью смены src - в моём случае не помогло...

Всем спасибо за помощь, но если кто то найдет способ - пишите! Сам поэкспериментирую )
Ответить с цитированием
  #8 (permalink)  
Старый 21.03.2013, 11:10
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Keeper
Не срабатывает оно при удалении фрейма...
Где тестили?

<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>
Ответить с цитированием
  #9 (permalink)  
Старый 21.03.2013, 11:16
Аспирант
Отправить личное сообщение для Keeper Посмотреть профиль Найти все сообщения от Keeper
 
Регистрация: 28.04.2011
Сообщений: 73

danik.js Вы удалять пробовали iframe?
при замене контента то ясен пень будет ....
Ответить с цитированием
  #10 (permalink)  
Старый 21.03.2013, 11:44
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Keeper
Вы удалять пробовали iframe?
Как понять. Как удалять? Разве при очистке innerHTML он не удаляется?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно подавить событие при подключении своего обработчика? Маэстро Firefox/Mozilla 2 03.09.2011 11:46
Отловить событие simple Events/DOM/Window 3 11.05.2011 14:20
событие onclick chelsea Общие вопросы Javascript 1 17.09.2010 11:31
вызвать принудительно событие olgatcpip Общие вопросы Javascript 5 13.11.2009 11:07
какое событие возникает во время формирования html IT-AleX Events/DOM/Window 2 20.02.2009 16:13