javascript - 如何扩展自定义元素("vanilla"Web组件,无Polymer)

标签 javascript html web-component custom-element

我有一个自定义元素,名为x-foo。我想扩展它,并创建一个 x-bar 元素:

xBar = document.registerElement("x-bar", {
    prototype: xBarProto,
    extends: "x-foo"
});

但是这不起作用。不可能以这种方式扩展自定义元素。 Chrome 发出此错误:

Uncaught NotSupportedError: Failed to execute 'registerElement' on 'Document': Registration failed for type 'x-foo-extended'. The tag name specified in 'extends' is a custom element name. Use inheritance instead.

使用继承来代替?好吧,具体怎么样? 有什么例子吗?

注意:我没有使用聚合物。只是 Chrome 中的普通 Web 组件,没有 Polyfill。

最佳答案

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
  <title></title>
</head>
<body>
  <h1>Custom Element Inheritance</h1>
	<nav>
		<button onclick="addFoo()">Add Foo</button>
		<button onclick="addBar()">Add Bar</button>
	</nav>
	<script>

		//x-foo
		var xFooProto = Object.create( HTMLDivElement.prototype )
		xFooProto.createdCallback = function ()
		{
			this.innerHTML = "XFoo Custom Element"
		}
		var xFoo = document.registerElement( "x-foo", { prototype: xFooProto, extends: "div" } )

		function addFoo()
		{
			console.log( "addFoo()" )
			var xf = new xFoo
			document.body.appendChild( xf )
		}

		//x-bar
		xBarProto = Object.create( xFooProto )
		xBarProto.attachedCallback = function ()
		{
			this.innerHTML = "XBar Custom Element inherits from " + this.innerHTML
		}
		var xBar = document.registerElement( "x-bar", { prototype: xBarProto, extends: "div" } )

		function addBar()
		{
			console.log( "addBar()" )
			var xb = new xBar
			document.body.appendChild( xb )
		}
	</script>
</body>
</html>

您只能扩展标准 HTML 元素的受限子集,而不能扩展自定义元素。 你必须:

1) 获取 x-foo 原型(prototype)(我猜是 xFooProto)。

2)继承它:

var xBarProto = Object.create( xFooProto )

3)用其特定的方法和属性对其进行增强。

4) 将其注册为原始 x-foo 基本元素的扩展:

document.registerElement( "x-bar", { prototype: xBarProto, extends: "div" } )

关于javascript - 如何扩展自定义元素("vanilla"Web组件,无Polymer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32213051/

相关文章:

javascript - D3 甘特图中的任务默认重叠 - 需要将它们向下移动

javascript - 强制 attr=title 弹出 on 元素

javascript - 如何将数组从主机绑定(bind)到 child

javascript - 如何维护 Web 组件之间的依赖关系而不让其原型(prototype)进入全局命名空间?

javascript - 扩展 HTML 元素

javascript - 如何在映射并将 onClick 函数作为 Prop 传递后定位特定元素

javascript - 如何将字符串中的字符分配给对象中的值?

php - 如何使带有固定标题和来自mysql的表内容的表可滚动

asp.net - 我的 ASP.NET 缓存存储在服务器还是浏览器上

javascript - jQuery ("#portfolioslide").data ("AnythingSlider") 为空