Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проблемма с множественным срабатыванием на событие (https://javascript.ru/forum/jquery/36558-problemma-s-mnozhestvennym-srabatyvaniem-na-sobytie.html)

Keeper 19.03.2013 17:47

Проблемма с множественным срабатыванием на событие
 
В общем ситуация следующая, имеется страница, в которую посредством 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)

danik.js 19.03.2013 19:17

Документ во фрейме должен слушать событие unload и удалять обработчики. Хотя возможно события unload не возникнет. Впрочем его можно генерировать "вручную" перед удалением фрейма. Хотя наверно есть решение по-проще.

Keeper 20.03.2013 13:06

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

danik.js 20.03.2013 16:00

Значит нужно генерить вручную. Или придумать другой способ нотификации фрейма об его удалении. Либо выставлять некий флаг и его проверять дабы не плодить обработчики.

zilker 20.03.2013 17:32

function Bla(){
// bla bla code
}

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

...

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

danik.js 20.03.2013 18:42

Суть в том что в коде навешивается обработчик события click на родительский документ. При выгрузке фрейма обработчик остается. При попытке off мы ничего не получим, ибо загружен уже новый объект jQuery и в его реестре нет старого обработчика данного обработчика. Возможно я ошибаюсь.

Keeper 21.03.2013 10:35

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

Всем спасибо за помощь, но если кто то найдет способ - пишите! Сам поэкспериментирую )

danik.js 21.03.2013 11:10

Цитата:

Сообщение от 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>

Keeper 21.03.2013 11:16

danik.js Вы удалять пробовали iframe?
при замене контента то ясен пень будет ....

danik.js 21.03.2013 11:44

Цитата:

Сообщение от Keeper
Вы удалять пробовали iframe?

Как понять. Как удалять? Разве при очистке innerHTML он не удаляется?

Keeper 21.03.2013 12:14

Тьфу, перепутал всё. Код то в родительском окне работает, а задача была реализовать всё внутрях iframe.

danik.js 21.03.2013 13:58

Так ведь событие срабатывает во фрейме. Я даже в комменте написал что этот код нужно расположить внутри фрейма. Странный вы человек. Просите предожить вариант, обещаете сами разобраться, а в итоге приходится чуть ли не силой все втолковывать.

Keeper 21.03.2013 14:04

Я нашел для себя решение, когда будет время разберусь с подробнее...
А у вас весь код на родительском исполняется. Не заметили, не?

Бинды в родительском и т.д.
у меня цель была, еще раз объясняю - внутри! Так что не я тут странный...

danik.js 21.03.2013 14:29

Цитата:

Сообщение от Keeper
А у вас весь код на родительском исполняется. Не заметили, не?

Сорри, но у меня нет доступа к серверу lookatcode.com если вы не вкурсе. Поэтому я не могу разместить этот код во фрейме.
Еще раз (последний!): Событие возникает внутри фрейма!!!!!!!!!!
<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>


Так понятнее? Тут дело не в странности, а в знаниях. Если у вас их недостаточно прислушивайтесь к тем, у кого они есть,а не тупо спорьте.

Keeper 21.03.2013 14:58

Я не собираюсь мериться знаниями в js c вами, у меня их достаточно.
А в ответах я ориентировался на приведенном у вас коде, так что вытрите пену сударь и пожалуй закроем вопрос ... Мы просто друг друга не поняли ... )

danik.js 21.03.2013 15:08

Цитата:

Сообщение от Keeper
я ориентировался на приведенном у вас коде

В том то и дело что вы не ориентируетесь в коде ))
Цитата:

Сообщение от Keeper
у меня их достаточно

Ага. И этот топик тому подтверждение ))
Я ведь писал:
Цитата:

Сообщение от danik.js
Так ведь событие срабатывает во фрейме

Ну что тут непонятно то было. Ок, костыли - ваше призвание. Желаю удачи )

Keeper 21.03.2013 16:37

danik.js, моё призвание за рамками вашей компетенции ...
На подобных форумах крайне редко бываю, работы много да и не нуждаюсь в подпитке профессионального эго.
Спасибо за пожелания, и вам всего хорошего )


Часовой пояс GMT +3, время: 20:11.