Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   spike - библиотека внедряет W3C-шные методы в IE (https://javascript.ru/forum/project/27728-spike-biblioteka-vnedryaet-w3c-shnye-metody-v-ie.html)

devote 23.04.2012 19:14

Цитата:

Сообщение от Octane
глядя на код я не понял, как узнать, что bubbling фаза закончилась и пора её в обратном порядке запускать.

попытаюсь объяснить.
При навешивании событий на какой либо элемент при помощи addEventListener моя библиотека смотрит, есть ли у нее уже навешанное такое событие на верхний элемент(document) если видит проверка дала отрицательный результат, то она тоже навешивает такое же событие на на самый верхний элемент(document) то-есть раньше чем то что навешивает разработчик. То-есть получается что событие в библиотеке повешено самым первым, что и дает возможность узнать что фаза bubbling закончилась.

К примеру вы где-то в своем коде пишите:
<div id="lala"></div>
<script>
    document.getElementById('lala').addEventListener( 'click', function( e ) {
        // здесь не нужно обращаться к window.event
        // первый параметр вернет этот же объект но с исправлениями
        // и дополнительными методами
        alert( e ); // [object Event]
    }, true );
</script>
по сути обычное действие.
Далее при вызове метода addEventListener моя библиотека делает действия примерно в таком порядке:

ищет у себя в стеке уже про инициализированный планировщик на это событие.

если находит, то просто вешает событие через attachEvent при этом обертывая вызов функции что передали вторым аргументом в некий прокси метод, который и будет вызван при клике. Если не находит, то создает планировщик для этого события. В нашем случае это click и слушает самый верхний элемент документа.

Далее при срабатывании события вызываются прокси метод, на элементе получившем событие, а тот в свою очередь кладет элемент в стек, что бы потом планировщик с ним далее мог работать.

Самым последним получает событие сам верний элемент и в нашем случае тот самый планировщик, так как планировщик был повешен самым первым и поэтому срабатывает самым последним, то-есть он точно знает что за ним более нет слушателей.

Ну а потом планировщик уже обрабатывает тот самый кеш, то-есть в кеше лежит список элементов которые должны получить событие. Вот по этим элементам он и проходит обрабатывая при этом результативные значения, такие как stopPropagation, preventDefault и т.д. А после окончания обработки, очищает кеш для следующего наполнения по событию.

Цитата:

Сообщение от Octane
Если не срабатывает fireEvent, то listener'ы запускаются синхронно?

Да, синхронно, собственно так же как и в случае корректного срабатывания fireEvent.

Цитата:

Сообщение от Octane
Может фейковый эвент инициировать, чтобы ошибка в listener'е не останавливала выполнение кода. Когда fireEvent ошибку выдаёт?

В смысле, не совсем понял вопроса.

Цитата:

Сообщение от Octane
В фазе capturing не имеет смысла обращаться к window.event, чтобы достать дополнительную информацию?

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

Цитата:

Сообщение от Octane
вообще нельзя в Element.prototype ничего добавить для IE7?

Можете добавлять что угодно, все это будет появляться у элементов

devote 23.04.2012 19:36

Цитата:

Сообщение от Octane
Может фейковый эвент инициировать, чтобы ошибка в listener'е не останавливала выполнение кода. Когда fireEvent ошибку выдаёт?

А примерно понял о чем речь, вы имеете ввиду есть ли возможность инициировать собственные события? Если да, то конечно можете создавать свои собственные события и получать нужный результат.

Конструкция вроде этой будет корректно работать:
document.addEventListener( 'myevent', function(){
    alert( 'fired myevent' );
}, false );

var evt = document.createEvent( 'Event' );
evt.initEvent( 'myevent', true, true );
document.dispatchEvent( evt );

Octane 23.04.2012 19:39

Цитата:

Сообщение от devote
навешанное такое событие на верхний элемент(document)

Спасибо, теперь понятно.


Цитата:

Сообщение от devote
Цитата:

Сообщение от Octane
Может фейковый эвент инициировать, чтобы ошибка в listener'е не останавливала выполнение кода. Когда fireEvent ошибку выдаёт?

В смысле, не совсем понял вопроса.

Ну если в одном из listener'ов сделать throw, то последующие не выполнятся.
http://javascript.ru/forum/project/7...-potokakh.html


Цитата:

Сообщение от devote
Цитата:

Сообщение от Octane
вообще нельзя в Element.prototype ничего добавить для IE7?

Можете добавлять что угодно, все это будет появляться у элементов

В IE7 ошибка будет, если метод добавлен в прототип, после того, как была получена ссылка на элемент.

devote 23.04.2012 19:46

Цитата:

Сообщение от Octane
Ну если в одном из listener'ов сделать throw, то остальные тоже не выполнятся.

А понял о чем вы, да об этом я не думал, но думаю стоит добавить подобную возможность.
Цитата:

Сообщение от Octane
В IE7 ошибка будет, если метод добавлен в прототип, после того, как была получена ссылка на элемент.

Да в этом вы правы, к сожалению это я пока не поборол. Но тем не менее думаю стоит подумать как решить этот вопрос.

devote 23.04.2012 21:16

Цитата:

Сообщение от Octane
В IE7 ошибка будет, если метод добавлен в прототип, после того, как была получена ссылка на элемент.

Теперь не будет ошибки, сделал теперь конструкция типо этой будет работать корректно:
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="https://raw.github.com/devote/spike/master/spike.min.js"></script>
    </head>
    <body>
        <div id="blah"></div>
        <script type="text/javascript">
            // получаем ссылку на элемент
            var a = document.getElementById( "blah" );

            // создаем новый прототип уже после того как получили ссылку на  элемент
            Element.prototype.testNewProto = function() { alert( 'lalalalalala' ) }

            // выполняем наш новый метод
            a.testNewProto();
        </script>
    </body>
</html>
Все для вас, наслаждайтесь :)

Octane 23.04.2012 21:34

для
var a = document.*!*createElement( "div" )*/!*;
Element.prototype.testNewProto = function() { alert( 'lalalalalala' ) }
a.testNewProto();

не работает, потому что элемент не в дереве

Gozar 23.04.2012 22:30

Цитата:

Сообщение от devote
Если у вас есть желание иметь какие-то возможности в ИЕ но их там нет, то можете внести свое предложение и я рассмотрю его в полной мере. Но методы должны входить в спецификацию w3c, то-есть писать левый функционал которого нет ни в одном браузере, в этой библиотеке я не планирую.

formData. Упоминать надеюсь не нужно, что это очень важный метод, даже если его вдруг нет в w3c спеке.
Если да, то я буду смотреть библиотеку, если нет, то я просто забуду что существовали ie6,7,8 и 9. :)

devote 23.04.2012 22:58

Цитата:

Сообщение от Gozar
Если да, то я буду смотреть библиотеку, если нет, то я просто забуду что существовали ie6,7,8 и 9.

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

devote 23.04.2012 23:00

Цитата:

Сообщение от Octane
не работает, потому что элемент не в дереве

да, я пока думаю над этим вопросом)

devote 23.04.2012 23:29

примерно так получилось:
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="https://raw.github.com/devote/spike/master/spike.min.js"></script>
    </head>
    <body>
        <div id="blah"></div>
        <script type="text/javascript">
            // создаем элемент
            var div = document.createElement( "div" );
 
            // создаем новый прототип уже после того как получили ссылку на  элемент
            Element.prototype.testNewProto = function() {
                alert( 'lalalalalala' );
                this.innerHTML = "hehe";
                document.body.appendChild( this );
            }
 
            // выполняем наш новый метод
            div.testNewProto();
        </script>
    </body>
</html>


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