=波波日志 > JavaScript/Ajax > 扩展Firefox下table控件的原型方法moveRow=
扩展Firefox下table控件的原型方法moveRow
火狐浏览器的table控件没有同IE浏览器的moveRow方法,所以自己扩展了下Element的原型,将Firefox的moveRow方法加上,这样就可以使用了。
测试代码如下
+展开
-HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>扩展Firefox下table控件的原型方法moveRow-extend firefox table prototype method moveRow</title>
</head>
<body><table border="1" id="tbTest">
<tr><td>1111111111111</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr>
<tr><td>2222222222222</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr>
<tr><td>3333333333333</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr>
<tr><td>4444444444444</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr></table>
<script type="text/javascript">
if (typeof Element != 'undefined') Element.prototype.moveRow = function (sourceRowIndex, targetRowIndex) {//执行扩展操作
if (!/^(table|tbody|tfoot|thead)$/i.test(this.tagName) || sourceRowIndex === targetRowIndex) return false;
var pNode = this;
if (this.tagName == 'TABLE') pNode = this.getElementsByTagName('tbody')[0]; //firefox会自动加上tbody标签,所以需要取tbody,直接table.insertBefore会error
var sourceRow = pNode.rows[sourceRowIndex], targetRow = pNode.rows[targetRowIndex];
if (sourceRow == null || targetRow == null) return false;
var targetRowNextRow = sourceRowIndex > targetRowIndex ? false : getTRNode(targetRow, 'nextSibling');
if (targetRowNextRow === false) pNode.insertBefore(sourceRow, targetRow); //后面行移动到前面,直接insertBefore即可
else {//移动到当前行的后面位置,则需要判断要移动到的行的后面是否还有行,有则insertBefore,否则appendChild
if (targetRowNextRow == null) pNode.appendChild(sourceRow);
else pNode.insertBefore(sourceRow, targetRowNextRow);
}
}
//Firefox下表格里面的空白,回车也算一个节点,所以需要过滤一下节点类型。
function getTRNode(nowTR, sibling) { while (nowTR = nowTR[sibling]) if (nowTR.tagName == 'TR') break; return nowTR; }
function movePreNext(btn, isNext) {
var tr = btn.parentNode.parentNode
, refTR = getTRNode(tr, isNext ? 'nextSibling' : 'previousSibling');
if (refTR == null) alert(isNext ? '已经是最后一条!' : '已经是第一条!');
else document.getElementById('tbTest').moveRow(tr.rowIndex, refTR.rowIndex);
}
var btns = document.getElementById('tbTest').getElementsByTagName('input');
for (var i = 0; i < btns.length; i++) btns[i].onclick = function () { movePreNext(this, this.value == '下'); }
</script>
</body>
</html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>扩展Firefox下table控件的原型方法moveRow-extend firefox table prototype method moveRow</title>
</head>
<body><table border="1" id="tbTest">
<tr><td>1111111111111</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr>
<tr><td>2222222222222</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr>
<tr><td>3333333333333</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr>
<tr><td>4444444444444</td><td><input type="button" value="上" /> <input type="button" value="下" /></td></tr></table>
<script type="text/javascript">
if (typeof Element != 'undefined') Element.prototype.moveRow = function (sourceRowIndex, targetRowIndex) {//执行扩展操作
if (!/^(table|tbody|tfoot|thead)$/i.test(this.tagName) || sourceRowIndex === targetRowIndex) return false;
var pNode = this;
if (this.tagName == 'TABLE') pNode = this.getElementsByTagName('tbody')[0]; //firefox会自动加上tbody标签,所以需要取tbody,直接table.insertBefore会error
var sourceRow = pNode.rows[sourceRowIndex], targetRow = pNode.rows[targetRowIndex];
if (sourceRow == null || targetRow == null) return false;
var targetRowNextRow = sourceRowIndex > targetRowIndex ? false : getTRNode(targetRow, 'nextSibling');
if (targetRowNextRow === false) pNode.insertBefore(sourceRow, targetRow); //后面行移动到前面,直接insertBefore即可
else {//移动到当前行的后面位置,则需要判断要移动到的行的后面是否还有行,有则insertBefore,否则appendChild
if (targetRowNextRow == null) pNode.appendChild(sourceRow);
else pNode.insertBefore(sourceRow, targetRowNextRow);
}
}
//Firefox下表格里面的空白,回车也算一个节点,所以需要过滤一下节点类型。
function getTRNode(nowTR, sibling) { while (nowTR = nowTR[sibling]) if (nowTR.tagName == 'TR') break; return nowTR; }
function movePreNext(btn, isNext) {
var tr = btn.parentNode.parentNode
, refTR = getTRNode(tr, isNext ? 'nextSibling' : 'previousSibling');
if (refTR == null) alert(isNext ? '已经是最后一条!' : '已经是第一条!');
else document.getElementById('tbTest').moveRow(tr.rowIndex, refTR.rowIndex);
}
var btns = document.getElementById('tbTest').getElementsByTagName('input');
for (var i = 0; i < btns.length; i++) btns[i].onclick = function () { movePreNext(this, this.value == '下'); }
</script>
</body>
</html>
类别:JavaScript/Ajax 作者:波波 日期:2011-03-11 【评论:0】
相关文章
- ·IE浏览器table控件moveRow方法使用说明
- ·ie和firefox下操作table对象的异同
- ·firefox下reset控件无法清除hidden控件value
- ·扩展IE下的input selectionStart selectionEnd属性
- ·Firefox下的AJAX onreadystatechange问题
- ·firefox下图片拖动的问题
- ·5.14 表控件(Table)
- ·firefox实现ie的方法和属性
- ·解决Firefox 3.6启动慢的方法
- ·firefox下js与flash通讯的可恶
- ·IE,Firefox下自定义属性获取的异同
- ·label标签在IE,w3c浏览器firefox下的区别
暂时没有评论!
发表留言
热门博文
- AJAX跨域问题解决办法
- ajax问题总结
- jQuery dataType指定为json的问题
- ajax+asp.net+mssql无刷新聊天室
- ajax无刷新上传文件,使用iframe模仿
- ajax对象abort方法
最新博文
- jquery+flash显示图片实时加载进度插件
- jquery浮动层拖动插件
- firefox NPMethod called on non-NPObject wrapped JSObject!错误
- IE浏览器setCapture和releaseCapture介绍
- 51.la统计出问题了
- 隐藏删除ckeditor状态栏
随机博文
- jQuery调用WebService返回JSON数据
- IE/Firefox/W3C浏览器代码触发事件
- fckeditor中键盘事件的问题
- jquery easyUI form plugin bug
- 【地图制作】详细代码说明和效果图,可实现当前各种地图
- 判断客户端是否安装特定版本的JRE
广告商赞助

