Цитата:
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, время: 04:11. |