【问题标题】:Override the dataset function覆盖数据集函数
【发布时间】:2023-04-08 19:28:02
【问题描述】:

有人可以建议我如何覆盖数据集原型函数吗?

这是我目前的尝试:

if (document.createElement('div').dataset === undefined) {
  console.log('IE FIX');
  HTMLElement.prototype.dataset = function() {
    console.log('Fired?');
    this.menu = 'test';
  }
}

我这样称呼它:

document.querySelectorAll('[data-menu]')[0].dataset.menu

目前我在控制台中得到的只是:

IE 修复

我至少应该得到Fired?

编辑 2

看下面的代码,这仍然不显示console.log

document.addEventListener('DOMContentLoaded', function() {

  if (document.createElement('div').dataset !== undefined) {
    Object.defineProperty(
      HTMLElement.prototype,
      'dataset',
      {
        value: function () { console.log('dsada'); }
      }
    )
  }

  document.querySelectorAll('[data-menu]')[0].dataset;

});

控制台中的一些作品:

命令:document.createElement('div').dataset

function () { console.log('dsada'); }

它应该执行该功能。

编辑 3

修改了代码,使用value 应该只是一个值,而不是一个函数。我将其更改为get,它需要一个函数并执行它。

  • 访问器描述符 = get + set(见上例)

    • get 必须是函数;它的返回值用于读取属性;如果未指定,则默认为 undefined,其行为类似于返回 undefined 的函数
    • set 必须是一个函数;在给属性赋值时,它的参数用 RHS 填充;如果未指定,则默认为 undefined,其行为类似于空函数
  • 数据描述符 = value + writable(见下例)

    • 默认未定义;如果可写、可配置和可枚举(见下文)为真,则该属性的行为类似于普通数据字段
    • 可写 - 默认为 false;如果不为真,则该属性为只读;尝试写入被忽略,没有错误*!

以下代码正确显示元素

document.addEventListener('DOMContentLoaded', function() {

  if (document.createElement('div').dataset !== undefined) {
    Object.defineProperty(HTMLElement.prototype, 'dataset', {
      get: function () {
        console.log(this);

      }
    })
  }

  document.querySelectorAll('[data-menu]')[0].dataset;

});

我现在的问题是,有没有办法处理类似的事情:

document.querySelectorAll('[data-menu]')[0].dataset.menu

像这样:

if (document.createElement('div').dataset !== undefined) {
  Object.defineProperty(HTMLElement.prototype, 'dataset', {
    get: function () {
      console.log(this);
      this.getAttribute('data-' + this.arg);
    }
  })
}

this.arg 的位置

document.querySelectorAll('[data-menu]')[0].dataset .menu

【问题讨论】:

  • 你不想放在HTMLElement原型上吗?
  • 嗯,我确实认为应该是这样,更新了我的代码
  • dataset 是一个属性,而不是一个函数。

标签: javascript


【解决方案1】:

使用Object.defineProperty:

Object.defineProperty(
    HTMLElement.prototype,
    'dataset',
    {
        value: function () { /* whatever */ }
    }
)

【讨论】:

  • 请参阅编辑 2 和建议?
  • @notgiorgi 我想看看这个,但是我不知道它在哪里处理例如下面的 menu 部分:HTMLElement.dataset.menu跨度>
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 2014-03-24
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2015-03-12
  • 2011-05-31
相关资源
最近更新 更多