javascript - 如何从 onclick 调用 ES6 模块函数

标签 javascript html ecmascript-6

这个问题在这里已经有了答案:





ES6 Modules: Undefined onclick function after import

(4 个回答)


去年关闭。




我有一些带有 onclick 按钮的 HTML事件触发一个 JavaScript 函数。

当 JavaScript 函数是 ES6 模块函数时,我需要实现相同的行为。

我有一个简单的例子:

<head>
  <meta charset="utf-8">
  <script src="./js1.js"></script>
  <script type="module" src="./js2.js"></script>
  <script type="module">
    import { Es6Module3 } from "./js3.js";
    document.querySelector('#myFunction3').addEventListener('click', Es6Module3.myFunction3);
  </script>
</head>

<body>
  <button onclick="myFunction1(1)">button1</button>
  <button onclick="Es6Module2.myFunction2(2)">button2</button>
  <button type="button" id="myFunction3">button3</button>
</body>


也转载于https://jsfiddle.net/avnerm/jho6qgLu/18/

点击button1时,js1.js中的myFunction1函数被调用,传入的值正确打印到控制台。好的!

但是当单击 button2 时,我收到一条消息:

ReferenceError: Es6Module is not defined



在某些时候,我可以通过设置事件监听器来触发模块函数(button3 的用例),但它现在不起作用,我不知道如何在此实现中将参数传递给函数。

就我而言,我需要能够传入一个参数。

如何从 onclick 属性调用 ES6 模块函数,并将参数传递给它?

编辑:
@CertainPerformance,我的原始html代码涉及jinja2,它跨越代码3次(3组ids:1、2、3)

我使用了您的模式,它创建了 3 个按钮(按钮 1、按钮 2、按钮 3)和 3 个事件监听器。当我单击每个按钮时,我可以在日志中看到相应的组 ID。

这对我来说非常有用!

我只是想确认这是处理 html、jinja2 和 es6 的方式。

谢谢!

class Es6Module2 {
    static myFunction2 = function(val) {
        console.log('BEG myFunction2');
        console.log('val'); 
        console.log(val); 
    };
};

export { Es6Module2 };
{% block content %}

<div class="admin-view-groups">
    {% for group in groups %}
        <button id="button{{group.id}}">Download Group</button>
        <script type="module">
         import { Es6Module2 } from './Es6Module2.js';
         document.querySelector('#button{{group.id}}').addEventListener('click', () => {
             Es6Module2.myFunction2({{ group.id }});
         });
        </script>
    {% endfor %}
</div>

{% endblock %}

最佳答案

唯一的方法是将导入的模块函数分配给窗口对象,以便内联处理程序可以引用它:

  <script type="module">
    import { Es6Module2 } from "./js2.js";
    window.Es6Module2 = Es6Module2;
  </script>

但这违背了模块的目的。

无论如何,内联处理程序应该 never, ever使用。他们有太多的问题,包括这个(要求调用的函数在全局范围内)。最好避免使用它们并使用 addEventListener相反,要正确添加监听器。

如果要添加一个监听器,该监听器调用带有参数的函数,则只需在监听器中调用带有参数的函数:
import { fn } from './script.js';
document.querySelector('button').addEventListener('click', () => {
  fn('foo');
});

关于javascript - 如何从 onclick 调用 ES6 模块函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62032401/

相关文章:

javascript - 使用复选框交换 div 内所有内容的位置

html - 我在将滚动 div 居中时遇到问题

javascript - 导入语句将模块成员返回为未定义

javascript - 如果值为空或 0,如何更改 html select 标签的边框颜色

javascript - AJAX:仅触发错误回调

javascript - Amsul DatePicker - 如何在选择选项中加载年数?

javascript - 我们可以说 String 是 Javascript 中的对象吗?

javascript - react如何加载组件js文件

javascript - Puppeteer 搜索元素值

html - 为什么 div 和 Nav 下显示为 block ?