模拟鼠标点击 AS3

3
我在模拟通过API调用生成的按钮(youtube as3 API)的点击调用时遇到了困难。我没有看到任何关于为什么只要已经注册了点击处理程序,我就无法模拟单击的安全原因的提及。
基本上,我通过以下方式检查按钮是否正在侦听鼠标单击事件:
trace(generatedButton.hasEventListener(MouseEvent.CLICK)),它返回true 然后我继续调用这个:
generatedButton.dispatchEvent( new MouseEvent(MouseEvent.CLICK, true) );
但是什么也没发生,但如果我实际点击按钮,它就会起作用。是否有某些安全措施防止某些东西被虚假点击,除非它的来源严格来自系统鼠标?
我甚至在单击函数上设置了超时调用,并将光标移动到按钮上并让其触发,以防鼠标必须覆盖对象的问题,但仍然没有任何反应。我现在有点困惑。
任何帮助都将不胜感激!

你有没有解决这个问题?我碰巧处于完全相同的情况——试图模拟对YouTube生成的DisplayObjects的鼠标点击。我怀疑你是对的——这可能与安全有关(我对水印的模拟点击效果非常好,但我的广告“点击”失败了)。这太烦人了——我有一个覆盖层,我正在尝试将点击“穿透”它,以便YouTube播放器的广告能正常工作。否则,我的UI代码将变得更加混乱。 :/ - Clippy
4个回答

2

好的,我制作了一个快速FLA并编写了以下代码,分发鼠标事件完美地工作。

import flash.events.MouseEvent;

myButton.addEventListener(MouseEvent.CLICK, myClickHandler);

function myClickHandler(e:MouseEvent):void
{
    trace("clicked");
}

setTimeout(function()
{
   myButton.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
},2000);

YouTube API 必须防止此类情况发生。


是的,当我在另一个项目中手动设置它以确保我没有犯错时,它可以正常工作。我只想知道他们如何阻止它而不是系统鼠标点击。 - Stefan Woskowiak

2
以下代码在我的本地测试环境中运行良好。
btn.addEventListener( MouseEvent.CLICK, test )

function test( e:Event ):void{
    trace('asdf');
}

btn.dispatchEvent( new MouseEvent( MouseEvent.CLICK ) );

所以,我只能得出两个结论。
第一个是安全问题。Flash在触发FileReference类时存在一些安全问题,只有当堆栈中有用户点击时才能使用它。这个问题可能会延伸到任何人工调度该事件。它在我的沙盒中工作,因为这个限制在这里不适用。

第二个是你太早地分派了事件,按钮监听器还没有被添加到api的按钮中。
在这种情况下,请在舞台渲染事件被调用后再调用分派。
stage.addEventListener( Event.RENDER, test )
function test( e:Event ):void{
    btn.dispatchEvent( new MouseEvent( MouseEvent.CLICK ) );
}

这只是我的猜测。


0

不要使用dispatchEvent,因为它最终也会调用一个方法,直接调用该方法,并且由于它期望一个MouseEvent,所以执行yourClickMethod(null)


如果我创建了处理程序函数=p,那就没问题了。该按钮是由YouTube AS3 API生成的,我无法访问其源代码。因此,无论被调用的处理程序函数是什么,我都不知道。我只想触发该单击事件,就像有人物理单击它一样。 - Stefan Woskowiak
当你实际点击这个按钮时会发生什么? - Ronnie
它在YouTube播放器中播放视频,使用在创建按钮的函数中传递的YouTube ID。伪代码如下: generatedButton = youtubeVideoPlayer.createButton(video_id) - Stefan Woskowiak
那么基本上视频将自动播放,而不需要用户点击播放按钮?他们的API肯定有这个功能,对吧? - Ronnie
目前我有一个自动播放的视频,播放视频不是问题。唯一的问题是,除非用户物理点击播放按钮,否则它不会计入观看次数。因此,如果我在其他地方有自己的按钮来加载和播放视频,它不会计入观看次数。Youtube提供了一个选项,可以生成自己的按钮,可以加载和播放视频,唯一的问题是我们项目中的大量内容都必须更改才能切换到该选项。相反,我想通过单击现有接口来创建不可见的按钮并模拟点击它们。如果这有任何意义 =p - Stefan Woskowiak
哎呀,不好意思,我不是有意添加另一个答案的 :| - Ronnie

0

你无法在服务器上模拟点击事件,因为这会涉及到安全问题。你可以直接调用方法而不是分发事件。我会查找描述,但这是非法的。你可以检查 Firefox Firebug 日志以获取错误描述。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接