Цитата:
http://javascript.ru/forum/project/1...elektorov.html |
Цитата:
и работать оно будет только в IE - обычно браузеры не устанавливают неправильные css-свойства. |
Цитата:
|
Цитата:
ограничения - это да. |
Цитата:
|
Звучит очень круто. У меня тоже возникала такая идея, но не знал с какой стороны к ней подойти. Не хочешь сделать свою либу не только с DOM методами, но и JS методами (Array.prototype.forEach, Function.prototype.bind например)?
Element.prototype = proto = document.createComment( "" ); proto.attachEvent( 'onpropertychange', function() {Офигеть. Гениально. |
Цитата:
Но вы можете легко подключится в ее разработку и написание дополнений. |
devote, я пытаюсь сделать пресловутый dataset, ты мне подал идею с комментом (объект dataset = comment), но, черт возьми, там куча лишних свойств. То бишь, перебрать его обычным for...in не получится. Есть идеи?
|
Цитата:
|
Цитата:
// создали коммент, вставили в dom, добавили propertychange el.dataset = comment; el.dataset.x = 4; var datasetOfEl = el.dataset; // ← как здесь вернуть {x:4}? Есть вариант повешать на элемент геттер dataset, и при его срабатывании, перебирать все свойства и добавлять соответствующие атрибуты. Но это мне совсем не нравится. |
Цитата:
|
devote, получается, что при каждом вызове dataset нужно перебирать всё и сравнивать с атрибутами. Ах, да, еще одна проблема:
var dataset = el.dataset; dataset.a = 1; // ← не сработает ------ Можно ли как-то известные свойства объекта коммента сделать «невидимыми» для for in в IE8? |
Цитата:
Цитата:
|
Цитата:
|
FINoM, в IE8 есть же геттеры/сеттеры, какой профит от ноды?
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Цитата:
Перебрать получится, даже отделить кастомные от родных. Мне кажется идея тупиковая :( |
Цитата:
Нет, всё равно что-то придумаю. Только пока что нет идей. |
|
Цитата:
Цитата:
Кстати Microsoft уже "придумала" - не поддерживать хрюшу : ) Гениальные ребята ))) Даже если зайти в тупик и долго биЦа головой об стену, можно найти выход ;) p.s.: а если серьезно, здорово, что Вы есть. Есть у кого учится :) |
Раед, там та же проблема, которую описывал выше: объект 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 ... |
FINoM,
Есть одна идейка. Секунду, скоро выложу |
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 Хах, забавно. |
а что, если залепить все св-а в прототип, и в цикле проверять по hasOwnProperty?
Цитата:
|
Цитата:
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 |
Цитата:
оригинально! |
Цитата:
|
Всё, закончил. http://learn.javascript.ru/play/zRz9xb
1 минус. При вызове element.dataset.myProp = val значение не будет занесено в element.attributes, но зато никаких пропертиченджей _______________ опоздал немного |
Цитата:
|
Цитата:
_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; // не работает |
Цитата:
|
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] ) |
и да добавлю, алерт срабатывает не при назначении свойства x а при назначении
comment.onpropertychange = function() { alert( window.event.propertyName ); }тоесть на самого себя |
devote,
в вашем примере (new Data) .constructor !== Data |
Часовой пояс GMT +3, время: 14:36. |