【问题标题】:jquery variable seems to never get set after the first click第一次单击后,jquery 变量似乎永远不会被设置
【发布时间】:2015-05-05 08:28:46
【问题描述】:

这可能很简单,但此时的答案暗示了我。我有一个按钮,我已将数据属性附加到 ('data-faqid')

单击网页上的链接会更改此数据,然后当我单击该按钮时,我试图获取这样的值

   $('#faqSaveBtn').click(function () {
        var aFAQID = $(this).data('faqid');
        saveAClassFaq(aFAQID, sf);
    });

我的问题是这样的:

我单击一次按钮,值似乎很好。我单击了其他应该更改此数据属性的按钮,并且在查看 dom 时它们似乎可以工作,但第二次和任何其他单击总是返回我第一次单击该按钮时的值。

编辑:我用这段代码更改了 faqid - 在其他点击事件中

$('#faqSaveBtn').attr('data-faqid', iFaqID);

【问题讨论】:

  • 不要在多个元素上使用相同的 id...id 必须是唯一的
  • 展示你如何改变faqid
  • 发布你的 html 和 js 代码来改变 data 属性的值。
  • 使用类代替class="faqSaveBtn"
  • @kenken - 为什么类比 id 重要

标签: javascript jquery


【解决方案1】:

不要使用.attr() 来设置数据属性。属性(仅对 HTML 源代码有效)与其结果属性(属性将从 HTML 源代码解析一次)之间存在差异

要更改它们,您必须使用 .prop() 或更确切地说(在数据属性的情况下).data(name, value) 来设置属性

$('#faqSaveBtn').data('faqid', iFaqID);

【讨论】:

  • 很好的答案 - 有很大帮助
  • 前段时间我做了一个测试,结果发现.attr 比使用.data 更快,所以我对所有数据属性都使用.attr。
  • 见this问答。
  • @JamieBarker,除非您一次进行 100 秒/1000 秒的属性更改,否则 data 和 attr 之间的速度差异可以忽略不计,并且如果您使用的数据多于应该存储的数据除了dom之外的其他地方
【解决方案2】:

好吧,我不知道他为什么删除它,或者其他人是否删除了,但 @newmediafreek 发布了这个

$('#faqSaveBtn').data('faqid', iFaqID);

这似乎有效,但不确定原因。显然“.attr”不再使用或折旧? (谁能跟得上?)

【讨论】:

  • 是的,attr 的用法随着时间的推移发生了很大变化,在 jquery 1.7 (afaik) 中,他们添加了 .prop 以反映属性和属性之间的差异
  • 简而言之,attr 给出静态值,prop 给出动态值
【解决方案3】:

问题是您正在更新元素属性,但随后尝试使用 jQuery 的内部.data()。

解决方案是使用.data() 而不是.attr() 更新值。

$('#faqSaveBtn').data('faqid', iFaqID);

会发生什么:

  1. 第一次单击按钮时,它有一个数据属性,$(this).data('faqid') 返回该值。 jQuery 现在已经开始在其内部数据存储中管理faqid,它不再查看元素属性的值。

  2. 您使用attr('data-faqid', iFaqID) 更新属性值。属性发生变化,但jQuery内部数据不受影响。

  3. 第二次点击来了,$(this).data('faqid')返回存储在jQuery内部数据结构中的值

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多