2012-01-05 11 views
0

に何らかの理由でこの機能がjavascript関数ブレークドロップダウンメニューが、ちょうどFirefoxの

function fadeOUT_sect(id) { 
    if ($("div#"+id).css("display")!="none") { 
     $("div#"+id).fadeOut(); 
     $("div#"+id).find("ul").each(function() { 
      var name = $(this).attr("id"); 
      $(this).find("input").removeAttr("checked"); 
      if ($(this).find("select > option:first").val() != "-9") { 
       $(this).find("select > option:first").attr({ 
        value:"-9", 
        selected:"selected" 
       }); // $.attr() 
      } // if select 

      // I've isolated the problem to this if-test 
      if (!($(this).find('input[value="-9"]').val())) { 
      // ^I think the problem is here. 
       $(this).find('input[type="text"]').val(''); 
       $(this).append('<input name="'+name+'" type="radio" value="-9" checked="checked" />'); 
      } // if 

     }); // $.each() 
    } // if 
} // function 

当初はちょうどFirefoxで奇妙な何かをやっている、問題はこのように見えるが表示されますHTML:

<div id="2" style="display:none"> 
<ul id="state"> 
    <li>What state do you live in?</li> 
    <li><select> 
     <option value="-9" selected="selected"></option> 
     <option value="AL">Alabama</option> 
     … 
    </select></li> 
</ul> 

fadeIn()の後にdiv#2が表示され、最初の<option><option value=""></option>になります。ドロップダウンメニューをクリックすると、すべてのオプションが表示されます。問題が始まる:

オプションを選択すると、ドロップダウンは消えますが、バー/バブルは空白です(空白のオプションは選択しませんでした)。ドロップダウンをもう一度クリックすると、リスト内で自分のオプションが強調表示されます。私は離れてクリックし、バー/バブルは再び空白になります。 3回目にドロップダウンをクリックし、空白のオプションを選択し、クリックして戻ってクリックし、非空白のオプションを選択すると、突然バー/バブルにテキストが表示されます。

問題は、(Macのみ)(MacとWindowsの両方)で発生します。 Safari/Chrome、Opera、IE7 +(IE6はページを表示できません)。

EDIT私は、複数のコンピュータ上のFirefox、Safariの/クローム、オペラでこれをテストし、同じ結果(そのキャッシュなし/データの問題)を得ました。私はちょうど5から9までのFirefoxのバージョンをテストし、この問題はFirefoxの8+で発生します。http://jsfiddle.net/jshado1/EkDdB/3/

EDIT 3

EDIT 2はここjsfiddleで再現問題です。 v8のリリースノートを読むと、javascriptに「型推論」を使用し始めたようです(ただし、それが何に影響を与えるか、それがどのように丸められるかはわかりません)。

ありがとうございます!

Resolution:HTMLでselected="selected"を外し、およびJavaScript/jQueryので.attr({…}).removeAttr("selected")からselected:"selected"を削除しました。

+0

選択した要素をキャッシュしてください。 'var $ div = $( '#' + id); $ div.css ...、$ div.fadeOut ...、などです。あなたの問題を見つけることができるかどうかがわかります。 – glortho

+1

jsFiddleでこれを設定してみましょう。 – glortho

+2

あなたはどのように上記の機能を呼びますか?また、それを壊すことはありませんが、なぜ$( "#" + id)ではなく$( "div#" + id)と言いますか? (IDがユニークであることを考えると、「div」部分はまったく役に立ちません。) – nnnnnn

答えて

3

Mac版Firefox 8.0.1でエラーを再現できます。

問題は私が以下にコメントした行から来ています。

function fadeIN_sect(id) { 
    $("#" + id + ' > ul > input[value="9999"]').remove(); 
    //$("#" + id + " > ul > li > select > option:first").attr("value", "").removeAttr("selected"); 
    $("#" + id).fadeIn(); 
} 

私がその行をコメントアウトすると、うまく動作します。行を分離し、各アクションを1つずつデバッグすることができます。

編集:テストはremoveAttr呼び出しを指しているようです。また、上記のコメントに記載されているように、すべてのセレクタをキャッシュすることを忘れないでください。それらを選択し続けることは非常に非効率的です。

+0

Yep! 'selected ="が選択されました。私はそれがjavascript 'removeAttr(" selected ")'かhtmlが 'selected =" selected "'を持っていたかどうかはわかりませんが、htmlからハードコードされた属性を削除した後はjavascriptは必要ありませんでした。 (私は 'selected'をハードコードしていたので、デフォルトで選択する要素のブラウザの選択に頼る必要はありません)。ありがとう!! +50 – jacob

+0

ああ、私はこれをどうすればいいのか分かっていますか? – jacob

+0

@jacobブラウザは最初の値以外を選択しないと確信していますか?そうでなければ証拠はありますか? – Ben

関連する問題