我想知道是否可以为元素对象赋值。在这种情况下,我希望将setTimeout()
函数的返回值分配给元素对象中的对象。
例如:
var elem = document.getElementById('target');
elem.timeouts = new Object();
elem.timeouts.sometimeout = setTimeout('...', 1000);
所以我可以这样做:
clearTimeout(elem.timeouts.sometimeout);
我知道这可能看起来很糟糕,但它是否有可能或者会导致浏览器着火并开启用户等。
感谢。
答案 0 :(得分:2)
有可能,由JS检索的DOM元素是JS变量:) ..但是,以这种方式做这些事情并不常见。我认为@galambalazs的答案更为深刻和完整;)
答案 1 :(得分:2)
DOM元素是主机对象(又名非本地),因此他们几乎可以做任何他们想做的事情。我们无法保证您的expandos能够正常运行。特别是IE过去常常遇到问题。强烈建议您阅读本文:
@kangaxWhat’s wrong with extending the DOM (来自Prototype.js的一位开发人员,他们遇到了这些坏习惯的弊端。他们为了让自己免受更多麻烦而改写了整个图书馆)
现在,如果您向非IE浏览器中的元素添加uniqueID
(默认情况下IE已将其添加),那么您的data
函数将变为简单的查找 ~O(1 )。真实信息将存储在闭包。
比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.。数组
如果你想一起避免使用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中更好。