IE下option的onclick事件

最近在实现一个小功能时碰到了问题:想让用户通过点击一个下拉列表来打开一个新窗口。下面是简单的代码示例:

<select>
  <option on
click="test('www.hao123.com')"  value="www.hao123.com">hao123</option>
  <option on click="test('www.baidu.com')"  value="www.baidu.com">baidu</option>
  <option on click="test('www.google.com')"  value="www.google.com">google</option>
</select>

<script type="text/javas cript">
function test(s)
{
   window.open(s);
}
</script> 
 

但是运行是:Firefox下能正常运行,IE6、IE7下不能运行,且没有报错。

最后发现了问题所在: 在IE里,select的 option 是不支持on click 事件 的,而在Firefox和 OPERA 里, option 是支持on click 事件 的。
那么应该怎么实现原设定的功能?用Select元素的onchange事件。这时主要是考虑如何获得被选中的选项所代表的链接。
修改后代码如下:
<select id="friendLink" on change="test()>
  <option  value="www.hao123.com">hao123</option>
  <option  value="www.baidu.com">baidu</option>
  <option  value="www.google.com">google</option>
</select>

<script type="text/javas cript">
function test()
{
  var targetSlect=document.getElementById("friendLink");
  var targetHref=targetSlect.options[targetSlect.selectedIndex].value;
  window.open(targetHref);
}
</script>
 
以上的思想来自于:
Remove the events from the options , use an event directly on the select instead.

Internet Explorer treats select boxes slightly different than the rest of the document, (if you've ever read anyhting about "windowed controlls" you know what I'm talking about)

I'm thinking IE doesn't notice events in childnodes of select elements, on ly the select elements themselves.

I normally setup my functions to work depending on either of the selects value or selectedIndex attribute & using the onchange event.


PS:
虽然onchange在某些时刻可以代替 option 的click 事件 , 但是两者并无法做到完全等价. 因为onchange只有在 你点击的 option 和之前的 option 不同时才会触发. 当select当前选中的是第一项 而你再次点击第一项时, select是不会被触发的. 下面的代码演示了一种间接实现 option onclick的方法 注意:此方案只适用于下拉方式的单选select.
<script type="text/javascript" >   
 
function simOptionClick4IE(){    
    var evt=window.event  ;    
    var selectObj=evt?evt.srcElement:null;    
    // IE Only    
    if (evt && selectObj &&  evt.offsetY && evt.button!=2    
        && (evt.offsetY > selectObj.offsetHeight || evt.offsetY<0 ) ) {    
                
            // 记录原先的选中项    
            var oldIdx = selectObj.selectedIndex;    
   
            setTimeout(function(){    
                var option=selectObj.options[selectObj.selectedIndex];    
                // 此时可以通过判断 oldIdx 是否等于 selectObj.selectedIndex    
                // 来判断用户是不是点击了同一个选项,进而做不同的处理.    
                showOptionValue(option)    
   
            }, 60);    
    }    
}    
   
function showOptionValue(opt,msg){    
    var now=new Date();    
    var dt= (1900+now.getYear())+'-'+(now.getMonth()+1)+'-'+now.getDate()+    
            ' '+now.getHours()+':'+now.getHours()+':'+now.getSeconds()+'.'+now.getMilliseconds();    
    var resultZone=document.getElementById('reslut');    
    resultZone.style.margin="10px";    
    resultZone.innerHTML=dt +" 时,点击了: " + (opt.text + ' = '+opt.value);  
 //这里可以进行很多处理,比如我要点击一个OPTION就打开一个网页,则可以这样写 
    location=opt.value; 
}    
   
</script>   
 </head>   
   
 <body>   
   
  <select  οnclick="simOptionClick4IE()" >     
    <!-- 下面的 οnclick="showOptionValue( this )" 是为 ff 和 opera而准备 -->   
    <option value=http://www.5566.org οnclick="showOptionValue( this )" >aaaaa</option>   
    <option value=http://www.sina.com.cn οnclick="showOptionValue( this )" >bbbbb</option>   
    <option value="http://www.csdn.net" οnclick="showOptionValue( this )" >ccccc</option>   
  </select>   
<!--
   如果想让select 支持双击事件,则修改为:
   <select name="items"  multiple οndblclick="alert(this.value);">
       <option value="yourvalue">1</option>
       <option value="yourvalue">2</option>
   </select>
-->
<div id="reslut" ></div>   


以上补充说明来自 http://www.cnblogs.com/interdrp/archive/2009/08/03/1537930.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值