如何触发使用闭包变量的事件?

How to trigger an event which uses closure variables?

在 Pixi.js 游戏中,我想模拟鼠标点击 canvas。在下面的代码中,事件处于关闭状态,但我想从外部触发它。 如果可能的话,您能帮我弄清楚如何从浏览器控制台执行此操作吗?

Jsfiddle:https://jsfiddle.net/mwLwkebo/4/

HTML:

<body>
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.5.3/pixi.min.js"></script>

JavaScript:

(function () {
  'use strict';

  const Container = PIXI.Container,
    autoDetectRenderer = PIXI.autoDetectRenderer,
    loader = PIXI.loader,
    resources = PIXI.loader.resources,
    Sprite = PIXI.Sprite,
    Point = PIXI.Point,
    width = window.innerWidth,
    height = window.innerHeight;

  const renderer = autoDetectRenderer(width, height),
    stage = new Container();

  document.body.appendChild(renderer.view);

  loader
    .add('pixel', 'https://pbs.twimg.com/profile_images/751168765191081988/3y6h5fRA.jpg')
    .load(go);

  function go() {
    const pixelContainer = new Container(),
      pixel = new Sprite(resources.pixel.texture);

    pixelContainer.name = 'pixelContainer';
    pixelContainer.interactive = true;
    pixelContainer.on('mousedown', event => {
      console.log(`Container clicked (${pixelContainer.name})`);
    });

    pixel.name = 'pixel';
    pixel.width = width;
    pixel.height = height;
    pixel.interactive = true;
    pixel.on('mousedown', event => {
      console.log(`Sprite clicked (${pixel.name})`);
    });

    pixelContainer.addChild(pixel);
    stage.addChild(pixelContainer);

    renderer.render(stage);

    setTimeout(simulateClick, 3000);
  }

  const el = document.querySelector('canvas');

  el.addEventListener('click', event => {
    console.log('Canvas clicked');
  });

  function simulateClick(mode) {
    const x = 10,
      y = 10,
      ev = new MouseEvent('click', {
        'view': window,
        'bubbles': true,
        'cancelable': true,
        'clientX': x,
        'clientY': y
      });

    if (mode) document.elementFromPoint(x, y).dispatchEvent(ev);
    else el.dispatchEvent(ev);
  };
})();

为了在 Dev Tools 的控制台中使用函数 simulateClick(),您可以:

  • 打开开发工具并转到 Sources 选项卡
  • 加载页面
  • 在源代码的 Sources 选项卡中查找函数定义的位置
  • 在那里设置一个断点
  • 重新加载页面
  • 当函数定义后执行暂停时,转到 Dev Tools 中的 Console 选项卡
  • 写入 window.simulate = simulateClick(或您要访问的任何功能)并按回车键
  • 恢复执行页面
  • 现在,在控制台中,您可以 运行 simulate(true) 并且您的功能将被执行