自定义 Web 组件回调

custom web component callbacks

我很难解释这个。我正在构建一个自定义组件,在这个组件中有一个按钮。我需要能够动态设置该按钮的单击操作,以便它的操作可以根据上下文进行更改。所以如果这个组件有 2 个实例 a 和 b,每个实例都有一个不同的函数,当它们里面的按钮被点击时执行。我以为我可以将一个函数分配给组件的 属性 并从组件内部执行 属性 ,如下所示:

window.customElements.define('xmp-1', class xmp1 extends HTMLElement{
  constructor(){super();}
  connectedCallback(){
    this.innerHTML = `
      <div>
        <div id='test' style='width:70px; border:solid thin black;'>test button</div>
      </div>`;
    this.querySelector('#test').addEventListener('click', function(){
      console.log('test action');
      this.action1();
    });
  }
});

document.querySelector('xmp-1').action1 = function(){
  console.log("this is the callback");
};
<xmp-1></xmp-1>

但是当您 运行 时,您会收到一条错误消息,提示 属性 action1 不存在。

设置允许我需要的灵活性的回调的正确方法是什么?

更新:请尝试下面的代码,我在其中添加了一个绑定语句来绑定 "this"

<!DOCTYPE html>
<html>
<head>
    <title>
    </title>
</head>
<body>
    <xmp-1></xmp-1>
    <script>
        document.querySelector('xmp-1').action1 = function(){
            console.log("this is the callback");
        };
        window.customElements.define('xmp-1', class xmp1 extends HTMLElement {
            constructor() { super(); 
                this.handler = this.handler.bind(this);
            }
            handler() {
                console.log("this is the test");
                console.log('test action');
                this.action1();
            }

            connectedCallback() {
                this.innerHTML = `<div>
                    <div id='test' style='width:70px; border:solid thin black;'>test button</div>
                    </div>`;
                this.querySelector('#test').addEventListener('click',this.handler);
            }
        });
    </script>
</body>
</html>

请将代码中的 xmp-1 更改为 #test,如下所示,

<!DOCTYPE html>
<html>
<head>
    <title>
    </title>
</head>
<body>
    <xmp-1></xmp-1>
    <script>
        window.addEventListener('load', (event) => {

            document.querySelector('#test').action1 = function(){
                console.log("this is the callback");
            };

        });
        window.customElements.define('xmp-1', class xmp1 extends HTMLElement {
            constructor() { super(); }

            connectedCallback() {
                this.innerHTML = `<div>
                    <div id='test' style='width:70px; border:solid thin black;'>test button</div>
                    </div>`;
                this.querySelector('#test').addEventListener('click', function () {
                    console.log('test action');
                    this.action1();
                });
            }
        });
    </script>
</body>
</html>

或者请尝试方法 2,如下所示,您必须在自定义元素中添加名为 this.querySelector('#test').action1 的函数。

<!DOCTYPE html>
<html>
<head>
    <title>
    </title>
</head>
<body>
    <xmp-1></xmp-1>
    <script>
        window.customElements.define('xmp-1', class xmp1 extends HTMLElement {
            constructor() { super(); }

            connectedCallback() {
                this.innerHTML = `<div>
                    <div id='test' style='width:70px; border:solid thin black;'>test button</div>
                    </div>`;
                this.querySelector('#test').addEventListener('click', function () {
                    console.log('test action');
                    this.action1();
                });
                this.querySelector('#test').action1 = function() {
                    console.log('test action1');
                }
            }
        });
    </script>
</body>
</html>