6

この小さいながらも完全な例では、デュアル リスト ボックスの UI コンポーネントを再作成しようとしています。アイテムをあるボックスから別のボックスに移動できるようにしたいだけです。(ソートを追加できればいいのですが、一度に1つのハードルだと思います!)

IE7 でこのコードに問題が発生しています (FF、Chrome、Opera はすべて正常に動作しているようです)。あるリストから別のリストにアイテムを移動するたびに、選択ボックスのサイズが変更 (縮小) されます。ここでどこが間違っているのかよくわかりません。誰か洞察を得ることができますか?

<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <title>Dual List Testing</title>
  <link type="text/css" href="css/smoothness/jquery-ui-1.7.2.custom.css" rel="stylesheet" /> 
  <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
  <script type="text/javascript" src="js/jquery-ui-1.7.2.custom.min.js"></script>
  <script type="text/javascript">
   $(function(){
    //hover states on the static widgets
    $('.dual-box > .button-panel > .button').hover(
     function() { $(this).addClass('ui-state-hover'); }, 
     function() { $(this).removeClass('ui-state-hover'); }
    );    
   });

   // Hack the buttons of the dual-list to the centre (couldn't figure out a css solution)
   $(function(){
    $('#dualBox1 .button-panel').css("padding-top",($('.button-panel').height()-(34*4))/2); // v-centre
    $('#dualBox1 .button').css("margin-left", ($('.button-panel').width()-34)/2); // h-centre
   });

   $(function(){   
    $('#dualBox1 .add').click(function () {
       $('#dualBox1 .list-box:first select option:selected').appendTo('#dualBox1 .list-box:last select');
    });
    $('#dualBox1 .remove').click(function () {
      $('#dualBox1 .list-box:last select option:selected').appendTo('#dualBox1 .list-box:first select');
    });
    $('#dualBox1 .addall').click(function () {
      $('#dualBox1 .list-box:first select option').appendTo('#dualBox1 .list-box:last select');
    });
    $('#dualBox1 .removeall').click(function () {
      $('#dualBox1 .list-box:last select option').appendTo('#dualBox1 .list-box:first select');
    });
   });
  </script>
  <style type="text/css">
   .dual-box 
   {
    width: 500px;
    height: 200px;
   }

   .dual-box > .list-box
   {
    width: 45%;
    height: 100%;

    background-color:#f00;

    float: left;
   }

   .dual-box > .list-box > select
   {
    height: 100%;
    width: 100%;   
   }

   .dual-box > .button-panel
   {
    width: 10%;
    height: 100%;

    float: left;
   }   
   .dual-box > .button-panel > .button
   {
    width:auto;

    margin-bottom: 2px;
    margin-left: auto;
    margin-right: auto;

    padding: 8px 0;
    cursor: pointer;
    float: left;
   }

   .dual-box > .button-panel > .button > span.ui-icon
   {
    float: left; 
    margin: 0 8px;
   }

  </style> 
 </head>
 <body>  
  <div id="dualBox1" class="dual-box">
   <div class="list-box">
    <select multiple="multiple">
     <option value="1">Test 1</option>
     <option value="2">Test 2</option>
     <option value="3">Test 3</option>
     <option value="4">Test 4</option>
    </select>
   </div>

   <div class="button-panel">
    <div class="button add ui-state-default ui-corner-all">
     <span class="ui-icon ui-icon-arrowthick-1-e"></span>
    </div>
    <div class="button addall ui-state-default ui-corner-all">
     <span class="ui-icon ui-icon-arrowthickstop-1-e"></span>
    </div>
    <div class="button removeall ui-state-default ui-corner-all">
     <span class="ui-icon ui-icon-arrowthickstop-1-w"></span>
    </div>
    <div class="button remove ui-state-default ui-corner-all">
     <span class="ui-icon ui-icon-arrowthick-1-w"></span>
    </div>
   </div>

   <div class="list-box">
    <select multiple="multiple">
     <option value="5">Test 5</option>
    </select>
   </div>
  </div>
 </body>
</html>

ありがとう、

更新:私はこれをあらゆる角度から見ようとしています。私のJSが原因なのだろうかと思いましたが、これをfirefoxで見ると、それが除外されるようです. ここでブラウザのバグに遭遇しましたか?

更新 2:わかりました。これは IE が select 要素にパーセンテージ サイズを設定することを好まないことを追跡しました (元はこの値をうまく取得しますが、何らかの方法で要素を操作すると壊れます)。次の 2 行の jQuery を実行すると、問題が解決するようです。

$('.dual-box > .list-box > select').height($('.dual-box').height());
$('.dual-box > .list-box > select').width(($('.dual-box').width()/100)*45);

これがハックの上にハックにならないことをちょっと望んでいましたが、残念ながらそうではないようです。この問題を解決するクリーンな方法はありますか?

4

2 に答える 2

2

少なくとも誰かが「より良い」解決策を提供するまで、私は自分の質問に答えることにしました。解決策は、JavaScript による再配置で要素の位置を「ハック」する 2 回目の更新です。

更新 2:わかりました。これは IE が select 要素にパーセンテージ サイズを設定することを好まないことを追跡しました (元はこの値をうまく取得しますが、何らかの方法で要素を操作すると壊れます)。次の 2 行の jQuery を実行すると、問題が解決するようです。

$('.dual-box > .list-box > select').height($('.dual-box').height());
$('.dual-box > .list-box > select').width(($('.dual-box').width()/100)*45);

これがハックの上にハックにならないことをちょっと望んでいましたが、残念ながらそうではないようです。この問題を解決するクリーンな方法はありますか?

于 2010-02-08T09:39:48.190 に答える
1

IE では、選択ボックスはデフォルトで最も広い項目の幅であり、ドロップダウン リストは常に選択ボックスと同じ幅です。他のほとんどのブラウザーでは、ドロップダウン リストが選択ボックスよりも広くなる可能性があるため、選択ボックスのサイズを変更しようとはしません。

選択ボックスの幅を指定すると、IE はそれに従います。最も幅の広いアイテムよりも広い幅を指定する必要があります。指定しないと、ドロップダウン リストでトリミングされます。

于 2010-02-03T11:48:04.673 に答える