Javascript.RU

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

spike - библиотека внедряет W3C-шные методы в IE
Снова всем привет, хочу представить вам новую свою разработку.

Данная библиотека предназначена именно для Internet Explorer 6,7,8 а в дальнейшем возможно будет что-то добавлять и в IE9.

Скажу сразу, поддержку IE6 я не планировал, но реализация привела к тому что она очень даже хорошо работает в IE6, так что уж не обессудьте.

Что именно делает эта библиотека, а делает она очень простые вещи. Добавляет W3C-шные методы в ослобраузер, такие как addEventListener, querySelector и т.д.

Каждая реализация, а точнее модель разделена и при необходимости легко извлекается. То-есть библиотеку вы можете построить самостоятельно. Об этом чуть ниже.

DOM Element.prototype:

В IE7 и ниже нет возможности расширять элементы новыми прототипами, которые мы хотим делегировать всем элементам, для этого я написал небольшую модель для ее эмуляции в IE<8. Теперь она дает возможность нам расширить элементы своими методами.

Вот ниже один из способов будет корректно работать в IE 7-ой версии и ниже:
var div = document.createElement( 'div' );
Element.prototype.ourNewMethod = function() {
    alert( 'Привет мир!' )
}
div.ourNewMethod(); // alerts 'Привет мир!'
и другие вариации которые вам придут в голову.

Методы которые добавляет данная библиотека:

.addEventListener
полная поддержка событий, включая возможность ловить события во время погружения, то-есть третий параметр метода не бездействует.
.removeEventListener
полная поддержка удаления событий, так же удаляет в зависимости от типа фазы распространения.
.dispatchEvent
полная поддержка ручного запуска события.
document.createEvent
частичная поддержка создания событий, поддерживает события только DOM Level 2, то-есть Event, CustomEvent, UIEvent, MouseEvent. В дальнейшем возможно будет расширена.
Полная поддержка экземпляра события, поддерживает такие методы как:

.preventDefault()
отменить действие по умолчанию.
.stopPropagation()
прервать событие на следующей фазе или другом элементе.
.stopImmediatePropagation()
полная остановка распространение события. (новое в HTML5)
и прочие свойства экземпляра события по требованиям DOM Level 2

Так же присутствуют константы указывающие тип фазы:
Event.CAPTURING_PHASE
Event.AT_TARGET
Event.BUBBLING_PHASE

Селекторы:

.querySelectorAll
полный CSS3 селектор для поиска списка элементов, в IE8 добавляет поддержку только тех селекторов которые не имеет нативный метод.
.querySelector
полный CSS3 селектор для поиска одного элемента
.getElementsByClassName
полная поддержка поиска по классу элемента, так же можно указывать список классов которые обязательно должны будут присутствовать в искомом элементе
.matchesSelector
полный CSS3 селектор для проверки элемента
Все это на данный момент работает в IE 6,7,8. Жестких тестов не проводил, но во время разработки тесты дали положительный результат. Если будет желание потестить, или найдете ошибку, сообщайте мне и я от нее немедленно избавлюсь.

Все это добро вы как всегда можете найти у меня на гитхабе: https://github.com/devote/spike

Файлы в корне это собранная библиотека из трех моделей, сами модели вы можете найти в папке models.
element.js - нужен для IE ниже 8-й версии, подключать самым первым
events.js - модель событий
selectors.js - модель селекторов
Постепенно я буду дополнять дополнительные модели, если у вас есть пожелания по написанию моделей я с удовольствием выслушаю.

Всем приятной разработки скриптов с мыслью о нормальной кросс-браузерности. Спасибо за внимание!

С Уважением, Дмитрий!

PS. Не забываем фоловится на гитхабе
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 28.05.2012 в 09:42.
Ответить с цитированием
  #2 (permalink)  
Старый 23.04.2012, 03:30
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Если я правильно понял, то Element.prototype хранилище методов, ссылки на которые копируются в каждый элемент при вызове одного из добавленных или перезаписанных методов типа createElement, а еще после загрузки документа выполняется такое копирование для всех найденных элементов? Я ожидал какую-нибудь магию с VB-скриптми и htc-файлами


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

