<html>
<head>
<script language="javascript">
<!--
//假如tolen不自加,当选择多个时,只移动多个选项的最后一项,其它都删除(覆盖).
//如选择a\b\c,当移动时,仅有c.
function movelist(from,to){
 var fromList=document.myform.elements[from];//文本属性赋值变量
 var fromlen=fromList.options.length;//得到leftlist文本框的长度。即3
 
 var tolist=document.myform.elements[to];
 var tolen=tolist.options.length;//得到rightlist文本框的长度。即3 var current=fromList.selectedIndex;//这个是多选列表,只要第一个选择项的序号,实例是选择三个,第一个的序号为0。即0
 //符合条件的才执行添加和删除选项
 while(current>-1){
  var o=fromList.options[current];//leftlist列表的第一个选项
  var t=o.text;//leftlist列表的第一个选项,返回:a
  var v=o.value;//leftlist列表的第一个选项,返回:0
  var optionName=new Option(t,v);//新建一个选项,文本为a,值为0
  tolist.options[tolen]=optionName;//tolist列表,添加一个选项,其序号为3
  tolen++;//假如不自加的话,现在tolen长度依然为3.为什么一个一个添加时,可以正常添加,不会覆盖?而多个选择时,再移动,其仅有一个文本的呢?我的思想,一个也会覆盖的吧,因为是同一个序号,无自加的还是用这个序号的存储位置啦!
  fromList.options[current]=null;//在fromlist列表删除选项,删除当前所选。current不是返回为一个数字的吗?如何能删除多个的啊?因为只返回多选列表的第一个选择项的选项序号喔!
  current=fromList.selectedIndex;//再次得到fromlist列表的选项序号?不是删除了吗?那就是无选择了?
 }
}
//--></script>
</head>
<body>
<form name="myform">
  <table>
   <tr valign="top">
    <td>
     <select name="leftlist" multiple size="6" style="width:50px;">
      <option>a</option>
      <option>b</option>
      <option>c</option>
     </select>
    </td>
    <td>
      <input type="button" name="to" value=" >> " onclick="movelist('leftlist','rightlist')"><p>
      <input type="button" name="backto" value=" << " onclick="movelist('rightlist','leftlist')"><p>
    </td>
    <td>
      <select name="rightlist" multiple size="6" style="width:50px">
       <option>d</option>
       <option>e</option>
       <option>f</option>
    </td>
   </tr>
  </table>
</from>
</body>
</html>-----------------------------------------------------------------------------------------
以上代码的结果是:在左边选择了,向右移动,并在左右的选项删除.右边相反.
主要是红色部分不理解的呀`
就是tolist列表的长度自加部分开始到条件判断的结束处!
特别是current=fromlist.selectedIndex;
原文:对于多选列表,它是第一个选择项在选项数组中元序号.
例如我在左边选择两个选项,如b,c
就是返回1的吧!

解决方案 »

  1.   

    hehetolen++;//假如不自加的话,现在tolen长度依然为3.为什么一个一个添加时,可以正常添加,不会覆盖?这是因为如果你一个一个添加的话 那你就是添加一次调用一次函数movelist(from,to)从而重新获得一次var tolen=tolist.options.length 这个就是当前添加的时候的长度 所以可以正常添加 不会覆盖 不知道这样说你明白不?
      

  2.   

     while(current>-1){ 
      var o=fromList.options[current];//leftlist列表的第一个选项 
      var t=o.text;//leftlist列表的第一个选项,返回:a 
      var v=o.value;//leftlist列表的第一个选项,返回:0 
      var optionName=new Option(t,v);//新建一个选项,文本为a,值为0 
      tolist.options[tolen]=optionName;//tolist列表,添加一个选项,其序号为3 
      tolen++;//假如不自加的话,现在tolen长度依然为3.为什么一个一个添加时,可以正常添加,不会覆盖?而多个选择时,再移动,其仅有一个文本的呢?我的思想,一个也会覆盖的吧,因为是同一个序号,无自加的还是用这个序号的存储位置啦! 
      fromList.options[current]=null;//在fromlist列表删除选项,删除当前所选。current不是返回为一个数字的吗?如何能删除多个的啊?因为只返回多选列表的第一个选择项的选项序号喔! 
      current=fromList.selectedIndex;//再次得到fromlist列表的选项序号?不是删除了吗?那就是无选择了?  } 这是用循环来进行的添加和删除 fromList.options[current]=null;// 删除当前已经添加到另一个列表中的值current=fromList.selectedIndex;// 如果是多选的话 将会得到下一个被选中的值
                                        //但如果已经没有被选择项 将给current赋值为-1
                                   //退出循环  
      

  3.   

    一时间~
    未完全理解的啊~`
    tolen++;//这是我模糊中写下以下的,两种情况,1,自加情况,会不会是这样,当选择多个时,第一个符合时(选择右边,向左添加),向左添加,再在右边删除,再检多个的第二个(现已变成第一个了),符合条件,再向左添加,右边删除,真到无选择了.
    2,无自加情况,这里是右边向左移动,d,e,f都是添加到同一个选项,先添加d,再在删除d,再添加e到选项4,这时,e覆盖了d,再删除,最后添加f到选项4,再删除右边的值及文本.这么说只有把所选的操作完毕时,再重新得到选项长度.而选择一个时,又无自加,也能得到最新的选项长度,因为已退出判断,能及时获得最新列表对象的选项的长度.总的来说,当无自加时,一个一个移动,不会删除,那是因为添加一个选项和删除时,都会得到新的长度.
    以上可能写不是很好,得出心得,却不能熟悉的运用呀`~