【问题标题】:Data Attribute does not apply css after modify the value by jQuery通过jQuery修改值后数据属性不应用css
【发布时间】:2014-04-18 10:39:09
【问题描述】:

我想按列表项 (li) 实现检查列表。我使用 data-checked 属性来保持检查状态。我使用 css 选择器设置图标颜色('true' = 黑色,'false' = 白色)。

页面显示时工作正常,所有任务都显示白色图标,因为它们的默认数据检查值为“false”。但是当我单击列表项时,数据检查值被修改为'false',但颜色没有变为黑色。

我已经通过提醒他们检查了价值。他们是正确的。

我做错了什么?

谢谢。

HTML:

<ul>
  <li data-id='1' data-checked='false' onclick='toggle_task(this);'>
    <i class='fs fa-check'></i>
    <span>Task A</span>
  </li>
  <li data-id='2' data-checked='false' onclick='toggle_task(this);'>
    <i class='fs fa-check'></i>
    <span>Task B</span>
  </li>
</ul>
<button onclick='show_checked();'>Done</button>

CSS:

ul li[data-checked='true'] i:first-child {
  color: #000000;
}
ul li[data-checked='false'] i:first-child {
  color: #eeeeee;
}

Javascript:

function toggle_task(sender) {
  if ($(sender).data('checked').toString == 'true') {
    $(sender).data('checked','false');
  } else {
    $(sender).data('checked','true');
  }
}
function show_checked() {
  $(li).each(function() {
    var text = $(this).data('id').toString() + ': ' + $(this).data('checked').toString();
    alert($(this).data('checked'));
  });
}

【问题讨论】:

  • 不明白这个问题。请说出你想要什么
  • 请证明一个有效的小提琴..
  • 我想通过 javascript 更改的 css 和数据属性设置图标颜色(点击后)。例如,单击列表项将在“真”和“假”之间切换数据检查值。图标应该随着 CSS 设置而改变颜色,但事实并非如此。
  • 只是切换一个类。为什么要涉及数据属性?

标签: jquery css custom-data-attribute


【解决方案1】:

我认为您已经混淆了HTML data-* attributes(您将其用作CSS 选择器的一部分)和jQuery data method,后者存储了与元素关联但在DOM 之外的任意JavaScript 对象。混乱可能来自于此-

.data(key) 返回:对象描述:

返回值 jQuery 集合中第一个元素的命名数据存储,如 由 data(name, value) 或 HTML5 data-* 属性设置。

如果 jQuery 集合中没有该键的值,该方法允许您从 HTML 5 data-* 属性中读取数据,但不能设置它。

你想做的是像这样使用jQuery attr method-

function toggle_task(sender) {
  if ($(sender).attr('data-checked') === 'true') {
    $(sender).attr('data-checked','false');
  } else {
    $(sender).attr('data-checked','true');
  }
}

function show_checked() {
  $('li').each(function() {
    var text = $(this).attr('id') + ': ' + $(this).attr('data-checked');
    alert($(this).attr('data-checked')); //Consider using console.log rather than alert here
  }); //Fixed your jQuery selector - required quotes for li element - is not a JavaScript variable
}

作为奖励,attr 方法返回一个字符串而不是一个对象 - 因此您可以省去 toString 调用。

我不完全确定你想在视觉上做什么,但是如果你想要一个彩色块需要元素指示它是否被检查(在这种情况下 元素不是最语义化的合适)你还需要更新你的 CSS-

/* These need to be background-color, not color */

ul li[data-checked='true'] i:first-child {
  background-color: #000000;
}
ul li[data-checked='false'] i:first-child {
  background-color: #eeeeee;
}

/* Also need to add these styles to actually see the empty elements */

.fa-check {
    display: inline-block;
    height: 0.5em;
    width: 0.5em;
}

我已经创建了 your original codethe updated code 的 JSFiddles,它可以按照我认为你想要的方式工作。

请,请,请考虑使用带有jQuery on method 的jQuery 使用不显眼的事件处理程序,而不是使用内联的“onclick”属性。这使您的 JavaScript 逻辑与您的 HTML 内容分开,请参阅http://en.wikipedia.org/wiki/Unobtrusive_JavaScript

【讨论】:

  • 谢谢。我对 HTML data-* 属性和 jQuery 数据方法感到很困惑。
猜你喜欢
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2019-08-12
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2014-03-12
相关资源
最近更新 更多