0

Uncaught TypeError: Object [object HTMLDivElement] has no method 'setAttribute' 当我尝试在对象中添加一个元素的 id 时,我不断收到此错误。

这是对我来说很糟糕的台词

dojo.attr(query(".toggle_section", object),"id",i);

function toggleClass(){
require(["dojo/on",
         "dojo/query",
         "dojo/dom-class"
], 
function(on, query, domClass) {
    query(".toggle-container").forEach(function(object, i){
        var btn_toggle = query(".toggle", object);
        dojo.attr(query(".toggle_section", object),"id",i);
        on(btn_toggle, "click", function(evt){

            domClass.toggle(object, "closed");
            evt.preventDefault();
        });
    });
});
}

<div class="toggle-container">
            <a class="toggle" href="#" title="toggle profile">PROFILE</a>
            <div class="toggle_section">
                <p>hidden content</p>
            </div>              
        </div>
4

3 回答 3

1

, , , ... 和.dojo/dom-*等模块之间存在差异。第一系列模块允许您一次更改一个 DOM 节点(通过引用 DOM 节点或 ID)。dojo/domdojo/dom-styledojo/dom-attrdojo/query

然而,该dojo/query模块返回的NodeList实际上是一个带有一些额外功能的 DOM 节点数组。

要更改属性,您可以选择使用dojo/dom-attr(即 AMD 版本dojo.attr()),但这意味着您不能使用 a NodeList,因此您实际上必须获取列表的第 N 个值,就像您在答案中所做的那样(query("...")[0])。

一个更好的解决方案是使用该dojo/NodeList-dom模块,该模块允许您使用我之前描述的 DOM 函数(dojo/dom-style, dojo/dom-attr, ...),但可以使用NodeList它本身。要使用它,请执行以下操作:

query(".toggle_section", object).attr("id", 1);

但是你必须加载dojo/NodeList-dom模块。您可能会问有什么区别,好吧,在上面的代码中,您仍然可以使用您的代码NodeList并使用它的所有优点。

一个完整的例子可以在JSFiddle上找到。


注意我知道您已经有了答案,但这个答案可能对将来的参考有用。

于 2014-02-14T11:21:52.440 回答
0

我认为您需要:

  • 要求在“ dojo/dom-attr”中并使用domAttr.set(node, attribute, value)

或者

  • 要求在“ dojo”基础上并照常dojo.attr(node, attribute, value)使用
于 2012-05-29T20:29:39.260 回答
0

我需要将 [0] 添加到查询的末尾,以便它选择 .toggle_section 元素的第一个实例,在本例中是唯一实例。

dojo.attr(query(".toggle_section", object)[0],"id",i);
于 2014-02-13T17:25:14.453 回答