flash阻止javascript事件
这是对原来帖子的编辑,现在我对这个问题有了更好的理解现在使用源代码强> 在IE中,如果body(或另一个html div有焦点),那么您可以同时按下并单击flash,然后释放。。。永远不会触发keyup事件。它不是在javascript或flash中启动的。这一关键事件在哪里 这是您得到的事件触发顺序:flash阻止javascript事件,javascript,flash,actionscript-3,internet-explorer,swfobject,Javascript,Flash,Actionscript 3,Internet Explorer,Swfobject,这是对原来帖子的编辑,现在我对这个问题有了更好的理解现在使用源代码 在IE中,如果body(或另一个html div有焦点),那么您可以同时按下并单击flash,然后释放。。。永远不会触发keyup事件。它不是在javascript或flash中启动的。这一关键事件在哪里 这是您得到的事件触发顺序: javascriptKeyEvent:bodyDn**currentFocusedElement:body javascriptKeyEvent:docDn**currentFocusedEleme
- 检查键是否在没有侦听器的情况下启动李>
- wmode不透明或直接。虽然,在不透明的情况下,复制要困难得多
- 尽快将焦点推回到javascript以赶上事件。(使用javascript中的模糊侦听器尝试此操作,并在激活as3时设置焦点。)
- jquery或prototype都无法捕获缺少的keyup
- 静态和动态swfobject发布
<html>
<head>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="swfobject.js"></script>
<script>
function ic( evt )
{ Event.observe( $("f1"), 'keyup', onKeyHandler.bindAsEventListener( this, "f1Up" ) );
Event.observe( $("f2"), 'keyup', onKeyHandler.bindAsEventListener( this, "f2Up" ) );
Event.observe( document, 'keyup', onKeyHandler.bindAsEventListener( this, "docUp" ) );
Event.observe( $("body"), 'keyup', onKeyHandler.bindAsEventListener( this, "bodyUp" ) );
Event.observe( window, 'keyup', onKeyHandler.bindAsEventListener( this, "windowUp" ) );
Event.observe( $("f1"), 'keydown', onKeyHandler.bindAsEventListener( this, "f1Dn" ) );
Event.observe( $("f2"), 'keydown', onKeyHandler.bindAsEventListener( this, "f2Dn" ) );
Event.observe( document, 'keydown', onKeyHandler.bindAsEventListener( this, "docDn" ) );
Event.observe( $("body"), 'keydown', onKeyHandler.bindAsEventListener( this, "bodyDn" ) );
Event.observe( window, 'keydown', onKeyHandler.bindAsEventListener( this, "windowDn" ) );
Event.observe( "clr", "mousedown", clearHandler.bindAsEventListener( this ) );
swfobject.embedSWF( "tmp.swf",
"f2",
"100%",
"20px",
"9.0.0.0", null, {}, {}, {} );
}
function clearHandler( evt )
{ clear( );
}
function clear( )
{ $("log").innerHTML = "";
}
function onKeyHandler( evt, dn )
{ logIt( "javascriptKeyEvent:"+dn );
}
function AS2JS( wha )
{ logIt( "actionScriptEvent::" + wha );
}
function logIt( k )
{
var id = document.activeElement;
if (id.identify)
{ id = id.identify();
}
$("log").innerHTML = k + " ** focuedElement: " + id + "<br>" + $("log").innerHTML;
}
Event.observe( window, 'load', ic.bindAsEventListener(this) );
</script>
</head>
<body id="body">
<div id="f1"><div id="f2" style="width:100%;height:20px; position:absolute; bottom:0px;"></div></div>
<div id="clr" style="color:blue;">clear</div>
<div id="log" style="overflow:auto;height:200px;width:500px;"></div>
</body>
</html>
将SWF嵌入放在任何其他JavaScript之前
swfobject.embedSWF( "tmp.swf",
"f2",
"100%",
"20px",
"9.0.0.0", null, {}, {}, {} );
我会在所有函数之外或者在一个准备文档的jQuery函数中尝试它,因为Flash得到一个无穷大的z索引,并且应该在任何其他函数之前接受键击,除非在第一个键启动时它还不存在
我的猜测是,第一把钥匙是在任何东西都能收到它之前出现的。在on document ready函数中使用jQuery尝试您的keyup事件触发器。下面是我所期望的情况:当焦点在html中时,您可以按键。单击flash对象,焦点转到该对象。当键被提起时,因为html不再具有焦点,所以它不知道键向上。你可以很容易地通过做同样的事情来测试这一点,而不是点击flash对象,点击另一个窗口并尝试同样的事情,因为这实际上就是正在发生的事情 至于flash中没有发生的key-up事件,这可能是因为它在没有得到key-down的情况下不会生成key-up事件,而它从来没有得到过key-up事件,因为焦点仍然在html中
我可以想出两种可能的解决办法。首先是要确保。第二种方法是在flash对象上覆盖一个空div,这样它就不会收到焦点。谢谢。我已经看过你的回复好几次了,我想你认为问题只是在加载的时候。如果我错了,请纠正我。加载后,问题会反复出现——您可以将焦点放在另一个html div上,然后单击/type on flash来播放“Lost the keyup”。在JavaScript中不触发keyup事件听起来像是我期望的行为。ActiveX控件使用事件,不会将它们传播回包含它们的文档。但这并不能解释为什么Flash不能正确触发事件——这是一个有趣的问题。不幸的是,我认为唯一能够回答这个问题的人是Adobe的员工:-)关于你的第二个建议——swf上的一个空div——这是可行的,但被迫使用兼容的嵌入模式会降低性能。很遗憾。关于你的第一个建议,如果你的嵌入式flash只是页面上许多元素中的一个,那么Adobe的建议效用有限。出于好奇,使用模糊事件作为按键的故障保护怎么样?也就是说,如果文档接收到一个keydown,然后是一个blur事件,手动触发keydup事件。@Codemonkey-是的,这是一个非常好的主意。绝对值得一试。
swfobject.embedSWF( "tmp.swf",
"f2",
"100%",
"20px",
"9.0.0.0", null, {}, {}, {} );