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)

Раед 24.05.2012 12:10

Цитата:

Сообщение от melky
Devote, вы знаете такой способ? для IE. правда, ограничен возможностями CSS-движка.

melky,
http://javascript.ru/forum/project/1...elektorov.html

melky 24.05.2012 12:12

Цитата:

Сообщение от Раед (Сообщение 176340)

в моем примере вообще другая идея. там свойство a, а его значение - b, т.е. несуществующие.
и работать оно будет только в IE - обычно браузеры не устанавливают неправильные css-свойства.

Раед 24.05.2012 12:22

Цитата:

Сообщение от melky
в моем примере вообще другая идея.

Принцип тот же. И ограничения на селектор те же

melky 24.05.2012 12:24

Цитата:

Сообщение от Раед (Сообщение 176344)
Принцип тот же. И ограничения на селектор те же

его код не будет искать элементы, у которых z-index установлен в element.style, или же в таблице стилей, где правило для элемента имеет бОльший приоритет, чем переданный на поиск элементов селектор.

ограничения - это да.

Раед 24.05.2012 13:00

Цитата:

Сообщение от melky
его код не будет искать элементы, у которых z-index установлен в element.style, или же в таблице стилей, где правило для элемента имеет бОльший приоритет, чем переданный на поиск элементов селектор.

Это ясно

FINoM 28.05.2012 04:06

