Присвоение значений элементу - PullRequest
0 голосов
/ 17 января 2011

Мне было интересно, можно ли присвоить значения элементу объекта.В этом случае я хочу назначить возврат из функции setTimeout() объекту в объекте элемента.

Например:

var elem = document.getElementById('target');
elem.timeouts = new Object();
elem.timeouts.sometimeout = setTimeout('...', 1000);

Так что я мог бы тогда сделать:

clearTimeout(elem.timeouts.sometimeout);

Я знаю, что это может показаться плохой практикой и т. Д., Но возможно ли это, или это заставит браузеры загореться и включить своего пользователя и т. Д.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 18 января 2011

Элементами 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;
    };
}

Пожалуйста!:)

2 голосов
/ 17 января 2011

Возможно, элементы DOM, полученные с помощью JS, являются переменными JS :) .. Кстати, такая практика не распространена.Я думаю, что ответ @ galambalazs более глубокий и полный;)

0 голосов
/ 18 января 2011

Нет, на самом деле это должно работать просто отлично.Из того, что я понимаю, добавление этого возврата к объекту должно быть хорошо.Это лучше, чем хранить его в глобальном контейнере IMO.

0 голосов
/ 17 января 2011

если вы используете jquery, вы можете рассказать об этом в «data» http://api.jquery.com/jQuery.data/

...