为元素分配值

时间:2011-01-17 20:53:46

标签: javascript dom variables object element

我想知道是否可以为元素对象赋值。在这种情况下,我希望将setTimeout()函数的返回值分配给元素对象中的对象。

例如:

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

所以我可以这样做:

clearTimeout(elem.timeouts.sometimeout);

我知道这可能看起来很糟糕,但它是否有可能或者会导致浏览器着火并开启用户等。

感谢。

4 个答案:

答案 0 :(得分:2)

有可能,由JS检索的DOM元素是JS变量:) ..但是,以这种方式做这些事情并不常见。我认为@galambalazs的答案更为深刻和完整;)

答案 1 :(得分:2)

DOM元素是主机对象(又名非本地),因此他们几乎可以做任何他们想做的事情。我们无法保证您的expandos能够正常运行。特别是IE过去常常遇到问题。强烈建议您阅读本文:

@kangax

What’s wrong with extending the DOM  (来自Prototype.js的一位开发人员,他们遇到了这些坏习惯的弊端。他们为了让自己免受更多麻烦而改写了整个图书馆)

现在,如果您向非IE浏览器中的元素添加uniqueID(默认情况下IE已将其添加),那么您的data函数将变为简单的查找 ~O(1 )。真实信息将存储在闭包

jQuery.data test

快2-4倍
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.。数组

如果你想一起避免使用expandos,你可以使用一个数组来保存元素(但它更慢)

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 :(得分:0)

如果你正在使用jquery,你可以在“数据”中讲述它 http://api.jquery.com/jQuery.data/

答案 3 :(得分:0)

不,实际上应该可以正常工作。根据我的理解,添加返回对象应该没问题。它比将其存储在全球容器IMO中更好。