【问题标题】:What is the correct way to store data in the DOM在 DOM 中存储数据的正确方法是什么
【发布时间】:2011-05-29 06:01:19
【问题描述】:

我最近一直在使用各种 HTML 元素中的标题标签来在 DOM 中以 JSON 格式存储数据。

这是一个不好的方法(我假设它是)?什么是正确的方法来完成这个与 jQuery 配合得很好?我所说的“运作良好”是指

$("myButton").click(function (e) {
     var myData;
     eval("myData=" + $(this).attr("title"));
});

效果很好,但我再次假设有更好的方法来做到这一点?

PS:顺便说一句,HTML 元素的标题标签实际上是如何工作的?我似乎找不到它实际上最终被使用的地方?

PSS:我还能获得基于 jQuery 和非 jQuery 的响应吗? (不好意思打扰了)

【问题讨论】:

    标签: javascript asp.net jquery html dom


    【解决方案1】:
    eval("myData=" + $(this).attr("title"));
    

    这几乎是打你一巴掌的合法理由! (j/k)

    您应该使用自己的命名空间对象来“全局”存储数据。在这种情况下,全局意味着仅在您的应用程序代码中是全局的,而不是使用 global object(浏览器中的 window)。

    var my_application = {};
    
    $('myButton').click(function() {
      my_application.myData = $(this).attr('title');
    });
    

    这当然是一个非常基本的策略。在您的特定情况下,您还可以使用 jQuery 的 .data() 方法将数据附加到 DOM 节点。

    $('myButton').click(function() {
       $.data(this, 'myData', this.title);
    });
    

    参考:.data(),jQuery.data()

    【讨论】:

    • lol.... 等等...不是 myData,因为它是在它所在的匿名函数的本地 eval 之上声明的?
    • @MaximGershkovich:是的,但是你为什么要使用eval()呢?你可以给局部变量赋值。
    • 对不起,也许我应该更清楚 $(this).attr('title') = { someID: "", someProperty: "", anotherProperty: "" } 。我错过了什么吗?
    • @MaximGershkovich:我很困惑。那么title 的值是对象还是JSON 字符串?如果你想解析 JSON,你应该使用 JSON.parse() 而不是 eval.. 但我不确定我是否真的理解这个问题。
    • wooo.... 它是一个 JSON 字符串.... 你是说我可以将 JSON 对象直接放入属性中吗?现在跑回我的 IDE 进行测试....
    【解决方案2】:

    在您的示例中,我建议您执行以下操作,这不会使您面临“评估”的安全风险:

    myData = JSON.decode($(this).attr("title"));
    

    一般来说,这是一种保存非安全数据的有效方法。您还有许多其他选择:

    【讨论】:

      【解决方案3】:

      使用 jquery data()

      jQuery.data() 方法允许我们 将任何类型的数据附加到 DOM 元素以安全的方式 循环引用,因此免费 从内存泄漏。 jQuery 确保 当 DOM 元素时数据被删除 通过 jQuery 方法删除,并且 当用户离开页面时。我们可以 为 a 设置几个不同的值 单个元素并检索它们 稍后:

      jQuery.data(document.body, 'foo', 52);
      

      【讨论】:

        【解决方案4】:

        在 jQuery 世界中,使用元数据插件通常被认为是最佳实践,因为它是一个官方的 jQuery 插件并且还支持 HTML5 数据属性。有关更多信息,您可以查看此http://docs.jquery.com/Plugins/Metadata/metadata

        【讨论】:

          猜你喜欢
          • 2013-02-01
          • 2020-01-19
          • 2019-01-11
          • 1970-01-01
          • 2015-03-20
          • 2016-05-31
          • 2012-05-01
          • 2020-01-25
          • 1970-01-01
          相关资源
          最近更新 更多