IEでswfを複数読み込んでいる場合の$('object:first').find('param')が正常に動作しない件に関して

名字を検索するとサジェストに「読み方」が表示されます。agoです。

mist.jsでIEがswfを複数読み込んでいる場合に$('object').find('param').lengthが$('object:first').find('param').lengthと同じ値になる問題がありその内容に関して調査してみました。

症状

以下のようなtagを読み込んでいるとき、IEで$('object:first').find('param').lengthすると4が返ります。
(IE以外の場合、2が返る)

サンプル

<object data="http://wonderfl.net/swf/index.swf" width="100" height="100" type="application/x-shockwave-flash">
    <param name="movie" value="http://wonderfl.net/swf/index.swf" />
    <param name="flashvars" value="object1" />
</object>
<object data="http://www.kayac.com/swf/dice.swf" width="100" height="100" type="application/x-shockwave-flash">
    <param name="movie" value="http://www.kayac.com/swf/dice.swf" />
    <param name="flashvars" value="object2" />
</object>

jQueryなしだと?

jQueryを読み込まず、document.getElementsByTagName('object')[0].getElementsByTagName('param').lengthを行っても4が返ります。

サンプル

object tagを増やすと?

以下のようなtagの場合、$('object:first').find('param').lengthは6を返します。

サンプル

<object data="http://wonderfl.net/swf/index.swf" width="100" height="100" type="application/x-shockwave-flash">
    <param name="movie" value="http://wonderfl.net/swf/index.swf" />
    <param name="flashvars" value="object1" />
</object>
<object data="http://www.kayac.com/swf/dice.swf" width="100" height="100" type="application/x-shockwave-flash">
    <param name="movie" value="http://www.kayac.com/swf/dice.swf" />
    <param name="flashvars" value="object2" />
</object>
<object data="http://www.kayac.com/swf/dice.swf" width="100" height="100" type="application/x-shockwave-flash">
    <param name="movie" value="http://www.kayac.com/swf/dice.swf" />
    <param name="flashvars" value="object3" />
</object>

何が取得されている?

var result = '';
$('object:first').find('param').each(function () {
    result += this.name + ' = ' + this.value + '\n';
});
alert(result);

上記のコードを実行すると以下のような結果が得られます。
(object tagが3つある場合)

サンプル

movie = http://wonderfl.net/swf/index.swf
flashvars = object1
movie = http://www.kayac.com/swf/dice.swf
flashvars = object2
movie = http://www.kayac.com/swf/dice.swf
flashvars = object3

原因は?

IEがobjectに対してgetElementsByTagNameを行うと、document.getElementsByTagNameと同じ結果を返しているのが原因のようです。

回避方法

$('object:first').children('param').lengthは正しく2を返すので、IEで複数objectが存在する場合にparam要素を取得したい場合、childrenを使いましょう。
(document.getElementsByTagName('object')[0].childNodes.lengthも正しい値を返します)

サンプル

カヤックではめげない技術者も募集しています!

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy