131

MVC ビューに次のフィールドがあります。

@Html.TextBoxFor(model => model.Course.Title, new { data_helptext = "Old Text" })</span>

別の js ファイルで、data-helptext属性を文字列値に設定したいと考えています。これが私のコードです:

alert($(targetField).data("helptext"));

$(targetField).data("helptext", "Testing 123");

呼び出しはalert()正常に機能し、アラート ダイアログに "Old Text" というテキストが表示されます。ただし、data-helptext属性を「Testing 123」に設定する呼び出しは機能しません。「古いテキスト」はまだ属性の現在の値です。

data() の呼び出しを間違って使用していますか? 私はこれをウェブで調べましたが、何が間違っているのかわかりません。

HTML マークアップは次のとおりです。

<input data-helptext="Old Text" id="Course_Title" name="Course.Title" type="text" value="" />
4

7 に答える 7

239

ドキュメントに記載されています.data()

data-attributesは、データプロパティが最初にアクセスされたときにプルされ、その後アクセスまたは変更されなくなります(その後、すべてのデータ値はjQueryに内部的に保存されます)

これについては、jQuery $ .fn.data()を変更して対応するhtml5データ-*属性を更新しない理由についても説明しました。

以下の私の元の答えのデモは、もう機能していないようです。

更新された回答

繰り返しますが、.data()ドキュメントから

ダッシュが埋め込まれた属性の処理は、W3CHTML5仕様に準拠するようにjQuery1.6で変更されました。

したがって<div data-role="page"></div>、次のことが当てはまります$('div').data('role') === 'page'

私は$('div').data('data-role')それが過去にうまくいったとかなり確信していますが、それはもはやそうではないようです。コンソールを開くのではなく、HTMLにログを記録するより良いショーケースを作成し、マルチハイフンからキャメルケースへのデータ属性変換の例を追加しました。

デモを更新しました(2015-07-25)

jQuery Data vs Attr?も参照してください。

HTML

<div id="changeMe" data-key="luke" data-another-key="vader"></div>
<a href="#" id="changeData"></a>
<table id="log">
    <tr><th>Setter</th><th>Getter</th><th>Result of calling getter</th><th>Notes</th></tr>
</table>

JavaScript(jQuery 1.6.2 +)

var $changeMe = $('#changeMe');
var $log = $('#log');

var logger;
(logger = function(setter, getter, note) {
    note = note || '';
    eval('$changeMe' + setter);
    var result = eval('$changeMe' + getter);
    $log.append('<tr><td><code>' + setter + '</code></td><td><code>' + getter + '</code></td><td>' + result + '</td><td>' + note + '</td></tr>');
})('', ".data('key')", "Initial value");

$('#changeData').click(function() {
    // set data-key to new value
    logger(".data('key', 'leia')", ".data('key')", "expect leia on jQuery node object but DOM stays as luke");
    // try and set data-key via .attr and get via some methods
    logger(".attr('data-key', 'yoda')", ".data('key')", "expect leia (still) on jQuery object but DOM now yoda");
    logger("", ".attr('key')", "expect undefined (no attr <code>key</code>)");
    logger("", ".attr('data-key')", "expect yoda in DOM and on jQuery object");

    // bonus points
    logger('', ".data('data-key')", "expect undefined (cannot get via this method)");
    logger(".data('anotherKey')", ".data('anotherKey')", "jQuery 1.6+ get multi hyphen <code>data-another-key</code>");
    logger(".data('another-key')", ".data('another-key')", "jQuery < 1.6 get multi hyphen <code>data-another-key</code> (also supported in jQuery 1.6+)");

    return false;
});

$('#changeData').click();

古いデモ


元の回答

このHTMLの場合:

<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>

そしてこのJavaScript(jQuery 1.6.2を使用)

console.log($('#foo').data('helptext'));

$('#changeData').click(function() {
    $('#foo').data('helptext', 'Testing 123');
//  $('#foo').attr('data-helptext', 'Testing 123');
    console.log($('#foo').data('data-helptext'));
    return false;
});

デモを見る

Chrome DevTools コンソールを使用してDOMを検査すると、コンソールに表示される値は更新され$('#foo').data('helptext', 'Testing 123'); ませんが、更新されます。$('#foo').attr('data-helptext', 'Testing 123');

于 2011-07-26T09:47:31.283 に答える
35

私は深刻な問題を抱えていました

.data('property', value);

data-property属性を設定していませんでした。

jQuery の使用を開始.attr():

一致した要素のセットの最初の要素の属性の値を取得するか、一致した要素ごとに 1 つ以上の属性を設定します。

.attr('property', value)

値を設定し、

.attr('property')

値を取得します。

今ではうまくいきます!

于 2014-09-23T21:06:30.227 に答える
9

@andybの受け入れられた回答には小さなバグがあります。上記の彼の投稿に対する私のコメントに加えて...

この HTML の場合:

<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>

次のように属性にアクセスする必要があります。

$('#foo').attr('data-helptext', 'Testing 123');

しかし、次のようなデータメソッド:

$('#foo').data('helptext', 'Testing 123');

上記の .data() メソッドの修正により、「未定義」が防止され、データ値が更新されます (HTML は更新されません)。

「データ」属性のポイントは、値を要素にバインド (または「リンク」) することです。アクションを要素にバインドする属性に非常に似ていonclick="alert('do_something')"ます...テキストは役に立たず、要素をクリックしたときにアクションが機能するようにするだけです。

データまたはアクションが要素にバインドされると、通常* HTML を更新する必要はなく、データまたはメソッドのみが更新されます。これはアプリケーション (JavaScript) が使用するものだからです。パフォーマンスに関しては、とにかく HTML も更新したい理由がわかりません。誰も html 属性を表示しません (Firebug または他のコンソールを除く)。

考えてみてください。HTML は (属性も含めて) 単なるテキストです。JavaScript で使用されるデータ、関数、オブジェクトなどは別の平面に存在します。JavaScript がそうするように指示された場合にのみ、HTML テキストを読み取ったり更新したりしますが、JavaScript で作成したすべてのデータと機能は、Firebug (または他の) コンソールに表示される HTML テキスト/属性とは完全に分離して動作します。

*通常、HTML を保存してエクスポートする必要がある場合 (たとえば、ある種のマイクロ フォーマット/データ対応テキスト エディター)、HTML が別のページに新たに読み込まれる場合は、HTML を更新する必要があるため、強調します。それも。

于 2014-09-13T03:15:24.520 に答える
3

引用を引用するには:

data- 属性は、 data プロパティが最初にアクセスされたときに取得され、その後はアクセスも変更もされません (その後、すべてのデータ値は内部的に jQuery に保存されます)。

.data()- jQuery ドキュメント

この (率直に言って奇妙な) 制限は、 の使用に対してのみ保留されることに注意してください.data()

ソリューション?.attr代わりに使用してください。

もちろん、専用の方法を使用しないことに不快感を覚える人もいるでしょう。次のシナリオを検討してください。

  • 「標準」が更新され、カスタム属性のデータ部分が不要になり、置き換えられるようになりました

常識 - なぜ彼らはすでに確立された属性をそのように変更するのでしょうか? classbegin をgroupおよびidentifieridに名前変更したと想像してみてください。インターネットは壊れるでしょう。

それでも、Javascript 自体にはこれを修正する機能があります。もちろん、悪名高い HTML との非互換性にもかかわらず、REGEX (およびさまざまな同様の方法) を使用すると、属性をこの新しい神話的な「標準」にすばやく名前変更できます。

TL;DR

alert($(targetField).attr("data-helptext"));
于 2015-01-25T03:56:28.763 に答える