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 29.05.2012 00:34

Цитата:

Сообщение от Раед
Это я знаю. Вы лучше скажите, чего там нет, что вы с таким упорством пытаетесь присабачить туда createComment?

а все очень просто, я могу добавить атрибут элементу иначе, или организовать поиск по атрибуту. А твой вариант не ставит и не удаляет атрибуты с data-* если их присваивать обычным способом:
el.dataset.test = 1;
то есть при таком вызове у элемента должен появится атрибут data-test="1"

devote 29.05.2012 00:36

Цитата:

Сообщение от Раед
в вашем примере (new Data) .constructor !== Data

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

FINoM 29.05.2012 03:05

Цитата:

Сообщение от devote
data.y = 5 // херов а не алерт :(

Блин. Что-то я совершенно не вижу логики.

FINoM 29.05.2012 03:08

Цитата:

Сообщение от devote
и да добавлю, алерт срабатывает не при назначении свойства x а при назначении

Перефразируй, пожалуйста.

FINoM 29.05.2012 03:23

Цитата:

Сообщение от devote
и да добавлю, алерт срабатывает не при назначении свойства x а при назначении

Теперь понял. Надо было это проверить с самого начала.

B~Vladi 29.05.2012 08:48

devote, FINoM, у вас конструктор возвращает объект, который никак не связан ни с Data.prototype ни с comment. Я хз почему срабатывает alert, но вы точно что-то делаете не так.

Раед 29.05.2012 09:32

Цитата:

Сообщение от B~Vladi
devote, FINoM, у вас конструктор возвращает объект, который никак не связан ни с Data.prototype ни с comment.

Я уже сказал это, но немного подругому
Цитата:

Сообщение от Раед
devote,
в вашем примере (new Data) .constructor !== Data


B~Vladi 29.05.2012 11:02

Цитата:

Сообщение от Раед
Я уже сказал это, но немного подругому

Я это видел, но походу тебя не поняли они.

B~Vladi 29.05.2012 11:08

Ну я же говорил, что не правильно:
comment = document.createComment("");

document.documentElement.firstChild.appendChild(comment);


comment.onpropertychange = function () {
	alert() // алерт, ептеть
}

devote 29.05.2012 11:54

Цитата:

Сообщение от B~Vladi
Ну я же говорил, что не правильно:

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

B~Vladi 29.05.2012 12:01

Цитата:

Сообщение от devote
меня как будто не услышали

Ой, прости, наверно не до понял :)

devote 29.05.2012 12:04

Цитата:

Сообщение от B~Vladi
Ой, прости, наверно не до понял

да, наверно мне нужно русский выучить получше :D

devote 03.06.2012 19:43

melky,
опробовал я твой вариант тот что ты указал в посте для мелких сайтов он конечно норм, но вот при большом количестве элементов на странице чуствуется довольно таки огромное падение производительности. Так как браузер перерисовывает документ при любых манипуляциях со стилями, даже если такого свойства нет в CSS то он вызывает все равно перерисовку.
Я вот накидал примерный селектор:
(function( window ){

	var stylesheet = document.createStyleSheet();

	function qSelector( selector ) {

		var elem, index = 0, result = [];

		if ( stylesheet.lastSelector !== selector ) {
			stylesheet.cssText = selector + "{testNativeSelector:1}";
			stylesheet.lastSelector = selector;
		}

		if ( stylesheet.rules.length && stylesheet.rules[ 0 ].selectorText !== "UNKNOWN" ) {

			var elems = document.getElementsByTagName( "*" );

			for( ;elem = elems[ index++ ]; ) {
				if ( elem.currentStyle.testNativeSelector ) {
					result[ result.length ] = elem;
				}
			}
		} else {
			throw new Error( "Syntax error: " + selector );
		}

		return result;
	}

	window.qSelector = qSelector;

})( window );
можешь потестить, при 2000 элементов на странице, задержка на 2-3 сек в ИЕ7 и 1-2 сек в ИЕ8

melky 03.06.2012 20:15

Цитата:

Сообщение от devote
можешь потестить, при 2000 элементов на странице, задержка на 2-3 сек в ИЕ7 и 1-2 сек в ИЕ8

Само собой она будет. Скрипт же просто все элементы обходит.

Конечно, не панацея, но для "минимума" подойдёт. Я этот метод использовал как костыль matchesSelector.

FINoM 03.06.2012 20:22

Цитата:

Сообщение от melky
Я этот метод использовал как костыль matchesSelector.

Ёпт, умно.

melky 03.06.2012 20:41

FINoM, ?

FINoM 03.06.2012 20:42

melky, я не догадался эту особенность IE так использовать.

devote 03.06.2012 21:05

Цитата:

Сообщение от melky
Скрипт же просто все элементы обходит.

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

viktorina 06.01.2013 17:22

То есть спайк - это кроссбраузерные события, кроссбраузерный qSA?

devote 06.01.2013 18:22

Цитата:

Сообщение от viktorina
То есть спайк - это кроссбраузерные события, кроссбраузерный qSA?

да именно, вот это будет работать и в ИЕ с библиотекой spike:
<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="http://code.spb-piksel.ru/spike.min.js"></script>
    </head>
    <body>
        <div id="mydiv" style="width: 100px; height: 100px; background: #00ff00">Кликни по мне</div>

        <script type="text/javascript">
            document.querySelector('#mydiv').addEventListener('click', function(e) {
                alert("кликнули по элементу: " + e.target);
            }, false);
        </script>
    </body>
