当前位置: 代码迷 >> JavaScript >> js动态绑定事件并传参数的步骤整理
  详细解决方案

js动态绑定事件并传参数的步骤整理

热度:131   发布时间:2012-11-03 10:57:43.0
js动态绑定事件并传参数的方法整理

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
?<HEAD>
? <TITLE> New Document </TITLE>
? <META NAME="Generator" CONTENT="EditPlus">
? <META NAME="Author" CONTENT="">
? <META NAME="Keywords" CONTENT="">
? <META NAME="Description" CONTENT="">
?<style type="text/css">
table {
?border: 1px solid #9999cc;
?color: red;
}
td {
?font-family:Arial, Helvetica, sans-serif, 宋体;
?font-size: 12px;
?color: red;
?cursor:default;
}
input.readonly {
?padding-right: 1px;
?padding-left: 1px;
?padding-bottom: 2px;
?padding-top: 2px;
?border: 1px solid #9999cc;
?background: #efefef;
}
.textinput {
?border: 1px solid #9999cc;
?background:#FFFFCC;
?line-height: 16px;
?font-size: 12px;
}
?</style>
?</HEAD>

?<BODY>
? <TABLE id="mytable">
? <TR>
?<TD><input type="text" name="name" value="11111111" readonly="true"/></TD>
?<TD><input type="text" name="name" value="11111111"/></TD>
?<TD><input type="text" name="name" value="11111111"/></TD>
?<TD><input type="text" name="name" value="11111111"/></TD>
?<TD><input type="text" name="name" value="11111111"/></TD>
? </TR>
? <TR>
?<TD><input type="text" name="name" value="22222222"/></TD>
?<TD><input type="text" name="name" value="22222222"/></TD>
?<TD><input type="text" name="name" value="22222222"/></TD>
?<TD><input type="text" name="name" value="22222222"/></TD>
?<TD><input type="text" name="name" value="22222222"/></TD>
? </TR>
? <TR>
?<TD><input type="text" name="name" value="33333333"/></TD>
?<TD><input type="text" name="name" value="33333333"/></TD>
?<TD><input type="text" name="name" value="33333333"/></TD>
?<TD><input type="text" name="name" value="33333333"/></TD>
?<TD><input type="text" name="name" value="33333333"/></TD>
? </TR>
? <TR>
?<TD><input type="text" name="name" value="44444444"/></TD>
?<TD><input type="text" name="name" value="44444444"/></TD>
?<TD><input type="text" name="name" value="44444444"/></TD>
?<TD><input type="text" name="name" value="44444444"/></TD>
?<TD><input type="text" name="name" value="44444444"/></TD>
? </TR>
? </TABLE><br>
? <TABLE id="mytable2"></TABLE>
?</BODY>
? <script type="text/javascript">
?var tds = document.getElementsByTagName("td");
?var trs = document.getElementsByTagName("tr");
?var tab2 = document.getElementById("mytable2");
?var tdlen = tds.length;
?var trlen = trs.length;
?for(var i=0;i<tdlen;i++){
??//tds[i].onclick=tdClick;
?}
?for(var i=0;i<trlen;i++){
??trs[i].onclick=trClick;
??trs[i].onclick.x = i+1;
??//alert(trs[i].onclick);
?}

?function tdClick(str){
??var tab22 = document.getElementById("mytable2");
??var t2body = tab22.children[0];
??t2body.apendChildren(this.parentNode);
?}

?function trClick(){
?alert(arguments.callee.x);
??var tab22 = document.getElementById("mytable2");
??var t2body = tab22.children[0];
??
??var copyFlag = checkRowExit(tab22,this.rowIndex);
??//alert(copyFlag);
??if(copyFlag){
???var row = tab22.insertRow(tab22.rows.length);
???var tds = this.cells;
???var tdl = this.cells.length;
???for(var i=0; i<tdl; i++){
????var td = document.createElement("td");
????td.innerHTML = tds[i].innerHTML;
????row.appendChild(td);
????row.id = this.rowIndex;
????row.ondblclick = trOndblclick;
???}
???if(row.rowIndex%2==0){
????row.bgColor = "red";
???}else{
????row.bgColor = "green";
???}
??}
?}

?function checkRowExit(tableObj, rowId){
??var trs = tableObj.rows;
??var trl = trs.length;
??for(var i=0; i<trl; i++){
???if(trs[i].id == rowId){
????return false;
???}
??}
??return true;
?}

?function trOndblclick(){
??var rowIndex = this.rowIndex;
??var table = this.parentNode.parentNode;
??table.deleteRow(rowIndex);
?}
? </script>
</HTML>

=====================================================================

<html >?
<body>?
?
<p>111</p>?
<p>222</p>?
<p>333</p>?
<p>444</p>?
<p>555</p>?
?
</body>?
</html>?
?
?
?
<script type="text/javascript">?
var p = document.getElementsByTagName("p");??
var len = p.length;??
function fn1(){??
??? for(var i=0; i<len; i++){??
??????? p[i].setAttribute("x",i+1);??
??????? p[i].onclick = function(){??
??????????? alert(this.getAttribute("x"));??
??????? };??
??? }??
}??
//fn1();??
?
function fn2(){??
??? for(var i=0; i<len; i++){??????
??????? p[i].onclick = function(){??
??????????? alert(arguments.callee.x);??
??????? }??
??????? p[i].onclick.x = i+1;??
??????? //or??
??????? /*??
??????? (p[i].onclick = function(){??
??????????? alert(arguments.call.x);??
??????? }).x = i+1;??
??????? */??
??? }??
}??
//fn2();??
// ----------------- 以上是保存变量在对象中。??
?
?
function fn3(){??
??? for(var i=0; i<len; i++){??
??????? p[i].onclick = (function(x){????
??????????? var y = i+1;??
??????????? return function(){?? //返回一个闭包,引用了来自外层的变量??
??????????????? alert(x);??????? // 参数形式??
??????????????? alert(y);??????? // 变量形式,外层函数执行可以不带参数.??
??????????? };??
??????? })(i+1);??
??? }??
}??
//fn3();??
?
function fn4(){??
??? for(var i=0; i<len; i++){??
??????? (function(x){???????????????? //利用自执行的匿名函数激发作用域。体会和fn3的区别。??
??????????? var y = i+1;????????????? //fn3和fn4同样是闭包,不过fn3是在函数外引用闭包,fn4是在函数内引用闭包。??
??????????? p[i].onclick = function(){??
??????????????? alert(x);??
??????????????? alert(y);??
??????????? }??
??????? })(i+1);??
??? }??
}??
//fn4();??
// ----------------------以上变量保存在闭包中??
?
function fn5(){??
??? for(var i=0; i<len; i++){??????????????
??????? var str = "alert("+(i+1)+")";????? //利用new Function声明函数。??
??????? p[i].onclick = new Function(str);? //这种方法相当于对每一个p[i]单独声明了一个构造好的函数.??
??? }??
}??
fn5();??
?
//总结??
/*??
??? fn5的效率无疑是最差的,因为new Function的问题,所以不建议使用。??
??? fn3,fn4利用闭包的特性,分别在内存中持久了每一个i的变量。这里可以帮助理解闭包的作用。??
??? fn1,fn2将变量保存在对象上,效率最高,对于大量的绑定建议使用。??
*/??
?
</script>?

?

  相关解决方案