`

safari 3 的一个bug : 关于select的 (我怀疑这个bug我是全球首发)

阅读更多
在给gt grid编写editor时发现的  safari 版本 3.0.4

这个bug 简单点说就是,
当select下的所有option的 selected属性都是 false时,
大多数浏览器 都会将 选项指向上次选择的项,而safari会生造出一个空的option来,
而且这种情况不是总发生, 什么时候发生 什么时候不发生不好说 看后面的代码注释吧

演示文件见附件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<script type="text/javascript">
	function init(selectObj) {
		
		// 对于s1 safari的做法和其他浏览器一致, 都是默认选中第一个
		selectObj=document.getElementById('s1');
		for (var i=0; i<selectObj.options.length; i++) {
			selectObj.options[i].selected=false;
		}


// 对于s2 safari的做法就出现问题了, 会生造出一个
		selectObj=document.getElementById('s2');
		for (var i=0; i<selectObj.options.length; i++) {
			selectObj.options[i].selected=false;
		}

alert(selectObj.value)  // 注意这个alert.


// 对于s3 safari的做法本来应该和 s2 一样 但是由于多了一个上面的alert, 一切又不同额 FT!!!!
// 如果你把上面的 alert 注释了 那么 s3 和 s2 完全一样 

		selectObj=document.getElementById('s3');
		for (var i=0; i<selectObj.options.length; i++) {
			selectObj.options[i].selected=false;
		}
	}
</script>

 </head>

 <body onload="init();">
	<select id="s1">
		<option value="1" selected="selected" >aaaa</option>
		<option value="2">bbb</option>
		<option value="3">ccc</option>
    </select>

<br/><br/>

	<select id="s2">
		<option value="11" >zzz</option>
		<option value="22">xxxx</option>
		<option value="33">ccc</option>
    </select>


<br/><br/>

	<select id="s3">
		<option value="111" >bbb</option>
		<option value="222">nnn</option>
		<option value="333">mmm</option>
    </select>

 </body>
</html>


分享到:
评论
5 楼 hax 2008-03-05  
测试代码:
<!DOCTYPE html>
<html>
<head>
<title>Test SELECT of Safari
<script>
	
	function info(o) {
		if (o === undefined) return 'UNDEFINED';
		if (o === null) return 'NULL';
		if (o === '') return  'EMPTY';
		return o;
	}
	
	function out(msg) {
		out.buffer.push(msg);
	}
	out.buffer = [];
	out.show = function () {
		document.getElementById('stdout').innerHTML = out.buffer.join('');
	}
	
	function testSelect(id) {
		var s = document.getElementById(id);
		
		out('test ' + id);
		out('<br/>');
		out('options[0].selected = ');
		out(s.options[0].selected);
		out('<br/>');
		out('options[0].selected = ');
		out(s.options[0].selected);
		out('<br/>');
		out('value = ');
		out(s.value);
		out('<br/>');
		out('options[0].selected = ');
		out(s.options[0].selected);
		out('<br/>');
		out('selectedIndex = ');
		out(s.selectedIndex);
		out('<br/>');
		out('<br/>');
		
		/*
		s.options[s.selectedIndex].selected = false;
		out(s.selectedIndex);
		*/
	}
	
	
	window.addEventListener('load', function() {
		//testSelect('s4');
	}, false);
	
	window.addEventListener('load', function() {
		testSelect('s5');
	}, false);
	
</script>

 </head>

<body>

<div id="stdout"></div>

<form>
	<select id="s1">
		<option value="1" selected="selected">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
	</select>
	<script>testSelect('s1');</script>
	<br/>
	<select id="s2">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
	</select>
	<script>testSelect('s2');</script>
	<br/>
	<select id="s3">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
	</select>
	<script>setTimeout(function(){testSelect('s3');}, 1);</script>
	<br/>
	<select id="s4">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
	</select>
	<br/>
	<select id="s5">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
	</select>
	<br/>
</form>

<p><input type="button" onclick="out.show()" value="show log"/></p>

</body>
</html>
4 楼 fins 2008-03-05  
恩 我现在就是这么做的 唉 郁闷啊 凭空又多了好多行代码

以精简代码为目的的重构 但是随着测试的深入 不停的添加代码
现在已经比"精简"前 多了上百行的代码了 :'(
3 楼 hax 2008-03-05  
那你就手动判断一下呀,如果值不符合任何一个option就设成默认的那个(比如第一个)。
2 楼 fins 2008-03-05  
我是在 load之后的一个复杂的例子发现的这个bug
不在load里的话  添加 空option的问题还是存在的


我是在做可编辑列表的时候发现的

点击一个单元格  如果这个单元格对应的编辑器是 select  那么就吧单元格的值 set给select
这时候如果 单元格的值  不是select的选项中的任何一个 会加入 空option
这个比较郁闷啊
1 楼 hax 2008-03-05  
你不要在load事件中测,如果在load之后测试,会看到不同的结果。
Safari的行为和FF不一样,它允许selectedIndex=-1,即一个都不选。

但是如果初始标签上没有selected,Safari会执行一个初始化过程,将第一个select起来。

你描述的行为貌似是因为这个初始化工作在load的时候还没有完成。
alert会延时,所以第一次alert之后,初始化工作就完成了。这是为什么alert会影响你的测试结果。

不过,任何时候只要你访问select上的selectedIndex,就都会进行初始化过程。


我个人认为这可以算一个bug,但是只在极端情况下出现。

相关推荐

    duilib webkit内核浏览器控件(修复select标签bug)

    WebKit是一个开源的渲染引擎,被广泛用于Safari、Chrome等浏览器,以提供高效、稳定和标准兼容的网页显示。在Duilib中集成WebKit内核,可以实现与现代网页技术的无缝对接,例如HTML5、CSS3以及JavaScript。 标题中...

    bootstrap-select-1.12.4

    10. **版本升级**:1.12.4是该插件的一个稳定版本,修复了一些已知的bug并增强了性能。在升级到新版本时,需要检查官方的更新日志,了解可能的API变化和新增特性。 综上所述,Bootstrap Select 1.12.4是Bootstrap...

    bootstrap-select-1.13.0-dev

    在"bootstrap-select-1.13.0-dev"这个版本中,我们看到了一个开发版的源码,这通常意味着它包含了最新的特性、修复的bug以及可能尚未正式发布的改进。 1. **多选功能**:Bootstrap Select允许用户同时选择多个选项...

    解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)

    本文将详细讨论一个特定的JavaScript问题,即在Internet Explorer(IE)浏览器中使用`innerHTML`属性向`&lt;select&gt;`元素插入`&lt;option&gt;`标签时遇到的bug,以及如何解决这个bug以实现跨浏览器兼容性,包括IE、Firefox、...

    SELECT在浏览器中相关Bug整理

    这个问题可以通过使用JQueryUI的一个技巧来解决,即在IE6下显示弹出层时,将`SELECT`元素临时隐藏,以避免它遮挡其他内容。 其次,IE7及以下版本的一个问题在于,即使`SELECT`元素被`disabled`属性禁用,其内部的`...

    CSS3 重置iphone浏览器按钮input,select等表单元素的默认样式

    今天在公司写了一个登录页面效果,让我碰到一个怪异的问题——“表单中的input[type="submit"]和input[type="reset"]按钮在iPhone的safari浏览器下圆角有一个bug”。下面我来简单的描述一下这个bug的样子: 初载入...

    Html5小游戏之小小塔防

    main:用于绘制敌人与子弹,因为这两个基本上会一直变,需要一直重画。 tower:用于绘制塔,塔基本上画上去后,不会动,最多也是会给擦出。 select:用于绘制塔的选择区域,攻击范围等,会根据用户的操作而进行重...

    jQuery 1.8 正式版

    当你在 .css() 和 .animate() 中使用 CSS 属性时,jQuery 会自动根据浏览器类型来设置一些前缀,例如 .css("user-select", "none") 在 Chrome/Safari 会变成 "-webkit-user-select", 在 Firefox 变成 "-moz-user-...

    ExtAspNet_v2.3.2_dll

    -修正extjs最新版本(v3.2.2)中的一个bug,如果下拉列表中存在两个相同的Text,则SelectedValue返回值永远是第一个Text的值(feedback:ben.zhou)。 -应用补丁#6593, #6621(feedback:vbelyaev)。 +修正IE7下Grid分页...

    jquery v1.9.1 免费版

    jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正了使用IFrameUrl的Tab在切换过程中会重复加载的问题,这是一个在v2.1.6引入的问题(feedback:eroach)。 -修正了启用AutoPostBack的Grid,其RowClick会覆盖LinkButtonField, HyperLinkField, CheckBoxField的...

    带自动检索的多选下拉框

    这个版本号(v1.7.2)表示这是一个经过多次迭代和优化的稳定版本,可能包含了一些bug修复和性能提升。 在实际应用中,开发者需要将这个组件的样式和脚本文件引入到HTML页面中,并按照提供的API或示例代码配置和调用...

    基于Bootstrap里面的Button dropdown打造自定义select

    这段代码包含一个按钮(`.btn.dropdown-toggle`)和一个下拉菜单(`.dropdown-menu`)。按钮内的`&lt;span class="caret"&gt;&lt;/span&gt;`是用来显示下拉箭头的。每个`&lt;li&gt;`元素代表一个选项,可以通过`value`属性关联相应的值...

    chosen下拉多选

    1. **多选支持**:Chosen允许用户在一个下拉框中选择多个项,通过复选框的形式展示,使得多选操作更加直观。 2. **搜索功能**:在大型选项列表中,Chosen提供了一个内置的搜索框,用户可以实时搜索并过滤出匹配的...

    前端兼容问题总结

    - IE存在一个bug,即Select控件永远处于最上层,且所有CSS对Select控件不起作用。 9. **Form中的Label标签** - IE支持Form中的Label标签,包括图片和文字内容。 - FireFox不支持包含图片的Label,点击图片不会...

    前端面试基础知识汇总

    10. 锚点的作用和创建方法:锚点通过标签的name属性定义,用以在页面内创建一个可以跳转的链接点,方便用户快速定位页面内容。 11. 浏览器测试和内核:在进行前端开发时,需要在多个浏览器上测试页面,常见的浏览器...

    最新史上最全前端面试题(含答案).docx

    10. **IE6常见BUG及解决方案**:双边距BUG、3像素问题、超链接hover失效、z-index问题、PNG透明问题、min-height问题、select遮盖问题、1px宽度容器问题等,通过各种CSS技巧或JavaScript解决。 11. **标签title与...

    2016前端面试题及答案.docx

    10. **IE6常见bug及解决方法**:包括双边距问题、3像素问题、超链接hover失效、z-index问题、PNG透明问题、min-height问题和select遮盖问题。 11. **title与alt属性**:title提供鼠标悬停时的提示信息,alt是在图片...

Global site tag (gtag.js) - Google Analytics