Элементами DOM являются Хост-объекты (иначе не нативные ), и поэтому они могут делать практически все, что захотят.Не гарантируется, что ваши эксплорезы будут работать.В частности IE имел проблемы с ними.Настоятельно рекомендуется прочитать эту статью:
Что не так с расширением DOM на @ kangax (это от одного изразработчики Prototype.js, которые испытали недостатки таких вредных привычек. Они переписали всю библиотеку просто для того, чтобы уберечь себя от новых головных болей)
Теперь, если вы добавите uniqueID
к элементам вIE браузеры (IE по умолчанию), и тогда ваша data
функция становится простым lookup ~ O (1).Реальная информация будет храниться в закрытии .
Это * на 1025 * 2-4x быстрее , чем jQuery.data
( test )
data(elem, "key", "value");
1.) Хеш-таблица
var data = (function () {
var storage = {};
var counter = 1;
return function (el, key, value) {
var uid = el.uniqueID || (el.uniqueID = counter++);
if (typeof value != "undefined") {
storage[uid] || (storage[uid] = {});
storage[uid][key] = value; // set
} else if (storage[uid]) {
return storage[uid][key]; // get
}
};
})();
2.) Массив
Если вы хотитечтобы избежать одновременного расширения, вы можете использовать массив для хранения элементов (но он медленнее)
var data = (function () {
var elements = [];
var storage = [];
return function (el, key, value) {
var i = elements.indexOf(el);
if (typeof value != "undefined") {
if (i == -1) {
i = elements.length;
elements[i] = el;
storage[i] = {};
}
storage[i][key] = value; // set
} else if (storage[i]) {
return storage[i][key]; // get
}
};
})();
Array.prototype.indexOf (резервный)
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (item) {
var len = this.length >>> 0;
for (var i = 0; i < len; i++) {
if (this[i] === item) {
return i;
}
}
return -1;
};
}
Пожалуйста!:)