请帮助我,我无法理解到底是什么引起了错误。代码:-
class button extends HTMLElement{
constructor(){
super();
const shadow = this.attachShadow({mode: 'open'});
const button = document.createElement('button');
button.style.cssText = 'display:block';
button.textContent = super.textContent;
shadow.appendChild(button);
}
}
var Ω = (function () {
'use strict';
/**
* Create the constructor
* @param {String} selector The selector to use
*/
var Constructor = function (selector) {
if (!selector) return;
if (selector === 'document') {
this.elems = [document];
} else if (selector === 'window') {
this.elems = [window];
} else {
this.elems = document.querySelectorAll(selector);
}
};
/**
* Run a callback on each item
* @param {Function} callback The callback function to run
*/
Constructor.prototype.each = function (callback) {
if (!callback || typeof callback !== 'function') return;
for (var i = 0; i < this.elems.length; i++) {
callback(this.elems[i], i);
}
return this;
};
/**
*
* @param {String} className
*/
Constructor.prototype.register = function (className) {
this.each(function (item) {
customElements.define(item, className);
});
return this;
};
/**
* Instantiate a new constructor
*/
var instantiate = function (selector) {
return new Constructor(selector);
};
/**
* Return the constructor instantiation
*/
return instantiate;
})();
Ω('lol-foo').register(button);
<p>Expect a button down below</p>
<lol-foo>Hey</lol-foo>
< / p>
您的帮助将帮助custags.js帮助添加类似jQuery($)的选择器。 感谢答案。
答案 0 :(得分:1)
问题是因为您要向define()
的第一个参数提供HTMLElement对象,而不是将自定义元素 name 作为字符串。作为参考,此名称必须包含连字符,并且必须小写。因此,请尝试以下操作:
customElements.define(item.tagName.toLowerCase(), className);
这是一个可行的示例:
class button extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({
mode: 'open'
});
const button = document.createElement('button');
button.style.cssText = 'display:block';
button.textContent = super.textContent;
shadow.appendChild(button);
}
}
var Ω = (function() {
'use strict';
/**
* Create the constructor
* @param {String} selector The selector to use
*/
var Constructor = function(selector) {
if (!selector) return;
if (selector === 'document') {
this.elems = [document];
} else if (selector === 'window') {
this.elems = [window];
} else {
this.elems = document.querySelectorAll(selector);
}
};
/**
* Run a callback on each item
* @param {Function} callback The callback function to run
*/
Constructor.prototype.each = function(callback) {
if (!callback || typeof callback !== 'function') return;
for (var i = 0; i < this.elems.length; i++) {
callback(this.elems[i], i);
}
return this;
};
/**
*
* @param {String} className
*/
Constructor.prototype.register = function(className) {
this.each(function(item) {
customElements.define(item.tagName.toLowerCase(), className);
});
return this;
};
/**
* Instantiate a new constructor
*/
var instantiate = function(selector) {
return new Constructor(selector);
};
/**
* Return the constructor instantiation
*/
return instantiate;
})();
Ω('lol-foo').register(button);
<p>Expect a button down below</p>
<lol-foo>Hey</lol-foo>
还值得注意的是,define()
的第二个参数是类的构造函数,因此className
的参数名是错误的。不过,在此示例中,其值是正确的。