私はこれらの属性を持つプロジェクトに取り組んでいます:
- ページを駆動するjQuery
- jQuery を使用してページに埋め込まれた Unity 3d プレーヤーと
unityobject.js
(Unity からの指示に従って) - ユーザーのカーソルが Unity のキャンバス領域内にある場合、Unity にはカスタム マウス カーソルがあります。
問題: Unity はマウス カーソルをキャプチャしますが、それを含む Web ページが非アクティブになったときに解放しません。これは、ユーザーが別のタブに切り替える (または新しいウィンドウを開く) 場合、Unity があったはずの領域にマウスを移動すると、マウス カーソルが消えることを意味します。これは Unity 3d フォーラムで説明されている Unity のバグです: 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」オブジェクトにバインドする
$( window ).live( 'focus', function() {
NAMESPACE.windowStatus( 'active' );
} );
$( window ).live( 'blur', function() {
NAMESPACE.windowStatus( 'inactive' );
} );
問題: IE7 と IE8 では、新しいブラウザー タブは別の「ウィンドウ」と見なされないため、コードは Unity に影響しません。真の別のブラウザ ウィンドウが開いている場合にのみ機能します。
方法 2 :イベントを「ドキュメント」オブジェクトにバインドする$( document ).live(...);
問題: $( document )
jQuery では実際には何もしません。難しい方法を見つけました。
ソース: http://forum.jquery.com/topic/should-document-live-map-to-document-bind-window-too
<body>
方法 3 :イベントをオブジェクトにバインドする$( 'body' ).live(...);
問題:どういうわけか IE は Unity オブジェクトが DOM の一部であることを認識しません (.live()
メソッドを使用しているにもかかわらず)。そのため、ユーザーが組み込みの Unity プレーヤーをクリックするたびに、ブラウザーはblur
イベントを Unity に送信し、マウス カーソルがロックされます ( Unity がクリックされるとconsole.log()
出力されます)。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()
。それを試しました。IEもそれが好きではありません。イベントを完全に無視し、それらのイベントはオブジェクトには使用できないと伝えます。
だから私の仲間のJavascriptグル。この問題にエレガントな方法で最善の方法でアプローチする方法について、私はアイデアがありません。任意のポインタをいただければ幸いです。