Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用vanilla JavaScript创建的HTML5 web组件应具有多大的通用性/特定性?_Javascript_Css_Html_Web Component_Custom Element - Fatal编程技术网

使用vanilla JavaScript创建的HTML5 web组件应具有多大的通用性/特定性?

使用vanilla JavaScript创建的HTML5 web组件应具有多大的通用性/特定性?,javascript,css,html,web-component,custom-element,Javascript,Css,Html,Web Component,Custom Element,我正在设计一个使用HTML5Web组件(HTML导入、阴影DOM、模板和自定义HTML元素)的web应用程序,这些组件是用香草JavaScript(无框架)实现的。web应用程序相当简单,必须作为单页应用程序实现。应用程序的部分要求是用户界面应该是可定制的 设计方法 该示例使用了一个自定义元素。此元素通过自定义事件(例如,newcustomevent('application-navigation',{location:'/sign'}))和方法调用(例如,document.querySelec

我正在设计一个使用HTML5Web组件(HTML导入、阴影DOM、模板和自定义HTML元素)的web应用程序,这些组件是用香草JavaScript(无框架)实现的。web应用程序相当简单,必须作为单页应用程序实现。应用程序的部分要求是用户界面应该是可定制的

设计方法

该示例使用了一个
自定义元素。此元素通过自定义事件(例如,
newcustomevent('application-navigation',{location:'/sign'})
)和方法调用(例如,
document.querySelector('application-navigation').enableSignOut())与“顶级”JavaScript(例如,JavaScript MV*术语中的“路由器”)通信。本质上,自定义事件和方法构成了元素的“公共API”

自定义的
元素可以使用不同的HTML导入包含在应用程序中。例如,使用
。只要HTML导入具有相同的方法并生成相同的自定义事件,应用程序就应该以相同的方式运行,而不管使用什么用户界面自定义

这种设计的主要好处是,它通过允许非常可定制的用户界面来满足需求——内部JavaScript事件、CSS和(阴影)DOM结构在模板之间可以完全不同。它还允许在适当的情况下重用现有库。例如,默认的<>代码> /Cord>元素可以使用推特自举的下拉HTML标记,而主题版本可以使用基础库。 但是,这个组件不是很通用。它实现了一个相当特定的目的(控制导航请求),与例如
元素不同(尽管
元素可以使用(可定制的)
元素)

重述问题


我的问题是,创建自定义元素是为了实现特定的目的,还是更通用的目的,还是与目的的广度无关?

您可以构建特定的或通用的自定义元素。两者都是相关的

但是,定义自定义元素的主要好处是能够轻松地重用它们。所以我想说自定义元素通常是泛型的

关于体系结构,您可以设计通用的技术元素,然后用它们组成特定的功能元素


无论如何,用相同的标记名创建两个不同的组件不是一个好主意。您更愿意使用另一种方法来实现您的目标(使用属性或内部元素来定制您的自定义元素,或者给它另一个名称)

下面是一个将主题定义为元素属性的示例:

//自定义元素
var proto=Object.create(HTMLElement.prototype)
proto.createdCallback=函数()
{
console.log(“{created}”)
var html=document.querySelector(“模板”)
this.innerHTML=html.innerHTML
}
proto.attributeChangedCallback=函数(attr、old、val)
{
console.log(“{changed}attr=%s,old=%s,new=%s”,attr,old,val)
}
var AN=document.registerElement(“应用程序导航”,{
原型:原型
} )
//事件
函数添加()
{
如果(AN)
document.body.appendChild(新的AN)
}
函数主题(名称)
{
var elem=document.querySelector(“应用程序导航”)
if(elem)
元素setAttribute(“主题”,名称)
}
功能负载()
{
var link=document.createElement(“链接”)
link.rel=“样式表”
link.href=“/content/green.css”
document.head.appendChild(链接)
}
应用程序导航[主题=蓝色]{
颜色:蓝色;
}
应用程序导航[主题=红色]{
颜色:红色;
}

添加自定义元素
先换成红色
外部CSS
标题
自定义元素内容


您是否有此类定制示例的链接?我已经用此类定制示例更新了我的答案。