【问题标题】:html "data-" attribute as javascript parameterhtml“data-”属性作为javascript参数
【发布时间】:2013-05-15 13:26:00
【问题描述】:

假设我有这个:

<div data-uid="aaa" data-name="bbb", data-value="ccc" onclick="fun(this.data.uid, this.data-name, this.data-value)">

还有这个:

function fun(one, two, three) {
    //some code
}

好吧,这不起作用,但我完全不知道为什么。有人可以发布一个工作示例吗?

【问题讨论】:

    标签: javascript html parameters


    【解决方案1】:

    获取data-* 属性的最简单方法是使用element.getAttribute()

    onclick="fun(this.getAttribute('data-uid'), this.getAttribute('data-name'), this.getAttribute('data-value'));"
    

    演示: http://jsfiddle.net/pm6cH/


    虽然我建议将this 传递给fun(),并在fun 函数内部 获取3 个属性:

    onclick="fun(this);"
    

    然后:

    function fun(obj) {
        var one = obj.getAttribute('data-uid'),
            two = obj.getAttribute('data-name'),
            three = obj.getAttribute('data-value');
    }
    

    演示: http://jsfiddle.net/pm6cH/1/


    通过属性访问它们的新方法是使用dataset,但并非所有浏览器都支持。你会像下面这样得到它们:

    this.dataset.uid
    // and
    this.dataset.name
    // and
    this.dataset.value
    

    演示: http://jsfiddle.net/pm6cH/2/


    还要注意,在您的 HTML 中,此处不应有逗号:

    data-name="bbb",
    

    参考资料:

    【讨论】:

    • @lan 传递“this”会更好。谢谢。
    • @user2206656 同意 :) 我为每个场景添加了(非常简单的)演示,希望这也能有所帮助!
    • 嘿,这可能有点晚了,但是有什么方法可以在没有“onclick”的情况下触发该功能,而是像“onload”这样的东西?
    【解决方案2】:

    如果您使用的是 jQuery,您可以轻松地通过以下方式获取数据属性

    $(this).data("id") or $(event.target).data("id")
    

    【讨论】:

      【解决方案3】:

      简短的回答是语法是this.dataset.whatever

      您的代码应如下所示:

      <div data-uid="aaa" data-name="bbb" data-value="ccc"
          onclick="fun(this.dataset.uid, this.dataset.name, this.dataset.value)">
      

      另一个重要提示: Javascript 将始终去掉连字符并使数据属性为驼峰式,无论您使用何种大小写。 data-camelCase 将变为 this.dataset.camelcasedata-Camel-case 将变为 this.dataset.camelCase

      jQuery(在 v1.5 和更高版本之后)总是使用小写字母,无论您的大小写如何。

      因此,当使用此方法引用您的数据属性时,请记住驼峰式:

      <div data-this-is-wild="yes, it's true"
          onclick="fun(this.dataset.thisIsWild)">
      

      另外,您不需要使用逗号来分隔属性。

      【讨论】:

        【解决方案4】:

        HTML:

        <div data-uid="aaa" data-name="bbb", data-value="ccc" onclick="fun(this)">
        

        JavaScript:

        function fun(obj) {
            var uid= $(obj).attr('data-uid');
            var name= $(obj).attr('data-name');
            var value= $(obj).attr('data-value');
        }
        

        但我使用的是 jQuery。

        【讨论】:

        • + jquery中有.data()方法。
        【解决方案5】:

        你可以在你的函数中使用默认参数 然后只传递整个数据集本身,因为 dataset 已经是一个 DOMStringMap 对象

        <div data-uid="aaa" data-name="bbb" data-value="ccc"
        onclick="fun(this.dataset)">
        
        <script>
        const fun = ({uid:'ddd', name:'eee', value:'fff', other:'default'} = {}) { 
            // 
        }
        </script>
        

        这样,您可以处理在 html 标记中设置的任何数据值, 或者在没有设置的情况下使用默认值 - 那种东西

        可能不是在这种情况下,但在其他情况下,将所有 您在单个数据属性中的偏好

        <div data-all='{"uid":"aaa","name":"bbb","value":"ccc"}'
        onclick="fun(JSON.parse(this.dataset.all))">
        

        如果你已经知道的话,可能还有更简洁的方法 关于数据顺序的某些事情

        <div data-all="aaa,bbb,ccc" onclick="fun(this.dataset.all.split(','))">
        

        【讨论】:

          【解决方案6】:

          JS:

          function fun(obj) {
              var uid= $(obj).data('uid');
              var name= $(obj).data('name');
              var value= $(obj).data('value');
          }
          

          【讨论】:

          • 使用此代码示例添加快速说明有助于改进此答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-05
          • 1970-01-01
          相关资源
          最近更新 更多