标签

时间:2019-02-27 11:38:56

标签: javascript native-web-component

class UioKey extends HTMLElement {
 ...
 eKey(){windows.alert('class  eKey function')}
 
 
 }
 
 function eKey(){
 eKey(){windows.alert('document eKey function')}
<template id="uio-key-temp">
    <div class="uio-key">
         <div class="i" onclick="eKey()"></div><span></span>
    </div>
</template>    

当按.i div时,忘记要触发的文档ekey,我要 要触发的类ekey() 如果我省略文件eKey()功能,我会得到函数eKey()未定义

2 个答案:

答案 0 :(得分:2)

onclick仅适用于全局定义的函数。

这是一个非常快速的技巧,允许您使用类函数。

// Class for `<uio-key>`
class UioKey extends HTMLElement {
  constructor() {
    super();

    let shadow = this.attachShadow({mode: 'open'});
    shadow.innerHTML = '<div><div on-click="eKey">div</div><span>span</span></div>';
    let a = shadow.querySelectorAll('[on-click]');
    a.forEach(
      el => {
        const handlerName = el.getAttribute('on-click');
        el.addEventListener('click', this[handlerName]);
      }
    );
  }

  eKey() {
    window.alert('class  eKey function');
  }
}

// Define our web component
customElements.define('uio-key', UioKey);
<hr/>
<uio-key></uio-key>
<hr/>

我使用自定义属性on-click作为获取所有需要单击处理程序的元素的方式,然后我将该属性的值用作并将其用作类函数名称并将其传递到{{1} }功能。

答案 1 :(得分:1)

除了@Intervalia的答案,您可以使用getRootNode()方法,然后使用host属性从Shadow DOM内部访问“自定义元素”对象。

class UioKey extends HTMLElement {
  constructor() {
    super()
    this.attachShadow( { mode: 'open' } )
        .innerHTML = uio-key-temp.innerHTML
  }
  eKey(){ 
    window.alert('class eKey function' ) 
  }
}
customElements.define( 'uio-key', UioKey )
<template id="uioKeyTemp">
    <style> .i { background: gray ; height: 10pt } </style>
    <div class="uio-key">
         <div class="i" onclick="this.getRootNode().host.eKey()"></div>
    </div>
</template>
<uio-key></uio-key>

请注意,使用内联脚本始终是一个好习惯,因为在某些情况下(出于安全原因)可以将其禁用。