Звучит очень круто. У меня тоже возникала такая идея, но не знал с какой стороны к ней подойти. Не хочешь сделать свою либу не только с DOM методами, но и JS методами (Array.prototype.forEach, Function.prototype.bind например)?
Element.prototype = proto = document.createComment( "" );

		proto.attachEvent( 'onpropertychange', function() {
Офигеть. Гениально.

devote 28.05.2012 09:37

Цитата:

Сообщение от FINoM
Не хочешь сделать свою либу не только с DOM методами, но и JS методами (Array.prototype.forEach, Function.prototype.bind например)?

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

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

FINoM 28.05.2012 14:54

devote, я пытаюсь сделать пресловутый dataset, ты мне подал идею с комментом (объект dataset = comment), но, черт возьми, там куча лишних свойств. То бишь, перебрать его обычным for...in не получится. Есть идеи?

devote 28.05.2012 15:23

Цитата:

Сообщение от FINoM
То бишь, перебрать его обычным for...in не получится. Есть идеи?

ну я все новые имена свойств складываю в отдельный объект, а потом перебираю их.

FINoM 28.05.2012 15:27

Цитата:

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

Ну смотри:
// создали коммент, вставили в dom, добавили propertychange
el.dataset = comment;
el.dataset.x = 4;
var datasetOfEl = el.dataset; // ← как здесь вернуть {x:4}?

Есть вариант повешать на элемент геттер dataset, и при его срабатывании, перебирать все свойства и добавлять соответствующие атрибуты. Но это мне совсем не нравится.

devote 28.05.2012 16:19

Цитата:

Сообщение от FINoM
Но это мне совсем не нравится.

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

FINoM 28.05.2012 16:25

devote, получается, что при каждом вызове dataset нужно перебирать всё и сравнивать с атрибутами. Ах, да, еще одна проблема:
var dataset = el.dataset;
dataset.a = 1; // ← не сработает

------
Можно ли как-то известные свойства объекта коммента сделать «невидимыми» для for in в IE8?

devote 28.05.2012 17:33

Цитата:

Сообщение от FINoM (Сообщение 177158)
devote, получается, что при каждом вызове dataset нужно перебирать всё и сравнивать с атрибутами. Ах, да, еще одна проблема:
var dataset = el.dataset;
dataset.a = 1; // ← не сработает

Смотря у кого стоит событие, у объекта el или у объекта dataset
Цитата:

Сообщение от FINoM (Сообщение 177158)
------
Можно ли как-то известные свойства объекта коммента сделать «невидимыми» для for in в IE8?

Для некоторых можно но не для всех. Просто вызвать defineProperty с указанием enumerable: false

FINoM 28.05.2012 17:38

Цитата:

Сообщение от devote
Смотря у кого стоит событие, у объекта el или у объекта dataset

Вот именно, если dataset — html нода или коммент, в нем, очевидно, будут лишние свойства.

B~Vladi 28.05.2012 18:13

FINoM, в IE8 есть же геттеры/сеттеры, какой профит от ноды?

devote 28.05.2012 18:15

Цитата:

Сообщение от B~Vladi
FINoM, в IE8 есть же геттеры/сеттеры, какой профит от ноды?

профит в том что он хочет реализовать dataset, но тут обычные геттеры/сеттеры совсем не подойдут, даже в ИЕ9-10 и других браузерах. Потому как нужны магические геттеры/сеттеры которые ловить будут появление новых свойств.

FINoM 28.05.2012 18:15

Цитата:

Сообщение от B~Vladi
FINoM, в IE8 есть же геттеры/сеттеры, какой профит от ноды?

Подробнее можно? Там есть Object.defineProperty, но он работает только с элементами DOM.

FINoM 28.05.2012 18:16

Цитата:

Сообщение от devote
Потому как нужны магические геттеры/сеттеры которые ловить будут появление новых свойств.

Угу, типа propertychange.

Раед 28.05.2012 18:24

Цитата:

Сообщение от FINoM
но, черт возьми, там куча лишних свойств. То бишь, перебрать его обычным for...in не получится.

hasOwnProperty ещё никто не отменял

FINoM 28.05.2012 18:29

Цитата:

Сообщение от Раед
hasOwnProperty ещё никто не отменял

Во первых с DOM элементами оно не работает (IE8), во вторых эти элементы «имеют собственные свойства», которые попадают в for..in (Chrome).
Цитата:

Сообщение от devote
Просто вызвать defineProperty с указанием enumerable: false

Не работает http://jsfiddle.net/QGdqq/1/ (См. IE8)

Цитата:

SCRIPT5037: Для данного объекта атрибут "enumerable" дескриптора свойства не может иметь значение False

Раед 28.05.2012 18:33

Цитата:

Сообщение от FINoM
во вторых эти элементы «имеют собственные свойства», которые попадают в for..in (Chrome).

В Crome есть свой dataset

FINoM 28.05.2012 18:34

Цитата:

Сообщение от Раед
В Crome есть свой dataset

Я говорю об элементе коммента, хотя это касается всех узлов.

B~Vladi 28.05.2012 18:44

Цитата:

Сообщение от devote
нужны магические геттеры/сеттеры

А, понял.

Цитата:

Сообщение от FINoM
Там есть Object.defineProperty

Ещё есть VBS.

Перебрать получится, даже отделить кастомные от родных.
Мне кажется идея тупиковая :(

FINoM 28.05.2012 18:48

Цитата:

Сообщение от B~Vladi
Мне кажется идея тупиковая

В Js нет нерешаемых задач :D
Нет, всё равно что-то придумаю. Только пока что нет идей.

Раед 28.05.2012 20:31

FINoM,
Dataset Demo
Там далеко не всё гладко, но всё же

nerv_ 28.05.2012 22:06

Цитата:

Сообщение от B~Vladi
Ещё есть VBS.

чур меня, чур )

Цитата:

Сообщение от B~Vladi
Мне кажется идея тупиковая

здесь ребята умные, придумают что-нибудь. Другое дело как включить процесс придумывания? Кому-то помогает кокс, но я бы не советовал )
Кстати Microsoft уже "придумала" - не поддерживать хрюшу : ) Гениальные ребята )))
Даже если зайти в тупик и долго биЦа головой об стену, можно найти выход ;)

p.s.: а если серьезно, здорово, что Вы есть. Есть у кого учится :)

FINoM 28.05.2012 22:13

Раед, там та же проблема, которую описывал выше: объект dataset содержит кучу лишних свойств.
for(var i in el.dataset) console.log( i )


