JavaScriptを使用してカスタム属性を設定する


119

DynaTree(https://code.google.com/p/dynatree)を使用していますが、問題が発生しており、誰かが助けてくれることを期待しています。

以下のようなページにツリーを表示しています。

<div id="tree">
        <ul>
            <li class="folder">Outputs
                <ul>
                    <li id="item1" data="icon: 'base.gif', url: 'page1.htm', target: 'AccessPage'">Item 1 Title
                    <li id="item2" data="icon: 'base.gif', url: 'page2.htm', target: 'AccessPage'">Item 2 Title
                    <li id="item3" data="icon: 'base.gif', url: 'page3.htm', target: 'AccessPage'">Item 3 Title
                    <li id="item4" data="icon: 'base.gif', url: 'page4.htm', target: 'AccessPage'">Item 4 Title
                </ul>
        </ul>
    </div>

ただし、アイテムが選択されているか、JavaScriptだけを使用しているかに関係なく、アイテムのアイコンを変更しようとしています

使用したい新しいアイコンはbase2.gifです

以下を使用してみましたが、うまくいかないようです:

document.getElementById('item1').data = "icon: 'base2.gif', url: 'output.htm', target: 'AccessPage', output: '1'";

誰かが私が間違っているかもしれないことを知っていますか?


3
キーワードdataは接頭辞です。使用する必要がありますdata-you-attribute-name
MilkyWayJoe

6
@Aaronベストアンサーを選択してください。
0x499602D2

回答:


202

次のsetAttribute方法を使用します。

document.getElementById('item1').setAttribute('data', "icon: 'base2.gif', url: 'output.htm', target: 'AccessPage', output: '1'");

ただし、実際には、次のようにダッシュとそのプロパティが続くデータを使用する必要があります。

<li ... data-icon="base.gif" ...>

そしてJSでそれを行うには、datasetプロパティを使用します:

document.getElementById('item1').dataset.icon = "base.gif";

9
データセットプロパティは、HTML5に準拠したブラウザのみを検討する場合に役立ちますが、これは短いリストであり、一般的なWebには幅広いサポートが必要です。ここでは、setAttributeの使用に固執します。
RobG

document.getElementById( 'item1')。setAttribute( 'data'、 "icon: 'base2.gif'、url: 'output.htm'、target: 'AccessPage'、output: '1' ");
アーロン

2
コードが機能していないことに気づかせるコードで正確に何をしていますか?
0x499602D2

コードを追加し、最後にアラートを追加したので(コードが完了すると警告が表示されます)、アイコンが変化しないことも確認できます。(コードを削除すると、alartディスプレイが表示されるので、先ほど追加したコードに問題があることがわかります。)
Aaron

IE <= 8はsetAttributeをサポートしていません
RTF

56

データセットを使用してください

var article = document.querySelector('#electriccars'),
    data = article.dataset;

// data.columns -> "3"
// data.indexnumber -> "12314"
// data.parent -> "cars"

したがって、データを設定するためのあなたのケースでは:

getElementById('item1').dataset.icon = "base2.gif";

1
また(適切な場合)、キャメルケースを使用してハイフン付きの名前を参照します(括弧で囲まれた文字列は失敗します)。
2540625

6
jsperf.com/html5-dataset-vs-native-setattributeこの提案された方法は非常に遅くなります
ラセミ

4

Googleから来た人にとって、この質問はデータ属性に関するものではありません-OPは非標準属性をHTMLオブジェクトに追加し、それを設定する方法を疑問に思いました。

しかし、あなたはあなたの特性にカスタム属性を追加しないでください-あなたがすべき使用したデータの属性を -例えばOPを使用している必要がありdata-icondata-urldata-target、など

いずれにしても、JavaScriptを使用してこれらの属性を設定する方法は、どちらの場合も同じであることがわかります。使用する:

ele.setAttribute(attributeName, value);

DOM要素の指定された属性attributeNameをに変更します。valueele

例えば:

document.getElementById("someElement").setAttribute("data-id", 2);

を使用.datasetしてデータ属性の値を設定することもできますが、@ racemicが指摘しているように、62%遅くなります(少なくとも執筆時のmacOS上のChromeでは)。そのため、setAttribute代わりにメソッドを使用することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.