【发布时间】: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