原贴请看这里由于不能修改只好另开一帖效果预览和程序说明请看这里下载测试代码补充内容包括
增加bool类型比较;
修正ie6/7的radio/checkbox状态恢复bug;
增加自定义取值函数。【radio/checkbox的checked状态bug】可以用ie6/7测试下面代码:
<div id="c">
<input type="checkbox" id="a" />
<input name="b" type="radio" id="b" />
</div>
<input type="button" value="click" id="btn" />
<script>
var a = document.getElementById("a");
var b = document.getElementById("b");
var c = document.getElementById("c");
document.getElementById("btn").onclick = function(){
c.appendChild(a);
c.appendChild(b);
var o1 = document.createElement("input");
o1.type = "checkbox"; o1.checked = true;
c.appendChild(o1);
var o2 = document.createElement("input");
o2.type = "radio"; o2.checked = true;
c.appendChild(o2);
}
</script>先点选checkbox和radio,然后点击按钮,在ie6会发现checkbox和radio都恢复到没有点选的状态,ie7好点只是radio有问题。
而且新插入的checkbox和radio虽然checked都设置成true,但显示出来还是没有选择的状态。
这里其实都是一个问题,checkbox和radio在一些dom操作之后(例如这里的appendChild),checked会自动恢复成defaultChecked的状态。
创建元素的问题可以参考这里。
程序中tr在排序后会用appendChild重新插入文档,结果就会导致上面的问题了,解决方法暂时想到三个:
1,在appendChild之前修改defaultChecked。
针对appendChild后会自动恢复成defaultChecked,那我们就在appendChild前把defaultChecked修改成当前的checked值。
这个解决方法不错,只要appendChild之前扫一遍表单控件就行,但问题是这会影响到reset的结果,因为reset之后checkbox/radio的checked就会恢复成defaultChecked的值,如果修改了defaultChecked那reset就失去了效果。
2,在appendChild之前保存checked的状态,并在appendChild之后恢复。
要实现这个也有两个方法,一个是用一个数组或对象来保存checkbox/radio当前的checked值,在appendChild之后找出对应的值并设置。
另一个是直接把checkbox/radio当前的checked值保存到该控件的一个自定义属性中,在appendChild之后再获取并设置。
两个方法都要扫两次表单控件,后面的方法比较方便。
3,在appendChild之前找出checked跟defaultChecked不相等的控件,并在appendChild之后重新设置这些控件。
这个方法比前一个稍好,只要在appendChild之前扫一遍控件,并筛选出需要修正的(checked跟defaultChecked不相等的),在appendChild之后设置checked为defaultChecked的相反值就行了。程序用的是第3个方法,在appendChild之前用GetChecked方法获取要修正的checkbox/radio集合:
GetChecked: function() {
this._checked = Filter(this.tBody.getElementsByTagName("input"), function(o){
return ((isIE6 && o.type == "checkbox") || o.type == "radio") && o.checked != o.defaultChecked;
});
},在appendChild之后用SetChecked重新设置checked值:
SetChecked: function() {
forEach(this._checked, function(o){ o.checked = !o.defaultChecked; });
}
但这样效率还是比较低,如果有更好的方法记得告诉我啊。ps:感谢xingqiliudehuanghun告诉我radio/checkbox的checked状态bug
增加bool类型比较;
修正ie6/7的radio/checkbox状态恢复bug;
增加自定义取值函数。【radio/checkbox的checked状态bug】可以用ie6/7测试下面代码:
<div id="c">
<input type="checkbox" id="a" />
<input name="b" type="radio" id="b" />
</div>
<input type="button" value="click" id="btn" />
<script>
var a = document.getElementById("a");
var b = document.getElementById("b");
var c = document.getElementById("c");
document.getElementById("btn").onclick = function(){
c.appendChild(a);
c.appendChild(b);
var o1 = document.createElement("input");
o1.type = "checkbox"; o1.checked = true;
c.appendChild(o1);
var o2 = document.createElement("input");
o2.type = "radio"; o2.checked = true;
c.appendChild(o2);
}
</script>先点选checkbox和radio,然后点击按钮,在ie6会发现checkbox和radio都恢复到没有点选的状态,ie7好点只是radio有问题。
而且新插入的checkbox和radio虽然checked都设置成true,但显示出来还是没有选择的状态。
这里其实都是一个问题,checkbox和radio在一些dom操作之后(例如这里的appendChild),checked会自动恢复成defaultChecked的状态。
创建元素的问题可以参考这里。
程序中tr在排序后会用appendChild重新插入文档,结果就会导致上面的问题了,解决方法暂时想到三个:
1,在appendChild之前修改defaultChecked。
针对appendChild后会自动恢复成defaultChecked,那我们就在appendChild前把defaultChecked修改成当前的checked值。
这个解决方法不错,只要appendChild之前扫一遍表单控件就行,但问题是这会影响到reset的结果,因为reset之后checkbox/radio的checked就会恢复成defaultChecked的值,如果修改了defaultChecked那reset就失去了效果。
2,在appendChild之前保存checked的状态,并在appendChild之后恢复。
要实现这个也有两个方法,一个是用一个数组或对象来保存checkbox/radio当前的checked值,在appendChild之后找出对应的值并设置。
另一个是直接把checkbox/radio当前的checked值保存到该控件的一个自定义属性中,在appendChild之后再获取并设置。
两个方法都要扫两次表单控件,后面的方法比较方便。
3,在appendChild之前找出checked跟defaultChecked不相等的控件,并在appendChild之后重新设置这些控件。
这个方法比前一个稍好,只要在appendChild之前扫一遍控件,并筛选出需要修正的(checked跟defaultChecked不相等的),在appendChild之后设置checked为defaultChecked的相反值就行了。程序用的是第3个方法,在appendChild之前用GetChecked方法获取要修正的checkbox/radio集合:
GetChecked: function() {
this._checked = Filter(this.tBody.getElementsByTagName("input"), function(o){
return ((isIE6 && o.type == "checkbox") || o.type == "radio") && o.checked != o.defaultChecked;
});
},在appendChild之后用SetChecked重新设置checked值:
SetChecked: function() {
forEach(this._checked, function(o){ o.checked = !o.defaultChecked; });
}
但这样效率还是比较低,如果有更好的方法记得告诉我啊。ps:感谢xingqiliudehuanghun告诉我radio/checkbox的checked状态bug
解决方案 »
- EXT问题 Window中显示文字如何按需要换行?
- 谁有类似百度贴吧那样的编辑器(最好是源码)
- 求一个在同一页面,两个漂浮图片的代码
- whichEl和whichEl1问题!!!
- 一个网络攻防的题,要编程序,有兴趣的可以去看看,我贴出地址哈!!
- (100分)急用:请帮我修改一下网页对联式广告的代码.将四个广告中在同一方的两个广告隔开一段距离.
- 聊天室列表 的一个问题
- 请问如何实现点击按钮将图片放大缩小?
- 一个关于表单验证的问题!~~菜鸟,急~~!
- 请教! 获取JSON返回数据输出问题
- 如何用JS 给<SPAN ID=_Dataacom_school class=VIEWBOX >Cambridge University加个超链接
- 用javascript控制Radio的隐藏和显示
2009年5月28日~2009年5月31日间,发帖+回帖量>=4 次,将获得过节费85分。
so, 加入到 jQuery sorttable plugin 的开发中去就好了.
用jq是为了工作
用js是为了提高啊
意义不同