Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.04.2012, 19:14
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от 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?
Можете добавлять что угодно, все это будет появляться у элементов
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #12 (permalink)  
Старый 23.04.2012, 19:36
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

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

var evt = document.createEvent( 'Event' );
evt.initEvent( 'myevent', true, true );
document.dispatchEvent( evt );
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #13 (permalink)  
Старый 23.04.2012, 19:39
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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


Сообщение от devote
Сообщение от Octane
Может фейковый эвент инициировать, чтобы ошибка в listener'е не останавливала выполнение кода. Когда fireEvent ошибку выдаёт?
В смысле, не совсем понял вопроса.
Ну если в одном из listener'ов сделать throw, то последующие не выполнятся.
FTread, исполнение функций в отдельных потоках


Сообщение от devote
Сообщение от Octane
вообще нельзя в Element.prototype ничего добавить для IE7?
Можете добавлять что угодно, все это будет появляться у элементов
В IE7 ошибка будет, если метод добавлен в прототип, после того, как была получена ссылка на элемент.

Последний раз редактировалось Octane, 23.04.2012 в 19:47.
Ответить с цитированием
  #14 (permalink)  
Старый 23.04.2012, 19:46
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Octane
Ну если в одном из listener'ов сделать throw, то остальные тоже не выполнятся.
А понял о чем вы, да об этом я не думал, но думаю стоит добавить подобную возможность.
Сообщение от Octane
В IE7 ошибка будет, если метод добавлен в прототип, после того, как была получена ссылка на элемент.
Да в этом вы правы, к сожалению это я пока не поборол. Но тем не менее думаю стоит подумать как решить этот вопрос.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #15 (permalink)  
Старый 23.04.2012, 21:16
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от 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>
Все для вас, наслаждайтесь
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #16 (permalink)  
Старый 23.04.2012, 21:34
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

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

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

Последний раз редактировалось Octane, 23.04.2012 в 21:36.
Ответить с цитированием
  #17 (permalink)  
Старый 23.04.2012, 22:30
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от devote
Если у вас есть желание иметь какие-то возможности в ИЕ но их там нет, то можете внести свое предложение и я рассмотрю его в полной мере. Но методы должны входить в спецификацию w3c, то-есть писать левый функционал которого нет ни в одном браузере, в этой библиотеке я не планирую.
formData. Упоминать надеюсь не нужно, что это очень важный метод, даже если его вдруг нет в w3c спеке.
Если да, то я буду смотреть библиотеку, если нет, то я просто забуду что существовали ie6,7,8 и 9.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #18 (permalink)  
Старый 23.04.2012, 22:58
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Gozar
Если да, то я буду смотреть библиотеку, если нет, то я просто забуду что существовали ie6,7,8 и 9.
Да это имеют многие браузеры, поэтому этот вопрос я реализую, после того как прочту все тонкости этой возможности. Но обязательно выполню данную модель.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #19 (permalink)  
Старый 23.04.2012, 23:00
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Octane
не работает, потому что элемент не в дереве
да, я пока думаю над этим вопросом)
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #20 (permalink)  
Старый 23.04.2012, 23:29
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

примерно так получилось:
<!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>
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
Ответ



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

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