IE6/7/8中Option元素未设value时Select将获取空字符串


Posted in Javascript onApril 07, 2011

如下

<!DOCTYPE HTML> 
<html> 
<head> 
<title>IE6/7/8中Option元素未设value时Select将获取空字符串</title> 
</head> 
<body> 
<select onchange="alert(this.value)"> 
<option>one</option> 
<option>two</option> 
<option>three</option> 
</select> 
</body> 
</html>

当触发change事件时,各浏览器中测试结果如下:
IE6/7/8 : 弹出空字符串
IE9/Firefox/Safari/Chrome/Opera : 弹出对应的option元素的innerText值。

很明显,IE9/Firefox/Safari/Chrome/Opera 的实现有一定道理。即当option的value和option的innerText相同时可以省略掉其value不写。这样更简洁。可惜 IE6/7/8 不支持这么写。为保证兼容所有浏览器,书写option时务必别少了value属性。

把上面的html代码稍作修改

<select onchange="alert(this.value)"> 
<option value="1">one</option> 
<option>two</option> 
<option>three</option> 
</select>

给第一个option添加了value属性。这时测试步骤如下
1,选择two
2,选择one

两次弹出的结果如下:
IE6/7/8 : [空字符串,1]
IE9/Firefox/Safari/Chrome/Opera : [two,1]

从结果上可以看出各浏览器的实现大概如下:

IE6/7/8中,如果option没有value值,那么将返回空字符串。
IE9/Firefox/Safari/Chrome/Opera 中先取option的value值,如果没有value属性,则取option的innerText值。

再修改下代码

<select onchange="alert(this.value.length)"> 
<option value="1">one</option> 
<option> two </option> 
<option>three</option> 
</select>

与上一步相比,第二个option的two两边加了空格。这次我们alert出value的长度。选择two。这时各浏览器中弹出结果如下
IE6/7/8 : 0
IE9/Firefox/Safari/Chrome/Opera : 3

IE6/7/8 中对于没有value属性的option返回空字符串,其length自然是0。这次测试关注的主要是IE9/Firefox/Safari/Chrome/Opera 这些现代浏览器。它们中返回的都是3却不是5。可以看到这些浏览器内部将two两边的空白符去掉了(trim)。

上一个测试已经提到了IE9/Firefox/Safari/Chrome/Opera中先取option的value,value属性没有再取option的innerText值。对于没有设置value属性的option,它们努力将其innerText作为value返回,甚至会自动去掉两边的空白符。

以上一直提到返回option的innerText,却不是innerHTML。再修改下代码

<select onchange="alert(this.value)"> 
<option value="1">one</option> 
<option><span>two</span></option> 
<option>three</option> 
</select>

第二个option没有value属性,其内是个span元素。这时选择two。在IE9/Firefox/Safari/Chrome/Opera中弹出的仍然是“two”,而不是“<span>two</span>”。如果alert出其length会发现仍然是3,而不是“<span>two</span>”的长度16。

可以看到当忘记写option的value时这些现代浏览器都会尽量返回正确的(客户端程序员想要的)结果value,其容错性比IE6/7/8做的更好。

相关:
各浏览器中option元素的表现差异

Javascript 相关文章推荐
超级兔子让浮动层消失的前因后果
Mar 09 Javascript
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
Aug 04 Javascript
浅谈javascript 面向对象编程
Oct 28 Javascript
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
Js+Flash实现访问剪切板操作
Nov 20 Javascript
javascript类型转换使用方法
Feb 08 Javascript
jQuery UI插件自定义confirm确认框的方法
Mar 20 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 Javascript
JavaScript中双符号的运算详解
Mar 12 Javascript
详解vuex结合localstorage动态监听storage的变化
May 03 Javascript
JavaScript门道之标准库
May 26 Javascript
我的javascript 函数链之演变
Apr 07 #Javascript
JavaScript中链式调用之研习
Apr 07 #Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 #Javascript
javascript 单例/单体模式(Singleton)
Apr 07 #Javascript
Safari5中alert的无限循环BUG
Apr 07 #Javascript
JQuery中html()方法使用不当带来的陷阱
Apr 07 #Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 #Javascript
You might like
让PHP更快的提供文件下载的代码
2012/06/13 PHP
php定时计划任务的实现方法详解
2013/06/06 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
JavaScript TO HTML 转换
2006/06/26 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
Jquery解析json字符串及json数组的方法
2015/05/29 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
关于网页中的无缝滚动的js代码
2016/06/09 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[26:40]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第一局
2016/02/25 DOTA
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python自动化测试实例解析
2014/09/28 Python
浅析Python多线程下的变量问题
2015/04/28 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
有关Python的22个编程技巧
2018/08/29 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python GUI库图形界面开发之PyQt5信号与槽多窗口数据传递详细使用方法与实例
2020/03/08 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
十佳青年个人事迹材料
2014/01/28 职场文书
售后服务承诺书范文
2014/03/26 职场文书
取保候审保证书
2014/04/30 职场文书
新品发布会策划方案
2014/06/08 职场文书
中班教师个人总结
2015/02/05 职场文书
三行辞职书范文
2015/02/26 职场文书
小学中队活动总结
2015/05/11 职场文书
大国崛起日本观后感
2015/06/02 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL