使用jQuery将选项附加到select会调整大小吗?

时间:2010-02-03 11:37:25

标签: jquery jquery-ui internet-explorer-7 multi-select

在这个小而完整的例子中,我试图重新创建一个双列表框UI组件。我只希望能够将物品从一个盒子移动到另一个盒子。 (如果我可以添加排序,那会很好,但我认为一次只有一个障碍!)

我在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元素上设置的百分比大小(虽然它从原来的那个方面选择了这个值,但是在你操作它之后它会中断不知何故,元素)。执行以下两行jQuery似乎解决了这个问题:

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

我有点希望这不会成为一个黑客攻击,但不幸的是它似乎。有没有人有一个干净的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

我决定回答我自己的问题,至少在有人提供“更好”的解决方案之前。解决方案是我的第二次更新,我通过javascript重新定位元素的位置“

  

更新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);
     

我有点希望不这样做   成为一个黑客攻击,但是   不幸的是它似乎。是否   任何人都有一个干净的解决方法   这个问题?

答案 1 :(得分:1)

在IE中,默认情况下,选择框是最宽项目的宽度,它的下拉列表始终与选择框的宽度相同。在大多数其他浏览器中,下拉列表可以比选择框宽,因此他们不急于更改选择框的大小。

如果为选择框指定宽度,则IE应遵循该宽度。您必须指定宽度大于最宽项目的宽度,否则它们将在下拉列表中被裁剪。