2012-04-16 4 views
4

jQuery $("..").data("key", value)メソッドがデータキーアトリビュート(存在する場合)を設定しますか?データ( "key"、value)メソッドはデータ属性を設定していますか?

Adam Freeman's Pro jQueryはそれがないと述べている:

ヒントデータ方式は、データが時に の設定値だけでなく、アカウントに属性を取ります。このような[sic]製品のキーを指定すると、 データメソッドは、対応するHTML5データ 属性(data-productなど)があるかどうかを確認します。存在する場合、指定された値 が属性に割り当てられます。そうでなければ、データはjQueryによって内部的に格納された です。

しかし、私はそうではないと思っていました。私がテストしたのは、そうではないということです。 (私は正誤情報セクションをチェックしました - 何もありません)

完全なコードは以下の通りですが、それはattrメソッドを呼び出してdata-name属性を設定すると属性値が変更され、chrome要素タブに戻り、newValueに検索されます。データメソッドで設定すると、これらの条件のいずれも満たされません。 data()を使用すると、値が内部的に設定され、属性に値が設定されていなくても設定されているようです。

残念ながら、docs' only mention of html5 data-attributesはデータメソッドのセクションにあり、キーのみを受け取り、付随する値を返します。 data("key", value)の記述には、html5データ属性はまったく言及されていないようです。


<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.js"></script> 

    <script type="text/javascript"> 
     $(function() { 
      var oldValue = $("#d").data("name"); 
      alert("old value " + oldValue); 

      $("#d").data("name", "Adam"); 
      //$("#d").attr("data-name", "Adam"); 

      var newValue = $("#d").attr("data-name"); 
      alert("new value " + newValue); 
     }); 
    </script> 
</head> 
<body> 
    <div id="d" data-name="none"></div> 
</body> 
</html> 

答えて

1

:Internet ExplorerのデータははExpandoプロパティを介して結合することを許可し しないように、この方法は、現在、XML文書のデータを設定するためのクロスプラットフォーム サポートを提供していないことを

注意。

2

私はアダム・フリーマンの記述が完全に正確間違っている、または少なくともではないと思います。 jQueryのデータオブジェクトに自動的に の中に引き込まれる属性データ - のjQuery 1.4.3 HTML 5のよう

:jQueryのドキュメントによると

これは、jQueryが実際の属性の値を上書きするのではなく、これらの属性を内部表現にプルすることを意味します。

コードをすばやく調べると、同じことが示唆されます。 jQuery's .data() method documentationによると

+0

これは正しいです。 "data-"で始まる要素に追加する属性はすべて内部データオブジェクトに格納されますが、これらの値に対する変更はvisible属性に反映されません。また、データオブジェクトに追加されたデータ値は、その要素の可視属性として追加されません。 –

1

それがあればエラーを投げないでください。data=を使用しているようです。

Take a look for yourself:

function dataAttr(elem, key, data) { 
    // If nothing was found internally, try to fetch any 
    // data from the HTML5 data-* attribute 
    if (data === undefined && elem.nodeType === 1) { 

     var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase(); 

     data = elem.getAttribute(name); 

     if (typeof data === "string") { 
      try { 
       data = data === "true" ? true : 
       data === "false" ? false : 
       data === "null" ? null : 
       jQuery.isNumeric(data) ? +data : 
        rbrace.test(data) ? jQuery.parseJSON(data) : 
        data; 
      } catch(e) {} 

      // Make sure we set the data so it isn't changed later 
      jQuery.data(elem, key, data); 

     } else { 
      data = undefined; 
     } 
    } 

    return data; 
} 
1

jQueryの.data()機能は、それらの初期値を取る以外、全く属性data-* HTML5と相互作用しません。私は完全にはわかりませんこれが行われたとき - 別の答えは、それが正しいかもしれない.data()への最初の呼び出しで行われたことを示唆しています(それは間違いなく理にかなっています)。

.attr()を使用してdata-*属性に新しい値を指定しても、jQueryがアクセスするために格納した値は.data()に変更されません。説明するために、this jsFiddleをご覧ください。 <div>要素を調べてボタンをクリックすると、要素の属性の値が変更されている間に、2つのconsole.log()呼び出しが同じ値を出力することがわかります。

関連する問題