2013-06-27 40 views
2

我试图做到这一点,jQuery会自动解码data- *属性吗?

var worker_ids = $.parseJSON($(':selected',this).data('workers')); 

但我一直取回null。所以我尝试只是日志记录

$(':selected',this).data('workers') 

它让我的工作人员成为一个数组!

我的HTML看起来像:

<option value="77" data-workers="[&quot;2287&quot;,&quot;2137&quot;]">COOL KIDS</option> 

我本来期望它回来作为我将不得不解析字符串。

这种情况对我来说工作得非常好,但它似乎不是一个很好的设计决策。如果我的属性恰好看起来像JSON会怎么样?

+1

[让见(http://api.jquery.com/data/#data2):*“当data属性是一个对象(以'{')或数组开始(以'['开头),然后'jQuery.parseJSON'用于解析字符串;它必须遵循有效的JSON语法,包括带引号的属性名称。 t可解析为JavaScript值,它保留为一个字符串。要检索值的属性作为字符串而不尝试转换它,请使用'attr()'方法。“* –

+1

@Fe lixKling:谢谢。我只是通过该页面浏览,应该更仔细地准备好它:-) – mpen

+0

是的:D ......... –

回答

6

是的,jQuery确实尝试猜测存储在数据属性中的数据类型,并在使用.data(也适用于数字,对象等)时将其转换。

要获取原始的属性值,使用.attr('data-workers')

的实际操作是由the internal dataAttr function

1

执行对于已经由原始的HTTP响应创建的数据属性,jQuery不会试图猜测,预期变量类型。例如,如果原始HTTP响应服务器的属性为data-foo="true",那么jQuery将解释为JavaScript boolean true

但是,如果您使用jQuery将数据属性设置为字符串,jQuery将记住您存储了一个字符串,并且不会再尝试猜测。

下面是一个代码片段,证明了我的意思:

console.log(typeof $("main").data("foo")); 
 

 
$("main").data("foo", "true"); 
 
console.log(typeof $("main").data("foo"));
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script> 
 

 
<main data-foo="false">main</main>