Журнал: nextSibling
Журнал: onresizeend
Журнал: onrowenter
Журнал: aria-haspopup
Журнал: childNodes
Журнал: ondragleave
Журнал: oncut
Журнал: clientHeight
Журнал: onbeforepaste
Журнал: ondragover
Журнал: onbeforecopy
Журнал: aria-disabled
Журнал: onpage
Журнал: recordNumber
Журнал: previousSibling
Журнал: nodeName
Журнал: onbeforeactivate
Журнал: accessKey
Журнал: currentStyle
Журнал: onfocusin
Журнал: onbeforeeditfocus
...

Раед 28.05.2012 23:00

FINoM,
Есть одна идейка. Секунду, скоро выложу

FINoM 28.05.2012 23:08

comment = document.createComment("");
document.documentElement.firstChild.appendChild(comment);
comment.onpropertychange = function () { alert() }

function Data() {}
Data.prototype = comment
data = new Data
data.x = 4 // сработал onpropertychange 
console.log(comment.x, data.x);

Журнал: undefined4

Хах, забавно.

melky 28.05.2012 23:09

а что, если залепить все св-а в прототип, и в цикле проверять по hasOwnProperty?

Цитата:

Сообщение от FINoM
В Js нет нерешаемых задач

моя подпись :D

FINoM 28.05.2012 23:13

Цитата:

Сообщение от melky
моя подпись

Ага. Всё, на базе той куйни, что я привел выше, можно легко сделать dataset.
comment = document.createComment("");
document.documentElement.firstChild.appendChild(comment);
comment.onpropertychange = function () { alert() }

function Data() {
   return { a:4 }
}
Data.prototype = comment
data = new Data
data.x = 5 // алерт

for (var i in data )console.log( i, data[i] )

Журнал: a4
Журнал: x5

melky 28.05.2012 23:19

Цитата:

Сообщение от FINoM
Ага. Всё, на базе той куйни, что я привел выше, можно легко сделать dataset.

а для FF и других добавить event listener для DOMAttrModified.

оригинально!

FINoM 28.05.2012 23:22

Цитата:

Сообщение от melky
а для FF и других добавить event listener для DOMAttrModified.

Разве у ff нет поддержки dataset?

Раед 28.05.2012 23:24

Всё, закончил. http://learn.javascript.ru/play/zRz9xb
1 минус. При вызове element.dataset.myProp = val значение не будет занесено в element.attributes, но зато никаких пропертиченджей
_______________
опоздал немного

FINoM 28.05.2012 23:34

Цитата:

Сообщение от Раед
опоздал немного

Да нет, там много полезного есть того, что лень самому писать :D

FINoM 28.05.2012 23:42

Цитата:

Сообщение от melky
оригинально!

Оно то оригинально, но кто знал? Методом тыка получилось такое реализовать. А вот с defineProperty такой ход не прокатил.
_defineProperty= Object.defineProperty;
comment = document.createComment("");
document.documentElement.firstChild.appendChild(comment);

Object.defineProperty = function( object, property, desc ) {
    object.constructor.prototype = comment;
    _defineProperty(comment, property, desc)
}

o = {};
Object.defineProperty(o, 'x', {set: function(){ alert() }})
o.x = 4; // не работает

Раед 29.05.2012 00:13

Цитата:

Сообщение от FINoM (Сообщение 177249)
Да нет, там много полезного есть

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

devote 29.05.2012 00:19

FINoM,
плохой вариант, я пробовал.. в нем есть недостаток.. попробуй сделать так:
comment = document.createComment("");
document.documentElement.firstChild.appendChild(comment);
comment.onpropertychange = function () { alert() }
 
function Data() {
   return { a:4 }
}
Data.prototype = comment
data = new Data
data.x = 5 // алерт

data.y = 5 // херов а не алерт :(
 
for (var i in data )console.log( i, data[i] )

devote 29.05.2012 00:24

и да добавлю, алерт срабатывает не при назначении свойства x а при назначении
comment.onpropertychange = function() {
	alert( window.event.propertyName );
}
тоесть на самого себя

Раед 29.05.2012 00:29

devote,
в вашем примере (new Data) .constructor !== Data


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