【问题标题】:Create an Array from a single HTML5 "data-" attribute从单个 HTML5“data-”属性创建一个数组
【发布时间】:2014-04-02 13:17:15
【问题描述】:

我有这个 HTML:

<section id="SSID" data-texts="'Text1', 'Text2', 'Text3'"></section>

我想在 jQuery 中创建一个数组变量,我的 jQuery 代码是:

$(document).ready(function() {
    var Selection = $("#SSID").data("texts");
    var Texts = [ Selection ];

    console.log(Texts.length);
});

对于我的示例,我期望的结果是:

Texts[0] = 'Text1'
Texts[1] = 'Text2'
Texts[2] = 'Text3'

...数组Texts的长度为3

但是,我看到的是 Texts 的长度是 1 并且整个字符串正在加载到 Texts[0]

Texts[0] = "'Text1', 'Text2', 'Text3'"

我认为我的问题是由"(引号)字符引起的。如何克服这个问题并实现我的目标?

【问题讨论】:

    标签: javascript jquery arrays html custom-data-attribute


    【解决方案1】:

    您可以使用JSON.parse()

    HTML:

    <section id="SSID" data-texts='"Text1", "Text2", "Text3"'></section>
    

    JQUERY:

    var Selection = JSON.parse('[' + $("#SSID").data("texts") + ']');
    

    Fiddle Demo

    HTML:

    <section id="SSID" data-texts='"Text1", "Text2", "Text3"'></section>
    

    JQUERY:

    var Selection = JSON.parse($("#SSID").data("texts"));
    

    仅供参考: 但最好将实际的 JSON 存储为数据属性值。例如:data-texts='["Text1", "Text2", "Text3"]' 并直接解析。


    更新: 或者你可以使用Array#map 方法和String#split 方法。

    var Selection = $("#SSID").data("texts").split(',').map(JSON.parse);
    
    console.log(Selection);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <section id="SSID" data-texts='"Text1", "Text2", "Text3"'></section>

    【讨论】:

    • 有什么办法可以用data-texts=" 'a', 'b', 'c' "格式代替data-texts=' "a", "b", "c" '
    • @Phoenix 请注意,这是技术上较差的解决方案。使用 actual JSON,而不是手动添加方括号的字符串。
    【解决方案2】:

    data- 属性可以包含 JSON。

    如果它们在语法上有效,jQuery 会自动为你解析它们。

    <section id="SSID" data-texts='["Text1", "Text2", "Text3"]'></section>
    

    $(function() {
        var texts = $("#SSID").data("texts");
    
        console.log(texts.length);  // logs "3"
    });
    

    见:http://jsfiddle.net/5mtre/


    安全提示:您必须在服务器上正确编码 JSON。

    这意味着您需要进行JSON编码 HTML编码,这里显示使用PHP的示例:

    <section id="SSID" data-texts="<?=htmlspecialchars(json_encode($data), ENT_QUOTES, 'UTF-8')?>"></section>
    

    【讨论】:

    • 您还应该添加标志和编码,请参阅此答案。修复了我的问题stackoverflow.com/a/8832570/1643487
    • @Tim 仅供参考,您能否说明省略ENT_QUOTES, 'UTF-8' 会导致错误结果的情况?
    • 当您的 JSON 数据中有单个 qoute 时,例如:data-texts='["Text1", "'Text2", "Text3"]'。这将在'Text2 中断。
    • 您也可以通过json_encode($data, JSON_HEX_QUOT) 将引号更改为&amp;quot;
    • @Nicholas 不,这还不够。所有这一切都是对 JSON 本身进行不同的编码。 {"key": "value with \"quotes\"..."} 变成 {"key": "value with \u0022quotes\u0022..."},这在技术上是一样的。但 JSON 字符串仍将包含 &lt;&gt;&amp;" 未编码,这将破坏 HTML。防止 HTML 损坏是htmlspecialchars() 的重点。一般建议:不要试图对这种事情变得聪明。始终使用正确的功能。对您使用的媒体进行严格编码,逐层进行,在这种情况下:原始数据 -> JSON -> HTML。
    猜你喜欢
    • 2022-07-29
    • 2015-05-28
    • 2018-01-09
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多