0

Uncaught TypeError: Object [object HTMLDivElement] has no method 'setAttribute' オブジェクトに要素の ID を追加しようとすると、このエラーが発生し続けます。

これは私にうんざりしている行です

dojo.attr(query(".toggle_section", オブジェクト),"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 ノードまたは ID を参照することによって) 一度に1 つの DOM ノードを変更できます。dojo/domdojo/dom-styledojo/dom-attrdojo/query

ただし、dojo/queryモジュールは、NodeList実際にはいくつかの追加機能を持つ DOM ノードの配列である を返します。

属性を変更するには、使用することを選択できますdojo/dom-attr(これは の AMD バージョンですdojo.attr())が、これは を使用できないことを意味するNodeListため、回答で行ったように、リストの N 番目の値を実際に取得する必要があります(query("...")[0])。

より良い解決策は、モジュールを使用することdojo/NodeList-domです。このモジュールを使用すると、先ほど説明した DOM 関数 ( dojo/dom-styledojo/dom-attr、...) をNodeListそれ自体で使用できます。これを使用するには、次のようにします。

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

dojo/NodeList-domただし、モジュールをロードする必要があります。違いは何かと思うかもしれませんが、上記のコードでも引き続きNodeList使用でき、そのすべての利点を利用できます。

完全な例はJSFiddleにあります。


すでに回答があることは承知していますが、この回答は将来の参照に役立つ場合があります。

于 2014-02-14T11:21:52.440 に答える
0

[0] をクエリの末尾に追加して、.toggle_section 要素の最初のインスタンス (この場合は唯一のインスタンス) を選択する必要がありました。

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

次のいずれかが必要だと思います。

  • " " で必要dojo/dom-attrと使用domAttr.set(node, attribute, value)

また

  • dojo" " ベースでrequire し、dojo.attr(node, attribute, value)既にあるように使用します
于 2012-05-29T20:29:39.260 に答える