自定义鼠标光标+ IE困境
我正在开发一个具有以下属性的项目:
jQuery驱动页面
使用jQuery和
unityobject.js
嵌入到页面的Unity 3d播放器(来自Unity的每条指令)
当用户的光标位于Unity的画布区域内时,Unity会自定义鼠标光标
问题:Unity捕获鼠标光标但在包含它的网页变为非活动状态时不会释放它。这意味着如果用户切换到不同的选项卡(或打开一个新窗口),当用户将鼠标移动到Unity所在的区域时,鼠标光标就会消失。这是Unity 3d论坛中描述的统一错误:
http://forum.unity3d.com/threads/4565-Unity-Web-player-issue-mouse-hidden-for-all-new-windows
不,它仍然没有在最新版本的Unity Web客户端中修复。
为了缓解这个问题,我们决定让Unity通过Javascript监听当前的浏览器窗口状态,并根据收到的状态捕获/释放自定义鼠标光标。但还有其他问题:
Unity如何接收窗口状态:
// GetUnity returns the Unity object in the DOM<br>
NAMESPACE.windowStatus = function( statusStr ) {
GetUnity().SendMessage( "_AppShell", "OnRecieveWindowStatusFromWebPage", statusStr );
}
我试过以下方法......
方法1:将事件绑定到“窗口”对象
$( window ).live( 'focus', function() {
NAMESPACE.windowStatus( 'active' );
} );
$( window ).live( 'blur', function() {
NAMESPACE.windowStatus( 'inactive' );
} );
问题:在IE7和IE8中,新的浏览器选项卡不被视为不同的“窗口”,因此代码对Unity没有影响。它仅在打开真正单独的浏览器窗口时才有效。
方法2:将事件绑定到“文档”对象
像这样:$( document ).live(...);
问题:jQuery中的$( document )
实际上什么也没做。找到了困难的方法。
资料来源:http://forum.jquery.com/topic/should-document-live-map-to-document-bind-window-too
方法3:将事件绑定到<body>
对象
像这样:$( 'body' ).live(...);
问题:IE不知道Unity对象是DOM的一部分(尽管使用了.live()
方法)。因此,每当用户点击嵌入式Unity播放器时,浏览器就会向Unity发送一个blur
事件,并且鼠标光标被锁定(当点击Unity时,console.log()
打印出inactive
)。在某些情况下,它甚至不会释放鼠标光标,导致整个浏览器对鼠标事件没有反应;释放光标的唯一方法是在浏览器窗口外单击并再次单击浏览器。
我试过的其他事情:
window.addEventListener( 'focus', function() {...} );
document.addEventListener( 'focus', function() {...} );
document.body.addEventListener( 'focus', function() {...} );
document.getElementsByTagName('body')[0].addEventListener( 'focus', function() {...} );
问题:在这些元素上IE不支持.addEventListener()
方法! GAH!
奖金:
你越是观察,就会说:“嘿,为什么不检测Unity对象本身的鼠标点击事件而忽略blur
事件,.live()
或.bind()
事件。”试过了。 IE也不喜欢它。它完全忽略了该事件,并说这些事件不适用于该对象。
所以我的同行Javascript大师。我没有想法如何以优雅的方式最好地解决这个问题。任何指针将不胜感激。
没有找到相关结果
已邀请:
1 个回复
峨躬坎抬焚
不是IE的原生,
是。因此,当检测到IE时,我刚刚用IE特定的事件替换了所有事件监听器,因此上面的代码可以工作。 所以修改后的代码如下:
要真正完成这项工作,您必须在
方法的回调函数中创建事件附件。如果您尝试在加载Unity之前附加事件,浏览器会抱怨
是
或
。 希望这有助于有人在同样的问题上摸不着头脑。