</html>

viktorina 06.01.2013 19:28

И ещё вопрос:)
Вот тут http://javascript.ru/tutorial/events/crossbrowser я взял когда-то готовый скрипт и пользовался. используя спайк он мне больше не нужен?

devote 06.01.2013 19:46

Цитата:

Сообщение от viktorina
используя спайк он мне больше не нужен?

да не нужен, достаточно использовать addEventListener/removeEventListener/dispatchEvent

viktorina 06.01.2013 20:44

Цитата:

Сообщение от devote
да не нужен, достаточно использовать addEventListener/removeEventListener/dispatchEvent

Агааааа.....:), спасибо:)

viktorina 11.01.2013 14:30

Не знаю, является ли это багом, но вот какая ситуация:

если подключить спайк после кода
function obj(){}
obj.prototype.f1 = function(){alert("'привет")}
obj.prototype.f2 = function(){alert("'привет")}
obj.prototype.f3 = function(){alert("'привет")}

То срабатывает функция f3 сама по себе.
Короче последняя добавленная в прототип функция.
Подключать надо самым первым, тогда всё в порядке. Но... чё это она срабатывает?

devote 11.01.2013 16:22

хм.. как так? библиотека функции не трогает, зачем ей это...

может что-то другое у вас происходит? пройдитесь отладчиком, или дайте тест, киньте пример на какой нить хост и я посмотрю.

viktorina 11.01.2013 16:44

Цитата:

Сообщение от devote
дайте тест, киньте пример на какой нить хост и я посмотрю.

http://jru-framework.ru/spike-bag/index.php

FINoM 11.01.2013 16:48

Подозреваю, что вызывается функция:
a.prototype.f = function(){alert("asdasd")}

(function(e,m){...



То же самое, что и:
a.prototype.f = function(){alert("asdasd")}(function(e,m){...


Просто поставьте точку с запятой после объявления.
a.prototype.f = function(){alert("asdasd")};

viktorina 11.01.2013 16:52

FINoM,
:)) Вчера читал статью о таких ошибках и думал "да кому это надо, все и так знают"...
ыы
Спасибо:)

devote 11.01.2013 16:52

Цитата:

Сообщение от FINoM
Подозреваю, что вызывается функция:

очень интересно, библиотека же в другом файле, как она может реагировать? загадка.

FINoM 11.01.2013 16:55

Цитата:

Сообщение от devote
библиотека же в другом файле

На момент моего ответа она была там же, где и проблемный код.

viktorina 11.01.2013 16:57

Цитата:

Сообщение от devote
очень интересно, библиотека же в другом файле, как она может реагировать? загадка.

Всё в одном файле. Точка с запятой всё решили.

devote 11.01.2013 17:02

Цитата:

Сообщение от viktorina
Всё в одном файле.

ааа... вы решили свой скрипт добавить внутрь библиотеки, тогда понятно.

viktorina 11.01.2013 21:23

А как отменить событие по умолчанию?
element.onclick = function(event) {
    event = event || window.event 
    if (event.preventDefault) {
        event.preventDefault()
    } else {
        event.returnValue = false
    }
}

теперь хватит и этого ?
event.preventDefault()

devote 11.01.2013 21:40

Цитата:

Сообщение от viktorina
теперь хватит и этого ?
event.preventDefault()

Для такой конструкции, нет не хватит:
element.onclick = function(event) {
    event = event || window.event 
    if (event.preventDefault) {
        event.preventDefault()
    } else {
        event.returnValue = false
    }
}

А вот для такой конструкции, да хватает только event.preventDefault():
element.addEventListener('click', function(event) {
    event.preventDefault()
}, false);


Библиотека не знает ничего о функциях, которые повешаны на события элементов напрямую через атрибут. Поэтому там все по старинке.

viktorina 12.01.2013 01:53

devote,
Всё настроил работает везде:), очень рад.
А нет ничего подобного по кроссбраузерному ajax?

melky 12.01.2013 10:01

Цитата:

Сообщение от viktorina
А нет ничего подобного по кроссбраузерному ajax?

так он и так везде один.

viktorina 12.01.2013 12:54

Цитата:

Сообщение от melky
так он и так везде один.

Ну javascript тоже везде один:)
Неужели не понятно, что я имел ввиду?:)
А ещё было бы классно отправка файлов в фреймворке.

melky 12.01.2013 20:18

Цитата:

Сообщение от viktorina (Сообщение 226824)
Ну javascript тоже везде один:)
Неужели не понятно, что я имел ввиду?:)
А ещё было бы классно отправка файлов в фреймворке.

а, ну так это уже AJAX 2 :)

это можно, с флешевым приложением. в тырнете есть такие костыли.

ждём, может быть разработчик займётся этим

viktorina 13.01.2013 16:21

Как быть с событиями oncontextmenu onscroll onmousewheel ?
Они в ие отказываются сотрудничать со мной....

devote 13.01.2013 16:33

Цитата:

Сообщение от viktorina
Как быть с событиями oncontextmenu onscroll onmousewheel ?
Они в ие отказываются сотрудничать со мной....

странно что не пашут.. хотя должно.. Но я взгляну позже на это. Как только полегче станет (Я заболел). Надеюсь не торопит это?


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