首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript Table排序 2.0 补充解决办法

2012-02-03 
JavaScript Table排序 2.0 补充原贴请看这里由于不能修改只好另开一帖效果预览和程序说明请看这里下载测试

JavaScript Table排序 2.0 补充
原贴请看这里

由于不能修改只好另开一帖

效果预览和程序说明请看这里

下载测试代码

补充内容包括
增加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

[解决办法]
观摩下.顺便拿沙发.
[解决办法]
好贴
[解决办法]
收藏一下
[解决办法]
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习
[解决办法]

探讨
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习

[解决办法]
~jF
[解决办法]
不错 好贴
[解决办法]
好贴,友情帮顶~~
[解决办法]
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习
------解决方案--------------------


好帖啊,受用
[解决办法]
study
[解决办法]
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习
[解决办法]
楼主很强,学习了!!!
[解决办法]
学习学习!
[解决办法]
学习学习
[解决办法]
学习了学习
[解决办法]
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习
[解决办法]
好贴 mark
[解决办法]
mark
[解决办法]
很厉害,顶你
[解决办法]
支持!
[解决办法]

不错
[解决办法]
Study
[解决办法]
学习了
[解决办法]
学习
[解决办法]
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习
[解决办法]
收藏,慢慢研究
[解决办法]

探讨
楼主一般都是很用心的在做东西 ,单凭这点 ,就值得我们去学习

[解决办法]
.
[解决办法]
以版主为学习榜样。。
[解决办法]
不错,接分
[解决办法]
让人受益匪浅的帖子,好贴啊~~~~~~~~~·
[解决办法]
确实厉害
[解决办法]
可是有一个地方很奇怪,为什么添加的单选按钮都不能选呢?
[解决办法]
学习了
[解决办法]
up
[解决办法]
学习学习
[解决办法]
mark
[解决办法]
谢谢
[解决办法]
好帖子!
[解决办法]
历害!!!
[解决办法]
楼主真的太强大了,偶像
[解决办法]
Up
2009年5月28日~2009年5月31日间,发帖+回帖量>=4 次,将获得过节费85分。
------解决方案--------------------



[解决办法]


Mark
[解决办法]
楼主我经常去你的博客学习,还专门把你写的文章下载回来慢慢研究,发现你对js真的是精通,我也要争取向你看齐
[解决办法]
学习..
[解决办法]
高手如云,学习
[解决办法]
jquery就有这个插件的

学习
[解决办法]
很不错哦
[解决办法]
jquery
[解决办法]
又改了啊!
[解决办法]
建议 不要再单独造车轮...
so, 加入到 jQuery sorttable plugin 的开发中去就好了.
[解决办法]
学习了..
[解决办法]
ding

热点排行