前段时间重构公司项目,遇到一个需求,要在浏览器中动态生成单选框,经过一番折腾,终于修成正果,现在项目上线了,终于有时间分享出来
基本需求:跨浏览器生成单选框并且能够添加事件回调
实现原理:通过调用document的createElement方法生成单选框,并添加到DOM树中
实现时遇到的问题:
1. IE6下的单选框name属性为只读,只能在构造时设置
2. IE6下选中状态需要加入到DOM树后才能设置
具体实现:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<script type="text/javascript">
/*
作者:Ryan.Sun
日期:2011/04/24
用途:跨浏览器动态生成单选框,不依赖外部框架,支持添加自定义的点击事件回调
历史:
2011/04/24 完成基本功能代码并在IE6、IE9、FF和Chrome测试通过
2011/04/25 增加选中状态赋值
2011/04/26 优化实现同时增加测试用例
*/
function addRadioButton(radio){
//校验参数
if(radio.element == null ||
radio.name == null ||
radio.value == null ||
(radio.onclick != null && typeof radio.onclick != "function")){
throw new Error("ErrorArgument");
}
var options = {
element : radio.element,
name : radio.name,
id : radio.id == null ? "": radio.id,
value : radio.value,
checked : radio.checked == null || !radio.checked ? false : true,
onclick : radio.onclick == null ? function(){} : radio.onclick,
css : radio.css == null ? "" : radio.css
};
//声明内部函数
function addEvent(obj,type,fn){
if(obj.addEventListener) obj.addEventListener(type,fn,false);
else if(obj.attachEvent){
obj["e"+type+fn]=fn;
obj[type+fn]=function(){obj["e"+type+fn](window.event);}
obj.attachEvent("on"+type,obj[type+fn]);
}
}
//动态生成单选框
var strInput = "";
if(navigator.userAgent.indexOf("MSIE 6.0")>0) {
//Tip: IE6下单选框的name属性为只读,需要这样动态构建单选框
strInput = "<input name='" + options.name + "'>";
}
else{
strInput = "input";
}
var op = document.createElement(strInput);
op.type = "radio";
op.name = options.name;
op.id = options.id;
op.value = options.value;
op.className = options.css;
addEvent(op,"click",function(){
options.onclick.call(this);
});
//添加到DOM树
radio.element.appendChild(op);
//设置选中
//Tip: IE6下需要在单选框添加到DOM树后设置选中状态
op.checked = options.checked;
}
//测试方法
function Add(){
var region = document.getElementById("add");
addRadioButton({
element : region,
name : "new",
id : "new",
value : 0,
checked : false,
onclick : function(){
alert(this.value);
}
});
addRadioButton({
element : region,
name : "new",
id : "new",
value : 1,
checked : true,
onclick : function(){
alert(this.value);
}
});
addRadioButton({
element : region,
name : "new",
id : "new",
value : 2,
checked : false
});
addRadioButton({
element : region,
name : "new",
value : 4,
checked : false
});
addRadioButton({
element : region,
name : "new",
value : 5
});
addRadioButton({
element : region,
name : "new",
value : 6,
css : "test"
});
}
</script>
<style type="text/css">
.test{
background: yellow;
}
</style>
</head>
<body>
<input type="button" name="btnAddRadio" id="btnAddRadio" value="AddRadio" onclick="Add()"/>
<div id="add">
</div>
</body>
</html>