【问题标题】:Selecting element with variable data attribute, however some with dash选择具有可变数据属性的元素,但是有些带有破折号
【发布时间】:2018-09-13 08:32:46
【问题描述】:

所以我正在创建一个函数来选择一个单击的 span 元素,具体取决于它的数据属性和它的值。我做了这个

    function moveFilterElements(event) {

        if ($(event).hasClass('active')) {
            var dataAttributes = $(event).data(),
                dataKey = Object.keys(dataAttributes)[0],
                dataValue = dataAttributes[Object.keys(dataAttributes)[0]];
            $(event).parents('.filters-container').find('.label[data-' + dataKey + '=' + dataValue + ']').toggleClass('active');
            $(event).parents('.filters-container').find('.btn-show-filters').find('.label[data-' + dataKey + '=' + dataValue + ']').remove();
            updateFiltering();
        }
        else {
            var clonedActiveItem = $(event).clone(true);
            $(event).parents('.filters-container').find('.filters-selected').append(clonedActiveItem);
            clonedActiveItem.toggleClass('active');
            $(event).toggleClass('active');
            updateFiltering();
        }
    }

F.ex 数据属性如下所示:'data-subject' - 工作正常。

'data-category-name' 由于 HTML DOM 标准而转换为 'categoryName'。

我可以通过将它们命名为“data-categoryname”来绕过它,但这也与命名标准冲突。

那么我该如何解决这个问题?我需要一个正则表达式来再次区分这个词吗?这是唯一的方法吗?

【问题讨论】:

  • 究竟是什么将 'data-category-name' 转换为 'data-categoryName' ?它不是 HTML 标准,其中数据属性名称应全部小写。你在使用 MVC/Razor 吗?如果是这样,请使用_ 而不是- 作为名称,它会将_ 转换为-
  • 啊,感谢您的澄清 - 它专门与 .dataset() 相关 - 不是 HTML DOM 对此负责,而是 jquery .data() - 不管是什么原因你仍然有问题。
  • jQuery 调用.camelCase 内部方法来做到这一点,反向在这里,你可以使用:stackoverflow.com/questions/16640527/…

标签: javascript jquery jquery-selectors


【解决方案1】:

你的假设有点不对劲。如果您使用元素的数据集,data-category-name 只会成为 categoryName。

这不适用于 getAttribute:

const div = document.querySelector( '#data_example' );
const category_from_dataset = div.dataset;
console.log( JSON.stringify( category_from_dataset ));
// When using the dataset, we need to use javascript camelcase to access the DOMStringMap
console.log( category_from_dataset.categoryName );
// When using getAttribute, we can use the written attribute name which will automaically covnert to the correct camelcase of the dataset.
const category_from_attribute = div.getAttribute( 'data-category-name' );
console.log( category_from_attribute );
<div id="data_example" data-category-name="examples">An Example</div>

如果您不想替换数据名称,可以使用更改大写字母的函数映射数据集。这可能比解析原始 HTML 更容易:

const dataset = [
  'categoryName',
  'categoryTotal',
  'camelCase',
  'snake_case'
];
const lowercase = dataset
  .map( str => {
    const capital_letters = str.match( /[A-Z]/g );
    if ( capital_letters ) {
      return capital_letters.reduce(( result, capital ) => {
        return result.replace( capital, `-${ capital.toLowerCase() }` );
      }, str );
    }
    else return str;
  });
console.log( lowercase );

【讨论】:

  • 但是这里你用“div.getAttribute('data-category-name')”选择它,我需要拉出数据属性然后再次选择它,这就是categoryName vs category -名称冲突
  • 如果您事先不知道数据属性,那么您确实会被困在使用正则表达式解析 HTML 以获取任何以数据开头的内容。但是我的问题是,为什么?只过滤源数据并重新渲染 HTML 比实际使用原始 DOM 节点要容易得多。
  • 您的意思是重命名 HTML 中的数据属性吗?还是?
  • 我的意思是根本不过滤 DOM。有一个单独的数据模型,比如一个数组和一个渲染该数组的函数。然后,如果您必须更改某些内容,例如从表中删除行,您只需从模型数组中过滤掉这些行并重新渲染表,完全无需查找特定渲染的 HTML 节点、查找它们的类、解析它们、重新附加,等等……
  • @NicklasN 我添加了一个函数,可以将数据集中找到的名称转换为小写虚线。也许这很有用。
猜你喜欢
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2017-05-02
相关资源
最近更新 更多