2012-08-15 74 views
0

我正在寻找一种将javascript对象添加到DOM而不重新定义对象的方法。在DOM中添加JavaScript对象

我已经创建了一个函数,将所有对象方法放入一个新对象中,将对象重新定义为一个新的DOM元素,并将所有对象放回到它上面,但这并不是我想要的。我需要更新对象而不使用任何返回语句。

我这里有一个例子:http://jsfiddle.net/y56wS/

function addToDOM(obj) { 
    temp = {}; 
    for (p in obj) { 
     temp[p] = obj[p]; 
    } 
    obj = document.createElement('prop'); 
    document.body.appendChild(obj); 
    for (p in temp) { 
     obj[p] = temp[p]; 
    } 
    return obj; 
} 

var obj = {var1:123}; 
obj = addToDOM(obj); 

生成的代码模板应该是这样的:

function addToDOM(obj) { 
    //Code for method 
    //No return statement 
} 

var obj = {var1:123}; 
//No obj= 
addToDOM(obj); 

要做到这一点,真的有可能成为addToDOM函数内没有obj =所以它不会被重新定义,也不需要返回声明。有没有简单的将JavaScript对象扩展到DOM的方法?

+0

_“我正在寻找一种方法来添加一个JavaScript对象到DOM”_ - 让我阻止你,并说_huh?_为什么?显然我完全错过了这一点,因为将一个JS对象添加到DOM对我来说没有意义。浏览器如何显示它?如果它不显示它,为什么你会这样做? – nnnnnn 2012-08-15 07:09:50

+0

我很抱歉没有详细说明。我试图创建一个defineObject getter/setter polyfill(ish)的东西,这样我的代码就可以在IE6 +以及所有其他主流浏览器中工作。很多人都知道,如果对象是DOM的一部分,那么只有在IE8中才有可能,如果IE6/7在DOM中也有解决方法。只要在定义'obj = {}'后调用'obj = addToDOM(obj)',Object.defineProperty就可以完美工作。我只是想让它可以包含'addToDOM(obj)'作为polyfill的一部分,并且要做到这一点,我必须将其添加到DOM元素而不用重新定义它。这更清楚吗? – 2012-08-15 07:18:19

回答

1

不,JavaScript对象不能像这样添加到文档中 - appendChild()方法期望使用某种类型的对象,通常使用document.createElement()方法创建。

因此,您必须每次创建新DOM元素或克隆现有元素。

假设你想要有一些“模板”元素,我建议使用全局变量来保存该元素,创建一次,然后每次克隆它,并把新的属性。

代码,这将是:

var _globalDOMobj = 0; 
function addToDOM(obj) { 
    temp = {}; 
    for (p in obj) { 
     temp[p] = obj[p]; 
    } 
    if (!_globalDOMobj) { 
     _globalDOMobj = document.createElement('prop'); 
     _globalDOMobj.className = "myprop"; 
    } 
    obj = _globalDOMobj.cloneNode(true); 
    obj.innerHTML = "I am dynamic element"; 
    document.body.appendChild(obj); 
    for (p in temp) { 
     obj.setAttribute(p, temp[p]); 
    } 
    return obj; 
} 

addToDOM({"var1": "123", "style": "color: red;"}); 
addToDOM({"var2": "789", "style": "color: blue;"}); 

正如你看到的,你可以直接传递对象的功能,无需首先分配给变量。

此外,要在DOM元素中应用对象属性,您必须使用setAttribute(),否则这些属性将不会成为DOM的一部分。

在上面的代码中,模板对于所有实例具有相同的类,因此您可以应用一些CSS来影响它们,例如,

.myprop { font-weight: bold; }​ 

​Live test case

+0

这段代码并不是我所需要的,但它让我想到了完成这项任务的新方法,这是我以前从未想到的。如果我想出办法做到这一点,我会发布它。 – 2012-08-15 07:26:57

+0

干杯,不知道你需要什么,所以请更新我,如果你想一个更好的方法。 :) – 2012-08-15 07:35:58

1

的“添加JS对象到DOM”真的没有任何意义,而事实上你的代码是这样做,是创建一个新<prop>元素,并从你的对象分配给它的属性的概念。我没有看到这一点:您期望浏览器如何处理<prop>元素?

无论如何,继续关于如何不必从函数中返回一个对象并将其分配给您的变量的问题,您不能。 JavaScript通过值传递参数 - 在这种情况下,“值”是对对象的引用。您可以更改对象的属性,但不能将传入的变量指向某个其他对象。 (很显然你可以使声明的参数obj指向一些其他的对象,就像你在做什么。)

但是,这导致了可能的解决方法,可以帮助你:怎么样,而不是你一个简单的属性添加到现有的对象,用新的属性引用DOM对象 -

function addToDOM(obj) { 
    var temp = document.createElement('prop'); 
    document.body.appendChild(temp); 
    for (var p in obj) { 
     temp[p] = obj[p]; 
    } 
    obj.myDOMElement = temp; 
} 

var obj = {var1:123}; 
//No obj= 
addToDOM(obj); 
// obj now has a property myDOMElement that references the DOM element 

请注意,我有简化您的功能:您不需要将所有obj属性复制到temp,然后在将obj重新分配给新DOM元素后,将所有属性复制回obj。 (即使你决定留在当前代码的返回新对象的想法,你可以使用我的简化形式,只是return temp。)

而且请注意,你应该声明你的变量为var或他们将是全球性的。

+0

很好,想出了答案。我正在尝试开发在IE6 +中工作的getter/setter方法。只要在定义什么obj后包含'obj = addToDOM(obj)',它们就可以在所有浏览器中使用'polyfill'工作。由于它们是getter和setter方法,所以我必须能够检测对象何时被访问,并且在IE 6/7/8中,只有当对象位于DOM中时才能执行此操作。我想为脚本中的所有事件自动执行该操作,因此每次应用getter或setter时都不必写出它。 – 2012-08-15 07:43:59