ホーム > タグ > jQuery
jQuery
IE:jQueryの.html()でobject要素を書き出すとExternalInterface.callで戻り値が取得できない
- 2008-08-29 (金)
- 技術
タイトルで殆ど説明してしまってますが、
たとえば特定のdiv要素の中に動的にobject要素を追加してFlashを読み込み、そのFlashの中で ExternalInterface.callを使って、JavaScriptの関数を呼び出しつつ戻り値を取得して、それをFlashの挙動に反映させるようなものを作ってたのですが、IE(6と7で確認)の場合のみJavaScriptの戻り値が取得できませんでした。
で、色々試してる中で、jQueryの関数を使わずにdocument.writeすればIEでも正常に動作することは突き止めましたが、
document.writeはページロード完了後に呼び出すと、その出力内容でページを書き換えてしまうため、回避方法がそれしかないとするととても不便です。
さらに色々試してみると、どうもjQueryのhtml関数が悪さをしてるようで、
例えば
$(’Flashのガワになるdiv’).html(’Flashを読み込むobject要素のhtml’);
みたいに書いてた部分を
$(’Flashのガワになるdiv’).get(0).innerHTML = (’Flashを読み込むobject要素のhtml’);
と書き換えたらうまくいきました。
jQueryとExternalInterfaceを同時に使うときは注意です。
しかし、html()で内部でinnerHTML使ってるだけだと思ってたんですけど、ちょっと違うようですね。
innerHTMLの前に正規化処理でもあって、それが悪影響を及ぼしてるのかも知れません。
実は以前、IEだけでExternalInterface.addCallBackがうまく動作しない問題もあったのですが、
今回の方法でそちらもうまく動作するかもしれません。
たとえば特定のdiv要素の中に動的にobject要素を追加してFlashを読み込み、そのFlashの中で ExternalInterface.callを使って、JavaScriptの関数を呼び出しつつ戻り値を取得して、それをFlashの挙動に反映させるようなものを作ってたのですが、IE(6と7で確認)の場合のみJavaScriptの戻り値が取得できませんでした。
で、色々試してる中で、jQueryの関数を使わずにdocument.writeすればIEでも正常に動作することは突き止めましたが、
document.writeはページロード完了後に呼び出すと、その出力内容でページを書き換えてしまうため、回避方法がそれしかないとするととても不便です。
さらに色々試してみると、どうもjQueryのhtml関数が悪さをしてるようで、
例えば
$(’Flashのガワになるdiv’).html(’Flashを読み込むobject要素のhtml’);
みたいに書いてた部分を
$(’Flashのガワになるdiv’).get(0).innerHTML = (’Flashを読み込むobject要素のhtml’);
と書き換えたらうまくいきました。
jQueryとExternalInterfaceを同時に使うときは注意です。
しかし、html()で内部でinnerHTML使ってるだけだと思ってたんですけど、ちょっと違うようですね。
innerHTMLの前に正規化処理でもあって、それが悪影響を及ぼしてるのかも知れません。
実は以前、IEだけでExternalInterface.addCallBackがうまく動作しない問題もあったのですが、
今回の方法でそちらもうまく動作するかもしれません。
interface.jsでScrollToがSafariで動作しない
- 2008-08-25 (月)
- 技術
最近はJavaScriptも良い感じのフレームワークが色々と確立されてるとは言え、マニアックな処理をする場合(特にフォーム周り)はまだまだブラウザ間差異が発生してしまいます。
だからまじめな用途でJavaScriptはやりたくねぇんだよなぁ。
という愚痴は置いといて、
タイトルの件ですが、jQuery1.2.6+interface.jsのScrollToがSafariで動作しない問題が発生しました。
interface.jsは最近のjQueryに対応してないので、お決まりのdequeueを再定義する方法で使っていましたが、Safari3でチェックするとWin版Mac版両方とも滑らかにスクロールしません。
色々調べて真正面からの問題解決を試みましたが、ちょっと時間がなかったので別のプラグインを探すと、良い感じのがありました。
その名もScrollToというプラグインです。
自分の用途には必要十分な代物です。
ScrollToプラグインを読み込んだあと、ページの読み込み完了のタイミングで以下を実行するようにすると、Safariでもうまく動きました。
このコードはこのページに載ってたのを少し改変したものです。
だからまじめな用途でJavaScriptはやりたくねぇんだよなぁ。
という愚痴は置いといて、
タイトルの件ですが、jQuery1.2.6+interface.jsのScrollToがSafariで動作しない問題が発生しました。
interface.jsは最近のjQueryに対応してないので、お決まりのdequeueを再定義する方法で使っていましたが、Safari3でチェックするとWin版Mac版両方とも滑らかにスクロールしません。
色々調べて真正面からの問題解決を試みましたが、ちょっと時間がなかったので別のプラグインを探すと、良い感じのがありました。
その名もScrollToというプラグインです。
自分の用途には必要十分な代物です。
ScrollToプラグインを読み込んだあと、ページの読み込み完了のタイミングで以下を実行するようにすると、Safariでもうまく動きました。
$(’a[href^=#]‘).click(function(){
$.scrollTo( $($(this).attr(’href’)), {speed:1000,axis:’y', queue:true} );
return false;
});
このコードはこのページに載ってたのを少し改変したものです。
ulタグの入れ子に注意
- 2008-08-12 (火)
- 技術
jQueryいじってて、たまたま気づいたことがあるのでメモ。
XHTML1.0 Transitionalで、以下のような構造のul要素、li要素がページに含まれる場合の話なのですが、
(他の場合でも同じ問題が発生するかもしれません。)
※印赤枠がul要素、青枠がli要素です。
これが、IE6、IE7では、以下のように勝手にDOMの構造が変わってしまうっぽいです。 言葉で説明すると、ul(A)の直接の要素としてul(B)が含まれる場合、そのul(B)はその直前の兄弟要素liの子要素になってしまう。というところですか。
深く検証していないので、一緒に使ってたjQueryの問題という可能性も0ではないのですが。
ドキュメントタイプによってはブラウザが勝手に構造を変えてしまうことがあるということをこの前のbrBrbr問題(XHTML1.0 Strictでpタグの中にdivタグがあるとdivタグが中身ごとpタグの外側に出されてしまう)で知ったのですが、ほんとコーディングってのは問題が出なければ超簡単だけど、問題が出たら意外と原因の解明に苦労します。
XHTML1.0 Transitionalで、以下のような構造のul要素、li要素がページに含まれる場合の話なのですが、
(他の場合でも同じ問題が発生するかもしれません。)
※印赤枠がul要素、青枠がli要素です。
liタグの中身
liタグの中身
liタグの中身
liタグの中身
liタグの中身
liタグの中身
liタグの中身
liタグの中身
liタグの中身
liタグの中身
深く検証していないので、一緒に使ってたjQueryの問題という可能性も0ではないのですが。
ドキュメントタイプによってはブラウザが勝手に構造を変えてしまうことがあるということをこの前のbrBrbr問題(XHTML1.0 Strictでpタグの中にdivタグがあるとdivタグが中身ごとpタグの外側に出されてしまう)で知ったのですが、ほんとコーディングってのは問題が出なければ超簡単だけど、問題が出たら意外と原因の解明に苦労します。
トップページ > タグ > jQuery
- 検索
- フィード
- メタ


