{"id":4436,"date":"2019-08-14T18:36:02","date_gmt":"2019-08-14T09:36:02","guid":{"rendered":"https:\/\/blog.capilano-fw.com\/?p=4436"},"modified":"2019-08-14T18:36:02","modified_gmt":"2019-08-14T09:36:02","slug":"%e7%b0%a1%e5%8d%98%e3%81%ab%e3%81%a7%e3%81%8d%e3%82%8b%ef%bc%81web-component%e3%81%ae%e4%bd%9c%e3%82%8a%e6%96%b9%e3%83%bb%e5%ae%9f%e4%be%8b%e5%85%a8%ef%bc%95%e4%bb%b6%ef%bc%81","status":"publish","type":"post","link":"https:\/\/blog.capilano-fw.com\/?p=4436","title":{"rendered":"\u7c21\u5358\u306b\u3067\u304d\u308b\uff01Web Component\u306e\u4f5c\u308a\u65b9\u30fb\u5b9f\u4f8b\u5168\uff15\u4ef6\uff01"},"content":{"rendered":"<p>\u3055\u3066\u3055\u3066\u3001\u3053\u306e\u30d6\u30ed\u30b0\u3067\u306f\u65e5\u9803\u304b\u3089Laravel\u3068Vue.js\u306e\u8a71\u984c\u3092\u30e1\u30a4\u30f3\u306b\u3057\u3066\u8a18\u4e8b\u3092\u516c\u958b\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u305d\u306e\u304b\u305f\u308f\u3089\u3067\u65b0\u3057\u3044\u6280\u8853\u3082\u5438\u53ce\u3057\u3066\u3044\u3053\u3046\u3068\u3044\u3046\u53d6\u308a\u7d44\u307f\u3082\u884c\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3068\u3044\u3046\u306e\u3082\u3001\u30a6\u30a7\u30d6\u958b\u767a\u3060\u3051\u306b\u9650\u3089\u305aIT\u7cfb\u306e\u30c6\u30af\u30ce\u30ed\u30b8\u30fc\u306f\u5e38\u306b\u65e9\u3044\u30b9\u30d4\u30fc\u30c9\u3067\u9032\u5316\u3057\u3066\u3044\u3066\u3001\u6570\u5e74\u7d4c\u3063\u3066\u3057\u307e\u3046\u3068\u305d\u308c\u304c\u5b8c\u5168\u306b\u53e4\u3044\u3082\u306e\u306b\u306a\u3063\u3066\u3057\u307e\u3063\u3066\u3044\u308b\u3053\u3068\u3082\u3042\u3063\u305f\u308a\u3059\u308b\u304b\u3089\u3067\u3059\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001\u305d\u3093\u306a\u89b3\u70b9\u304b\u3089\u4eca\u56de\u30c6\u30fc\u30de\u306b\u53d6\u308a\u4e0a\u3052\u308b\u306e\u306f<\/p>\n<p><strong style=\"font-size: 35px;\">Web Component\uff08\u3046\u3047\u3076\u3053\u3093\u307d\u30fc\u306d\u3093\u3068\uff09<\/strong><\/p>\n<p>\u3067\u3059\u3002<\/p>\n<p>\u30a6\u30a7\u30d6\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3068\u3044\u3046\u306e\u306f\u3001\u7c21\u5358\u306b\u3044\u3046\u3068\u72ec\u81ea\u306eHTML\u30bf\u30b0\u304c\u3064\u304b\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u6280\u8853\u306e\u3053\u3068\u3067\u3001\u4f8b\u3048\u3070\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><strong>&lt;my-tag&gt;&lt;\/my-tag&gt;<\/strong><\/pre>\n<p>\u3057\u304b\u3082\u3001<code>Vue<\/code>\u3084<code>React<\/code>\u306a\u3069\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u4f9d\u5b58\u3057\u307e\u305b\u3093\u304b\u3089\u3001\u4e00\u5ea6\u5fc5\u8981\u306a\u30a6\u30a7\u30d6\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\u4f5c\u3063\u3066\u304a\u304f\u3068\u3069\u306e\u74b0\u5883\u3067\u3082\u4f7f\u3044\u307e\u308f\u3057\u304c\u3067\u304d\u307e\u3059\u3057\u3001\u3055\u3089\u306b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u3067\u3042\u3063\u3066\u3082\u3001\u305d\u308c\u3089\u3068\u306e\u9023\u643a\u3082\u6bd4\u8f03\u7684\u7c21\u5358\u306b\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u4eca\u56de\u306f\u65e5\u672c\u8a9e\u306b\u95a2\u9023\u3059\u308b\u4ee5\u4e0b\uff15\u3064\u306e\u30a6\u30a7\u30d6\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306e\u30b3\u30fc\u30c9\u3092\u30b5\u30f3\u30d7\u30eb\u3068\u3057\u3066\u4f5c\u6210\u65b9\u6cd5\u3092\u3054\u7d39\u4ecb\u3057\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<ul>\n<li>\u5e74\u9f62\u8868\u8a18<\/li>\n<li>\u65e5\u4ed8<\/li>\n<li>\u90fd\u9053\u5e9c\u770c<\/li>\n<li>\u548c\u66a6<\/li>\n<li>\u90f5\u4fbf\u756a\u53f7<\/li>\n<\/ul>\n<p>\u203b \u306a\u304a\u3001JavaScript\u3067\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5909\u66f4\u3055\u308c\u308b\u3068\u81ea\u52d5\u7684\u306b\u518d\u8a08\u7b97\u3055\u308c\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n<h1>Web Component\u3092\u3064\u304f\u308b\u57fa\u672c<\/h1>\n<p><code>Web Component<\/code>\u3068\u3044\u3046\u5927\u5c64\u306a\u540d\u524d\u304c\u3064\u3044\u3066\u3044\u307e\u3059\u304c\u3001\u7d50\u5c40\u306e\u3068\u3053\u308dJavaScript\u3067<code>HTMLElement<\/code>\u3068\u3044\u3046\u30af\u30e9\u30b9\u3092\u62e1\u5f35\u3057\u305f\u3082\u306e\u306b\u3059\u304e\u307e\u305b\u3093\u3002<\/p>\n<p>\u305d\u306e\u305f\u3081\u3001\u5358\u306b\u300c\u30cf\u30ed\u30fc\uff01\u300d\u3068\u8868\u793a\u3059\u308b\u3060\u3051\u306e\u5358\u7d14\u306a<code>Web Component<\/code>\u3092\u3064\u304f\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a<code>JavaScript<\/code>\u30d5\u30a1\u30a4\u30eb\uff08<code>hello.js<\/code>\uff09\u3092\u3064\u304f\u308a\u307e\u3059\u3002<\/p>\n<pre><strong>class ShowHelloElement extends HTMLElement {<\/strong>\r\n\r\n<strong>    connectedCallback() {<\/strong>\r\n\r\n<strong>        this.innerText = '\u30cf\u30ed\u30fc\uff01';<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>}<\/strong>\r\n\r\n<strong>customElements.define('show-hello', ShowHelloElement);<\/strong><\/pre>\n<p>\u305d\u3057\u3066\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b<code>hello.js<\/code>\u3092\u8aad\u307f\u8fbc\u3093\u3067<code>&lt;show-hello&gt;&lt;\/show-hello&gt;<\/code>\u3092\u666e\u901a\u306eHTML\u30bf\u30b0\u3068\u3057\u3066\u8a18\u8ff0\u3059\u308b\u3060\u3051\u3067\u3059\u3002<\/p>\n<pre>&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        <strong>&lt;show-hello&gt;&lt;\/show-hello&gt;<\/strong>\r\n    &lt;\/div&gt;\r\n    <strong>&lt;script src=\"hello.js\"&gt;&lt;\/script&gt;<\/strong>\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>\u3061\u306a\u307f\u306b<strong>Web Component\u306e\u540d\u524d\u306f\u3001\u30cf\u30a4\u30d5\u30f3\u3092\u542b\u3093\u3060\u3082\u306e\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002<\/strong><\/p>\n<p>\u3064\u307e\u308a\u3001<code>&lt;hello&gt;&lt;\/hello&gt;<\/code>\u3068\u3044\u3046\u4f7f\u3044\u65b9\u306f\u3067\u304d\u305a\u3001\u3082\u3057<code>customElements.define('hello', MyElement)<\/code>\u3068\u3057\u3066\u3057\u307e\u3046\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30a8\u30e9\u30fc\u304c\u30b3\u30f3\u30bd\u30fc\u30eb\u306b\u8868\u793a\u3055\u308c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><strong>Uncaught DOMException: Failed to execute 'define' on 'CustomElementRegistry': \"hello\" is not a valid custom element name<\/strong><\/pre>\n<p>\u3067\u306f\u3001\u6b21\u304b\u3089\u306f\u672c\u984c\u306e\u65e5\u672c\u8a9e\u306b\u95a2\u9023\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3092\uff11\u3064\u305a\u3064\u7d39\u4ecb\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<h1>\u65e5\u672c\u8a9e\u306b\u95a2\u9023\u3059\u308bWeb Components<\/h1>\n<h2>\u5e74\u9f62\uff08\u624d\u3001\u6b73\uff09\u3092\u8868\u793a\u3059\u308bWeb Component<\/h2>\n<p>\u8a95\u751f\u65e5\u3092\u30bb\u30c3\u30c8\u3059\u308c\u3070\u81ea\u52d5\u7684\u306b\u305d\u306e\u4eba\u306e\u5e74\u9f62\u3092\u8a08\u7b97\u3057\u3066\u304f\u308c\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u3059\u3002\u306a\u304a\u3001\u5358\u4f4d\u306f\u300c\u624d\u300d\u3068\u300c\u6b73\u300d\u3092\u3069\u3061\u3089\u3067\u3082\u9078\u3079\u308b\u3088\u3046\u306b\u3057\u307e\u3059\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u300c\u624d\u300d\uff09<\/p>\n<p>\u307e\u305a\u306fJavaScript\u3002<\/p>\n<pre><strong>class JapaneseAgeElement extends HTMLElement {<\/strong>\r\n\r\n<strong>    static observedAttributes = ['birth-date'];<\/strong>\r\n\r\n<strong>    attributeChangedCallback(name, oldValue, newValue) {<\/strong>\r\n\r\n<strong>        if(name === 'birth-date') {<\/strong>\r\n\r\n<strong>            this.setInnerText(newValue);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    connectedCallback() {<\/strong>\r\n\r\n<strong>        const year = this.getAttribute('birth-date');<\/strong>\r\n<strong>        this.setInnerText(year);<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    setInnerText(dateString) {<\/strong>\r\n\r\n<strong>        let innerText = '';<\/strong>\r\n<strong>        const dt = new Date(dateString);<\/strong>\r\n\r\n<strong>        if(dt instanceof Date &amp;&amp; !isNaN(dt)) {<\/strong>\r\n\r\n<strong>            innerText = this.calcAge(dt);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        this.innerText = innerText + this.getUnit();<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    calcAge(date) {<\/strong>\r\n\r\n<strong>        const diff = Date.now() - date.getTime();<\/strong>\r\n<strong>        const ageDate = new Date(diff);<\/strong>\r\n<strong>        return Math.abs(ageDate.getUTCFullYear() - 1970);<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    getUnit() {<\/strong>\r\n\r\n<strong>        let unit = this.getAttribute('unit');<\/strong>\r\n\r\n<strong>        if(!unit) {<\/strong>\r\n\r\n<strong>            unit = '\u624d';<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        return unit;<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>}<\/strong>\r\n\r\n<strong>customElements.define('japanese-age', JapaneseAgeElement);<\/strong><\/pre>\n<p>\u4f7f\u3044\u65b9\u306f\u3053\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre>&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        &lt;!-- \u5e74\u9f62 --&gt;\r\n        <strong>&lt;japanese-age birth-date=\"2000-01-01\" id=\"age\"&gt;&lt;\/japanese-age&gt;<\/strong>\r\n<strong>        &lt;japanese-age birth-date=\"2010-05-031\" unit=\"\u6b73\"&gt;&lt;\/japanese-age&gt;<\/strong>\r\n    &lt;\/div&gt;\r\n    <strong>&lt;script src=\"japanese-age.js\"&gt;&lt;\/script&gt;<\/strong>\r\n    &lt;script&gt;\r\n\r\n        <strong>window.onload = () =&gt; {<\/strong>\r\n\r\n<strong>            document.getElementById('age').setAttribute('birth-date', '1990-03-31');<\/strong>\r\n\r\n<strong>        };<\/strong>\r\n\r\n    &lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>\u30bf\u30b0\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u610f\u5473\u306f\u4ee5\u4e0b\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n<ul>\n<li>birth-date\u3000\u30fb\u30fb\u30fb\u3000\u8a95\u751f\u65e5\u3002new Date()\u3067\u65e5\u4ed8\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u4f5c\u308c\u308b\u306a\u3089\u3069\u306e\u8868\u8a18\u3067\u3082\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u3002<\/li>\n<li>unit\u3000\u30fb\u30fb\u30fb\u3000\u300c\u624d\u300d\u3068\u300c\u6b73\u300d\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u3082\u3057\u4f55\u3082\u6307\u5b9a\u3055\u308c\u306a\u3044\u5834\u5408\u306f\u300c\u624d\u300d\u3068\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/li>\n<\/ul>\n<h2>\u65e5\u4ed8\u3092\u8868\u793a\u3059\u308bWeb Component<\/h2>\n<p><code>JavaScript<\/code>\u3060\u3051\u3067\u306a\u304f<code>PHP<\/code>\u306a\u3069\u3067\u3082\u305d\u3046\u3067\u3059\u304c\u3001\u958b\u767a\u3092\u3057\u3066\u3044\u3066\u5730\u5473\u306b\u3081\u3093\u3069\u3046\u306a\u306e\u304c\u3001<strong>\u65e5\u672c\u8a9e\u306e\u66dc\u65e5\u3092\u8868\u793a\u3057\u305f\u3044\u5834\u5408\u3067\u3059\u3002<\/strong>\u3082\u3061\u308d\u3093\u82f1\u8a9e\u8868\u8a18\u306a\u3089\u554f\u984c\u3042\u308a\u307e\u305b\u3093\u304c\u3001\u6708\u301c\u65e5\u3092\u8868\u793a\u3057\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u5834\u5408\u306f\u72ec\u81ea\u306b\u7528\u610f\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306f\u305d\u3046\u3044\u3063\u305f\u66dc\u65e5\u306e\u8868\u8a18\u306b\u5bfe\u5fdc\u3059\u308b\u3082\u306e\u3067\u3059\u3002<\/p>\n<pre><strong>class JapaneseDateElement extends HTMLElement {<\/strong>\r\n\r\n<strong>    static observedAttributes = ['date'];<\/strong>\r\n\r\n<strong>    attributeChangedCallback(name, oldValue, newValue) {<\/strong>\r\n\r\n<strong>        if(name === 'date') {<\/strong>\r\n\r\n<strong>            this.setInnerText(newValue);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    connectedCallback() {<\/strong>\r\n\r\n<strong>        const year = this.getAttribute('date');<\/strong>\r\n<strong>        this.setInnerText(year);<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    setInnerText(dateString) {<\/strong>\r\n\r\n<strong>        let innerText = '';<\/strong>\r\n<strong>        const dt = new Date(dateString);<\/strong>\r\n\r\n<strong>        if(dt instanceof Date &amp;&amp; !isNaN(dt)) {<\/strong>\r\n\r\n<strong>            const format = this.getFormat();<\/strong>\r\n<strong>            let date = (format) ? format : 'Y\u5e74m\u6708d\u65e5\uff08w\uff09';<\/strong>\r\n<strong>            date = date.replace('Y', dt.getFullYear());<\/strong>\r\n<strong>            date = date.replace('y', dt.getFullYear().toString().substr(-2));<\/strong>\r\n<strong>            date = date.replace('m', dt.getMonth() + 1);<\/strong>\r\n<strong>            date = date.replace('d', dt.getDate());<\/strong>\r\n<strong>            date = date.replace('w', this.getJapaneseDayOfWeek(dt.getDay()));<\/strong>\r\n<strong>            innerText = date;<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        this.innerText = innerText;<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    getFormat() {<\/strong>\r\n\r\n<strong>        return this.getAttribute('format');<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    getJapaneseDayOfWeek(dayNumber) {<\/strong>\r\n\r\n<strong>        const days = ['\u65e5', '\u6708', '\u706b', '\u6c34', '\u6728', '\u91d1', '\u571f'];<\/strong>\r\n<strong>        return days[dayNumber];<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>}<\/strong>\r\n\r\n<strong>customElements.define('japanese-date', JapaneseDateElement);<\/strong><\/pre>\n<p>\u4f7f\u3044\u65b9\u306f\u3053\u3046\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre>&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        &lt;!-- \u65e5\u4ed8 --&gt;\r\n        <strong>&lt;japanese-date date=\"2019-01-31\" format=\"Y\u5e74m\u6708d\u65e5\uff08w\uff09\" id=\"date\"&gt;&lt;\/japanese-date&gt;<\/strong>\r\n<strong>        &lt;japanese-date date=\"2019-12-31\" format=\"y.m.d\uff08w\u66dc\u65e5\uff09\"&gt;&lt;\/japanese-date&gt;<\/strong>\r\n    &lt;\/div&gt;\r\n    <strong>&lt;script src=\"japanese-date.js\"&gt;&lt;\/script&gt;<\/strong>\r\n    &lt;script&gt;\r\n\r\n       <strong> window.onload = () =&gt; {<\/strong>\r\n\r\n<strong>            document.getElementById('date').setAttribute('date', '2019-05-31');<\/strong>\r\n\r\n<strong>        };<\/strong>\r\n\r\n    &lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u610f\u5473\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n<ul>\n<li>date\u3000\u30fb\u30fb\u30fb\u3000\u65e5\u4ed8\u3002new Date()\u304c\u8aad\u307f\u53d6\u308c\u308b\u3082\u306e\u306a\u3089\u4f55\u3067\u3082OK<\/li>\n<li>format\u3000\u30fb\u30fb\u30fb\u3000\u65e5\u4ed8\u306e\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3002<code>w<\/code>\u304c\u66dc\u65e5\u306b\u306a\u308a\u307e\u3059\u3002<\/li>\n<\/ul>\n<p>\u305d\u3057\u3066\u5b9f\u969b\u306b\u5b9f\u884c\u3057\u305f\u4f8b\u306f\u3053\u3046\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><strong>2019\u5e745\u670831\u65e5\uff08\u91d1\uff09<\/strong>\r\n<strong>19.12.31\uff08\u706b\u66dc\u65e5\uff09<\/strong><\/pre>\n<h2>\u90fd\u9053\u5e9c\u770c\u3092\u8868\u793a\u3059\u308bWeb Component<\/h2>\n<p>\u4f8b\u3048\u3070\u3001JIS\u898f\u683c\uff08JIS X0401\uff09\u3067<code>13<\/code>\u306f\u6771\u4eac\u306e\u90fd\u9053\u5e9c\u770cID\u3067\u3059\u304c\u3001\u3053\u306e\u3088\u3046\u306bID\u2192\u90fd\u9053\u5e9c\u770c\u540d\u306b\u5909\u63db\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><strong>class JapanesePrefElement extends HTMLElement {<\/strong>\r\n\r\n<strong>    static observedAttributes = ['pref-id'];<\/strong>\r\n\r\n<strong>    PREFECTURES = {<\/strong>\r\n<strong>        '1': '\u5317\u6d77\u9053',<\/strong>\r\n<strong>        '2': '\u9752\u68ee\u770c',<\/strong>\r\n<strong>        '3': '\u5ca9\u624b\u770c',<\/strong>\r\n<strong>        '4': '\u5bae\u57ce\u770c',<\/strong>\r\n<strong>        '5': '\u79cb\u7530\u770c',<\/strong>\r\n<strong>        '6': '\u5c71\u5f62\u770c',<\/strong>\r\n<strong>        '7': '\u798f\u5cf6\u770c',<\/strong>\r\n<strong>        '8': '\u8328\u57ce\u770c',<\/strong>\r\n<strong>        '9': '\u6803\u6728\u770c',<\/strong>\r\n<strong>        '10': '\u7fa4\u99ac\u770c',<\/strong>\r\n<strong>        '11': '\u57fc\u7389\u770c',<\/strong>\r\n<strong>        '12': '\u5343\u8449\u770c',<\/strong>\r\n<strong>        '13': '\u6771\u4eac\u90fd',<\/strong>\r\n<strong>        '14': '\u795e\u5948\u5ddd\u770c',<\/strong>\r\n<strong>        '15': '\u65b0\u6f5f\u770c',<\/strong>\r\n<strong>        '16': '\u5bcc\u5c71\u770c',<\/strong>\r\n<strong>        '17': '\u77f3\u5ddd\u770c',<\/strong>\r\n<strong>        '18': '\u798f\u4e95\u770c',<\/strong>\r\n<strong>        '19': '\u5c71\u68a8\u770c',<\/strong>\r\n<strong>        '20': '\u9577\u91ce\u770c',<\/strong>\r\n<strong>        '21': '\u5c90\u961c\u770c',<\/strong>\r\n<strong>        '22': '\u9759\u5ca1\u770c',<\/strong>\r\n<strong>        '23': '\u611b\u77e5\u770c',<\/strong>\r\n<strong>        '24': '\u4e09\u91cd\u770c',<\/strong>\r\n<strong>        '25': '\u6ecb\u8cc0\u770c',<\/strong>\r\n<strong>        '26': '\u4eac\u90fd\u5e9c',<\/strong>\r\n<strong>        '27': '\u5927\u962a\u5e9c',<\/strong>\r\n<strong>        '28': '\u5175\u5eab\u770c',<\/strong>\r\n<strong>        '29': '\u5948\u826f\u770c',<\/strong>\r\n<strong>        '30': '\u548c\u6b4c\u5c71\u770c',<\/strong>\r\n<strong>        '31': '\u9ce5\u53d6\u770c',<\/strong>\r\n<strong>        '32': '\u5cf6\u6839\u770c',<\/strong>\r\n<strong>        '33': '\u5ca1\u5c71\u770c',<\/strong>\r\n<strong>        '34': '\u5e83\u5cf6\u770c',<\/strong>\r\n<strong>        '35': '\u5c71\u53e3\u770c',<\/strong>\r\n<strong>        '36': '\u5fb3\u5cf6\u770c',<\/strong>\r\n<strong>        '37': '\u9999\u5ddd\u770c',<\/strong>\r\n<strong>        '38': '\u611b\u5a9b\u770c',<\/strong>\r\n<strong>        '39': '\u9ad8\u77e5\u770c',<\/strong>\r\n<strong>        '40': '\u798f\u5ca1\u770c',<\/strong>\r\n<strong>        '41': '\u4f50\u8cc0\u770c',<\/strong>\r\n<strong>        '42': '\u9577\u5d0e\u770c',<\/strong>\r\n<strong>        '43': '\u718a\u672c\u770c',<\/strong>\r\n<strong>        '44': '\u5927\u5206\u770c',<\/strong>\r\n<strong>        '45': '\u5bae\u5d0e\u770c',<\/strong>\r\n<strong>        '46': '\u9e7f\u5150\u5cf6\u770c',<\/strong>\r\n<strong>        '47': '\u6c96\u7e04\u770c'<\/strong>\r\n<strong>    };<\/strong>\r\n\r\n<strong>    attributeChangedCallback(name, oldValue, newValue) {<\/strong>\r\n\r\n<strong>        if(name === 'pref-id') {<\/strong>\r\n\r\n<strong>            this.setInnerText(newValue);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    connectedCallback() {<\/strong>\r\n\r\n<strong>        const year = this.getAttribute('pref-id');<\/strong>\r\n<strong>        this.setInnerText(year);<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    setInnerText(prefId) {<\/strong>\r\n\r\n<strong>        this.innerText = (this.PREFECTURES[prefId] !== undefined) ? this.PREFECTURES[prefId] : '';<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>}<\/strong>\r\n\r\n<strong>customElements.define('japanese-pref', JapanesePrefElement);<\/strong><\/pre>\n<p>\u4f7f\u3044\u65b9\u306f\u3053\u3046\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre>&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        &lt;!-- \u90fd\u9053\u5e9c\u770c --&gt;\r\n        <strong>&lt;japanese-pref pref-id=\"1\" id=\"pref\"&gt;&lt;\/japanese-pref&gt;<\/strong>\r\n<strong>        &lt;japanese-pref pref-id=\"10\"&gt;&lt;\/japanese-pref&gt;<\/strong>\r\n    &lt;\/div&gt;\r\n    <strong>&lt;script src=\"japanese-pref.js\"&gt;&lt;\/script&gt;<\/strong>\r\n    &lt;script&gt;\r\n\r\n        <strong>window.onload = () =&gt; {<\/strong>\r\n\r\n<strong>            document.getElementById('pref').setAttribute('pref-id', 13);<\/strong>\r\n            \r\n<strong>        };<\/strong>\r\n\r\n    &lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u610f\u5473\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n<p>pref-id\u3000\u30fb\u30fb\u30fb\u3000JIS\u898f\u683c\u306e\u90fd\u9053\u5e9c\u770cID<\/p>\n<h2>\u897f\u66a6\u3092\u548c\u66a6\u306b\u5909\u63db\u3059\u308bWeb Component<\/h2>\n<p>\u6700\u8fd1\u306f\u5c11\u3057\u6e1b\u3063\u305f\u5370\u8c61\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u307e\u3060\u307e\u3060\u5143\u53f7\u3092\u4f7f\u3063\u305f\u5e74\u8868\u8a18\u306e\u9700\u8981\u306f\u591a\u304f\u3042\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3067\u306f\u3001\u305d\u3093\u306a\u897f\u66a6\u2192\u548c\u66a6\u3092\u81ea\u52d5\u8a08\u7b97\u3057\u307e\u3059\u3002<\/p>\n<pre><strong>class JapaneseYearElement extends HTMLElement {<\/strong>\r\n\r\n<strong>    BASE_YEARS = [<\/strong>\r\n<strong>        {year: 2018, name: '\u4ee4\u548c'},<\/strong>\r\n<strong>        {year: 1988, name: '\u5e73\u6210'},<\/strong>\r\n<strong>        {year: 1925, name: '\u662d\u548c'},<\/strong>\r\n<strong>        {year: 1911, name: '\u5927\u6b63'},<\/strong>\r\n<strong>        {year: 1867, name: '\u660e\u6cbb'}<\/strong>\r\n<strong>    ];<\/strong>\r\n<strong>    static observedAttributes = ['year'];<\/strong>\r\n\r\n<strong>    attributeChangedCallback(name, oldValue, newValue) {<\/strong>\r\n\r\n<strong>        if(name === 'year') {<\/strong>\r\n\r\n<strong>            this.setInnerText(newValue);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    connectedCallback() {<\/strong>\r\n\r\n<strong>        const year = this.getAttribute('year');<\/strong>\r\n<strong>        this.setInnerText(year);<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    setInnerText(year) {<\/strong>\r\n\r\n<strong>        this.innerText = (!isNaN(year)) ? this.calcJpYear(year) : '';<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    calcJpYear(year) {<\/strong>\r\n\r\n<strong>        for(let i in this.BASE_YEARS) {<\/strong>\r\n\r\n<strong>            let era = this.BASE_YEARS[i];<\/strong>\r\n<strong>            let baseYear = era.year;<\/strong>\r\n<strong>            let eraName = era.name;<\/strong>\r\n\r\n<strong>            if(year &gt; baseYear) {<\/strong>\r\n\r\n<strong>                let eraYear = year - baseYear;<\/strong>\r\n\r\n<strong>                if(eraYear === 1) {<\/strong>\r\n\r\n<strong>                    return eraName +'\u5143\u5e74';<\/strong>\r\n\r\n<strong>                }<\/strong>\r\n\r\n<strong>                return eraName + eraYear +'\u5e74';<\/strong>\r\n\r\n<strong>            }<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        return '';<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>}<\/strong>\r\n\r\n<strong>customElements.define('japanese-year', JapaneseYearElement);<\/strong><\/pre>\n<p>\u4f7f\u3044\u65b9\u306f\u3053\u3046\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre>&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        &lt;!-- \u548c\u66a6 --&gt;\r\n        <strong>&lt;japanese-year year=\"2019\" id=\"year\"&gt;&lt;\/japanese-year&gt;<\/strong>\r\n<strong>        &lt;japanese-year year=\"1989\"&gt;&lt;\/japanese-year&gt;<\/strong>\r\n    &lt;\/div&gt;\r\n    <strong>&lt;script src=\"japanese-year.js\"&gt;&lt;\/script&gt;<\/strong>\r\n    &lt;script&gt;\r\n\r\n        <strong>window.onload = () =&gt; {<\/strong>\r\n\r\n<strong>            document.getElementById('year').setAttribute('year', 2020);<\/strong>\r\n            \r\n<strong>        };<\/strong>\r\n\r\n    &lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<h2>\u90f5\u4fbf\u756a\u53f7\u3092\u30cf\u30a4\u30d5\u30f3\u3042\u308a\u306b\u7d71\u4e00\u3057\u3001\u90f5\u4fbf\u30de\u30fc\u30af\u3092\u3064\u3051\u308bWeb Component<\/h2>\n<p>\u4f8b\u3048\u3070\u3001\u90f5\u4fbf\u756a\u53f7\uff08\u30cf\u30a4\u30d5\u30f3\u3042\u308a\uff0f\u306a\u3057\u306f\u3069\u3061\u3089\u3067\u3082OK\uff09\u3092\u5165\u529b\u3059\u308b\u3060\u3051\u3067\u300c\u3012123-4567\u300d\u3068\u3044\u3046\u3088\u3046\u306a\u8868\u793a\u3092\u3059\u308b\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><strong>class JapaneseZipElement extends HTMLElement {<\/strong>\r\n\r\n<strong>    static observedAttributes = ['number'];<\/strong>\r\n\r\n<strong>    attributeChangedCallback(name, oldValue, newValue) {<\/strong>\r\n\r\n<strong>        if(name === 'number') {<\/strong>\r\n\r\n<strong>            this.setInnerText(newValue);<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    connectedCallback() {<\/strong>\r\n\r\n<strong>        const year = this.getAttribute('number');<\/strong>\r\n<strong>        this.setInnerText(year);<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>    setInnerText(zipString) {<\/strong>\r\n\r\n<strong>        let innerText = '';<\/strong>\r\n\r\n<strong>        if(zipString.length === 7 &amp;&amp; !isNaN(zipString)) {<\/strong>\r\n\r\n<strong>            innerText = '\u3012'+ zipString.substring(0, 3) +'-'+ zipString.substring(3);<\/strong>\r\n\r\n<strong>        } else if(zipString.match(\/[0-9]{3}\\-[0-9]{4}\/)) {<\/strong>\r\n\r\n<strong>            innerText = '\u3012'+ zipString;<\/strong>\r\n\r\n<strong>        }<\/strong>\r\n\r\n<strong>        this.innerText = innerText;<\/strong>\r\n\r\n<strong>    }<\/strong>\r\n\r\n<strong>}<\/strong>\r\n\r\n<strong>customElements.define('japanese-zip', JapaneseZipElement);<\/strong><\/pre>\n<p>\u4f7f\u3044\u65b9\u3067\u3059\u3002<\/p>\n<pre>&lt;html&gt;\r\n&lt;body&gt;\r\n    &lt;div&gt;\r\n        &lt;!-- \u90f5\u4fbf\u756a\u53f7 --&gt;\r\n        <strong>&lt;japanese-zip number=\"1234567\" id=\"zip\"&gt;&lt;\/japanese-zip&gt;<\/strong>\r\n<strong>        &lt;japanese-zip number=\"123-4567\"&gt;&lt;\/japanese-zip&gt;<\/strong>\r\n    &lt;\/div&gt;\r\n    <strong>&lt;script src=\"japanese-zip.js\"&gt;&lt;\/script&gt;<\/strong>\r\n    &lt;script&gt;\r\n\r\n        <strong>window.onload = () =&gt; {<\/strong>\r\n\r\n<strong>            document.getElementById('zip').setAttribute('number', '7654321');<\/strong>\r\n            \r\n<strong>        };<\/strong>\r\n\r\n    &lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<h1>\u304a\u308f\u308a\u306b<\/h1>\n<p>\u3068\u3044\u3046\u3053\u3068\u3067\u3001\u4eca\u56de\u306f<code>Web Component<\/code>\u306e\u8a71\u984c\u3092\u53d6\u308a\u4e0a\u3052\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u4f7f\u3063\u3066\u307f\u305f\u3068\u3053\u308d\u3084\u306f\u308a\u300c\u6c4e\u7528\u7684\u306b\u4f7f\u3044\u3084\u3059\u3044\uff01\u300d\u3068\u611f\u3058\u307e\u3057\u305f\u3002<\/p>\n<p>\u3068\u3044\u3046\u306e\u3082\uff08\u7e70\u308a\u8fd4\u3057\u306b\u306a\u308a\u307e\u3059\u304c\uff09\u3001<code>Web Component<\/code>\u306f<code>JavaScript<\/code>\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u4f9d\u5b58\u3057\u306a\u3044\u306e\u3067\u3069\u306e\u74b0\u5883\u3067\u3082\u4f7f\u3048\u307e\u3059\u3057\u3001<code>npm<\/code>\u306b\u30d1\u30c3\u30b1\u30fc\u30b8\u5316\u3057\u3066\u304a\u3051\u3070\u3044\u3064\u3067\u3082\u7c21\u5358\u306b\u5c0e\u5165\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u305d\u3057\u3066\u3001<a href=\"https:\/\/www.webcomponents.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">webcomponent.org<\/a>\u3068\u3044\u3046\u30b5\u30a4\u30c8\u306b\u306f\u305f\u304f\u3055\u3093\u306e<code>Web Component<\/code>\u304c\u3059\u3067\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u3066\u305d\u308c\u3089\u3092\u691c\u7d22\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\uff08\u30b5\u30f3\u30d7\u30eb\u5b9f\u884c\u3082\u3067\u304d\u307e\u3059\u3088\uff01\uff09\u306e\u3067\u3001<code>Web Component<\/code>\u304c\u76db\u308a\u4e0a\u304c\u3063\u3066\u304f\u308c\u3070\u3001\u300c\u3053\u306e\u30b5\u30a4\u30c8\u306b\u3044\u3051\u3070\u307b\u307c\u4f55\u3067\u3082\u63c3\u3063\u3066\u308b\u300d\u306a\u3093\u3066\u3053\u3068\u306b\u306a\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>\u3068\u3066\u3082\u697d\u3057\u307f\u3067\u3059\u306d\ud83d\ude0a\u2728<\/p>\n<p>\u3067\u306f\u3067\u306f\u301c\uff01<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3344 aligncenter\" src=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/04\/no_22.png\" alt=\"\" width=\"320\" height=\"320\" srcset=\"https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/04\/no_22.png 320w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/04\/no_22-150x150.png 150w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/04\/no_22-300x300.png 300w, https:\/\/blog.capilano-fw.com\/wp-content\/uploads\/2019\/04\/no_22-100x100.png 100w\" sizes=\"auto, (max-width: 320px) 100vw, 320px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u3055\u3066\u3055\u3066\u3001\u3053\u306e\u30d6\u30ed\u30b0\u3067\u306f\u65e5\u9803\u304b\u3089Laravel\u3068Vue.js\u306e\u8a71\u984c\u3092\u30e1\u30a4\u30f3\u306b\u3057\u3066\u8a18\u4e8b\u3092\u516c\u958b\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u305d\u306e\u304b\u305f\u308f\u3089\u3067\u65b0\u3057\u3044\u6280\u8853\u3082\u5438\u53ce\u3057\u3066\u3044\u3053\u3046\u3068\u3044\u3046\u53d6\u308a\u7d44\u307f\u3082 &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.capilano-fw.com\/?p=4436\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;\u7c21\u5358\u306b\u3067\u304d\u308b\uff01Web Component\u306e\u4f5c\u308a\u65b9\u30fb\u5b9f\u4f8b\u5168\uff15\u4ef6\uff01&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":4442,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[166],"class_list":["post-4436","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-web-component"],"_links":{"self":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/4436","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4436"}],"version-history":[{"count":4,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/4436\/revisions"}],"predecessor-version":[{"id":4441,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/posts\/4436\/revisions\/4441"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=\/wp\/v2\/media\/4442"}],"wp:attachment":[{"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capilano-fw.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}