Сообщение от Octane
Я ожидал какую-нибудь магию с VB-скриптми и htc-файлами
Да заманчиво Но я пока не думал над этим что бы сделать это через VBScript но htc юзать не хочу.

Сообщение от Octane
Расскажи, пожалуйста, как реализуется event capturing.
Система особо не сложная, все события проходят через прокси метод, который ловит все события до самого верхнего элемента при этом пропуская событие дальше по цепи, а затем получив последнее событие на текущем распространении, запускает уже оригинальные методы, те что были изначально повешены.

Картина примерно такая:

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

Мда, объясняющий с меня херовый конечно
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

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

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

devote,
Я правильно понял, что Element.prototype теперь работает?

P.S. Да, ещё можно добавить полную поддержку getComputedStyle.
P.P.S. Ещё идея, можно добавить геттеры-сеттеры

Последний раз редактировалось Раед, 23.04.2012 в 15:57. Причина: P.S. Да, ещё можно добавить полную поддержку getComputedStyle. P.P.S. Ещё идея, можно добавить геттеры-сеттеры
Ответить с цитированием
  #6 (permalink)  
Старый 23.04.2012, 16:01
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Раед
devote,
Я правильно понял, что Element.prototype теперь работает?
Можно сказать да

Сообщение от Раед
P.S. Да, ещё можно добавить полную поддержку getComputedStyle.
Думаю это есть возможность добавить.

Сообщение от Раед
P.P.S. Ещё идея, можно добавить геттеры-сеттеры
Насчет геттеров/сеттеров боюсь они будут не полными, то-есть причину думаю вам объяснять не нужно. А не полная реализация не есть хорошо, она не должна ограничивать то что всегда было разрешено делать.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #7 (permalink)  
Старый 23.04.2012, 16:04
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от devote
А не полная реализация не есть хорошо, она не должна ограничивать то что всегда было разрешено делать.
Чуть-чуть лучше, чем ничего.
Ответить с цитированием
  #8 (permalink)  
Старый 23.04.2012, 16:12
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Раед
Чуть-чуть лучше, чем ничего.
лучше когда она просто что-то не умеет, но увы реализация аксессоров в ИЕ приводит не к тому что она просто что-то не умеет, но и к тому что появляется ограничение, довольно таки важное. Это возможность расширить объект, дополнить новыми свойствами. И это огромное ограничение.

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

Хочу отметить важное замечание, метод .getElementsByClassName реализован полностью по указаниям спецификации, то-есть все реализации лежащие по инету не правильные, и сделаны из-за невнимательности прочтения документа.

Как работает метод, который все выкладывают по инету:
допустим мы хотим найти элемент с классом .blah
document.getElementsByClassName( 'blah' ); // все как и везде
Но если указать список классов:
document.getElementsByClassName( 'blah lala' );
То в этом случае реализации кишащие по инету выдадут все элементы с классом .blah и элементы с классом .lala то-есть:
<div class="blah"></div>
<div class="lala"></div>
Найдет оба элемента, так как они удовлетворяют запросам.

Как же все таки реально должен работать этот метод, то-есть как описано в спецификации. При попытке искать со списком классов, то-есть у нас есть HTML:
<div class="blah"></div>
<div class="lala"></div>
и мы пытаемся найти элементы:
document.getElementsByClassName( 'blah lala' );
Нам метод не выдаст ни одного элемента, потому что по критериям не проходят. Отличия тут таковы, что список этих классов должен иметь один и тот-же элемент, если хоть одного класса в элементе нет, то он пропускается. То-есть наш код найдет элемент например вот такой:
<div class="lala blah"></div>
или такой:
<div class="lala test some blah"></div>

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

Сообщение от devote
все события проходят через прокси метод, который ловит все события до самого верхнего элемента…
Ну это я догадался, глядя на код я не понял, как узнать, что bubbling фаза закончилась и пора её в обратном порядке запускать.

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

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

А еще стоит отметить, что добавление методов в Element.prototype для IE7 нужно делать до подключения spike.js вообще нельзя в Element.prototype ничего добавить для IE7?

Последний раз редактировалось Octane, 23.04.2012 в 18:52.
Ответить с цитированием
Ответ



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

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