Javascript 自定义鼠标光标+;悲哀

Javascript 自定义鼠标光标+;悲哀,javascript,internet-explorer,unity3d,unityscript,Javascript,Internet Explorer,Unity3d,Unityscript,我正在从事一个具有以下属性的项目: jQuery驱动页面 使用jQuery和unityobject.js(根据Unity的指令)将Unity 3d播放器嵌入页面 当用户的光标位于Unity的画布区域内时,Unity具有自定义鼠标光标 问题:Unity捕获鼠标光标,但在包含鼠标光标的网页处于非活动状态时不会释放鼠标光标。这意味着,如果用户切换到其他选项卡(或打开一个新窗口),当用户将鼠标移到Unity所在的区域时,鼠标光标将消失。这是unity 3d论坛中描述的unity bug: 不,在最新版

我正在从事一个具有以下属性的项目:

  • jQuery驱动页面
  • 使用jQuery和
    unityobject.js
    (根据Unity的指令)将Unity 3d播放器嵌入页面
  • 当用户的光标位于Unity的画布区域内时,Unity具有自定义鼠标光标
  • 问题:Unity捕获鼠标光标,但在包含鼠标光标的网页处于非活动状态时不会释放鼠标光标。这意味着,如果用户切换到其他选项卡(或打开一个新窗口),当用户将鼠标移到Unity所在的区域时,鼠标光标将消失。这是unity 3d论坛中描述的unity bug:

    不,在最新版本的UnityWeb客户端中,它仍然没有被修复

    为了缓解这个问题,我们决定让Unity通过Javascript监听当前的浏览器窗口状态,并根据收到的状态捕获/释放自定义鼠标光标。但还有其他问题:

    Unity如何接收窗口状态:

    // GetUnity returns the Unity object in the DOM<br>
    NAMESPACE.windowStatus = function( statusStr ) {
        GetUnity().SendMessage( "_AppShell", "OnRecieveWindowStatusFromWebPage", statusStr );
    }
    
    问题:在IE7和IE8中,新的浏览器选项卡不被视为不同的“窗口”,因此代码对Unity没有影响。它仅在真正单独的浏览器窗口打开时才起作用


    方法2:将事件绑定到“文档”对象 像这样:
    $(document).live(…)

    问题:
    $(文档)
    在jQuery中实际上什么都不做。找到了艰难的道路。
    资料来源:


    方法3:将事件绑定到
    对象 像这样:
    $('body').live(…)

    问题:不知何故,IE无法识别Unity对象是DOM的一部分(尽管使用了
    .live()
    方法)。因此,每次用户单击嵌入式Unity播放器时,浏览器都会向Unity发送一个
    blur
    事件,鼠标光标会被锁定(
    console.log()
    在单击Unity时打印出
    inactive
    )。在某些情况下,它甚至不会释放鼠标光标,导致整个浏览器对鼠标事件没有响应;释放光标的唯一方法是在浏览器窗口外单击,然后再次单击浏览器)


    我尝试过的其他事情:

    window.addEventListener( 'focus', function() {...} );
    document.addEventListener( 'focus', function() {...} );
    document.body.addEventListener( 'focus', function() {...} );
    document.getElementsByTagName('body')[0].addEventListener( 'focus', function() {...} );
    
    问题:
    .addEventListener()
    方法在IE中根本不支持这些元素<强>嘎


    奖金:
    你的观察力越强的人可能会插嘴说,“嘿,为什么不检测Unity对象本身上的鼠标点击事件,忽略
    blur
    事件,
    .live()
    .bind()
    事件。”试过了。我也不喜欢。它完全忽略事件,并表示这些事件对对象不可用


    所以,我的Javascript大师们。我不知道如何以优雅的方式最好地解决这个问题。如有任何提示,将不胜感激。

    问题已解决。Unity3d的论坛在某处提供了一个解决方案。。。

    其要点是:框架并不总是答案。回到根上来。

    我忘了,
    .addEventListener()
    不是IE的本机,
    .attachEvent()
    是。因此,如果我在检测到IE时将所有事件侦听器替换为特定于IE的事件侦听器,我上面的代码就可以工作了

    因此,修改后的代码如下所示:

    if ( navigator.appName == 'Microsoft Internet Explorer' ) {
        GetUnity().attachEvent( 'onmouseover', onFocus, false );
        GetUnity().attachEvent( 'onfocusin', onFocus, false );
        GetUnity().attachEvent( 'onmouseout', onBlur, false );
    } else {
        // Netscape, Firefox, Mozilla, Chrome and Safari.
        GetUnity().addEventListener( 'mouseover', onFocus, false );
        GetUnity().addEventListener( 'focus', onFocus, false );
        GetUnity().addEventListener( 'mouseout', onBlur, false );
    }
    
    function onFocus() {
        NAMESPACE.WindowStatus( 'active' );
    }
    
    function onBlur() {
        NAMESPACE.WindowStatus( 'inactive' );
    }
    
    要真正做到这一点,您必须在
    unityobject.embedUnity()方法的回调函数中创建事件附件。如果在加载Unity之前尝试附加事件,浏览器将抱怨
    GetUnity()
    null
    未定义

    希望这能帮助那些有同样问题的人

    if ( navigator.appName == 'Microsoft Internet Explorer' ) {
        GetUnity().attachEvent( 'onmouseover', onFocus, false );
        GetUnity().attachEvent( 'onfocusin', onFocus, false );
        GetUnity().attachEvent( 'onmouseout', onBlur, false );
    } else {
        // Netscape, Firefox, Mozilla, Chrome and Safari.
        GetUnity().addEventListener( 'mouseover', onFocus, false );
        GetUnity().addEventListener( 'focus', onFocus, false );
        GetUnity().addEventListener( 'mouseout', onBlur, false );
    }
    
    function onFocus() {
        NAMESPACE.WindowStatus( 'active' );
    }
    
    function onBlur() {
        NAMESPACE.WindowStatus( 'inactive' );
    }