不解以下现象:
原始版本代码:可跳过代码直接看解决方案部分。前面的文字是在解决问题时的思考。

<body>
<div id="div1"><form  method="get" action="Demo8_table.html"><input type = "text" id = "code" ><input type="text" id = "name"><input type = "text" id = "sex"><input type="button" id = "add" value="add"></form></div>
<div id = "div2"><table id = "table"><caption>学生信息表</caption><tr id = "tr" class="thS"><th><input type="checkbox" id="firstcheckbox"></th><th>编号</th><th>姓名</th><th>性别</th><th>操作</th></tr></table>
</div>
<div id = "div3">
</div>
<script>document.getElementById("firstcheckbox").onclick = function(){alert("hello");// 获取所有的复选框var element = document.getElementsByName("check");for(var i = 0;i < element.length;i++){//获取后this为数据源element[i].checked = true;}}window.document.getElementById(`add`).onclick = function () {var a = window.document.getElementById("code");var b = window.document.getElementById("name");var c = window.document.getElementById("sex");var code = a.value;//code为对象类型 其后加上 value获取值var name = b.value;var sex = c.value;var table = document.getElementById("table");button = "<input type='checkbox' name='check' value='+code+'>";table.innerHTML += "<tr οnmοuseοver='changeR(this)' οnmοuseοut='changeO(this)'class='thS'>"+"<td>"+button+"</td>"+"<td>"+code+"</td>"+"<td >"+name+"</td>"+"<td>"+sex+"</td>"+"<td>"+"<a href='javascript:void(0);' οnclick='delate(this)' >delete</a>"+"</td>"+"</tr>";}function delate(Obj){//删除行 可以通过获取父标签的方法 获取trvar getTd = Obj.parentNode;var getTr = getTd.parentNode;//获取tablevar table = getTr.parentNode;table.removeChild(getTr);}
</script>
</body>

这个代码是将script标签放在底部,在文档加载后再执行方法,但对第一个checkbox实现onclick点击事件,且未触碰add事件前,这个点击事件是有效地,触碰之后,发现失效,分析,之所以失效源于在增加table后,自动取消了第一个checkbox的onclick事件。
在询问同学后,他建议我将Element对象的innerHTML更新的方式改为用Node节点的方式,问题得到了解决!

//更新之前:table.innerHTML += "<tr>"+"<td>"+button+"</td>"+"<td>"+code+"</td>"+"<td >"+name+"</td>"+"<td>"+sex+"</td>"+"<td>"+"<a href='javascript:void(0);' οnclick='delate(this)' >delete</a>"+"</td>"+"</tr>";var tr = document.createElement("tr");tr.setAttribute("onmouseover","changeR("+this+")");tr.setAttribute("onmouseout","changeO("+this+")");tr.setAttribute("class","thS");var td0 = document.createElement("td");var in0 = document.createElement("input");in0.setAttribute("type","checkbox");in0.setAttribute("id","firstcheckbox");in0.setAttribute("name","check");td0.appendChild(in0);var td1 = document.createElement("td");td1.appendChild(document.createTextNode(code));tr.appendChild(td1);var td2 = document.createElement("td");td2.appendChild(document.createTextNode(name));tr.appendChild(td2);var td3 = document.createElement("td");td3.appendChild(document.createTextNode(sex));var td4 = document.createElement("td");var td5 = document.createElement("a");td5.setAttribute("href","javascript:void(0);");td5.setAttribute("onclick","delateE("+this+");");td5.appendChild(document.createTextNode("delete"));td4.appendChild(td5);tr.appendChild(td0);tr.appendChild(td1);tr.appendChild(td2);tr.appendChild(td3);tr.appendChild(td4);table.appendChild(tr);

但是新的问题又来了,更改前有效的mouseover事件、点击删除超链接可删除一整行的功能却失效了,经过浏览器的错误信息【函数未定义】便知道更新后,函数未一起更新,也就是说JS代码存在着随着动态加载而丢失代码的现象。于是,我查找onclick在设置属性的时候是否和正常的href等有不一样的地方。在当onclick的属性设置为alert时,确实能弹出,因此在使用Node节点对象的触发事件时其它方法还未加载进来。与onclick确实无关,那是什么导致了设置onclick属性调用带形式参数的方法行不通呢?

问题确定下来,onclick在设置事件的属性值的时候,由于是在加载后才引入函数的,而在加载后调用delete时,发现没有delete函数,出现错误。先不寻找原因,那只能尝试一下其他的方法,能不能在函数中创建函数?也像下面这样?

解决方案:

与window.load加载无关,根本在于onclick调用实现带参数的函数需要特别注意!
另注意,innerHTML有风险 可能会出现onclick失效的问题,尽量选择appendChild。

   window.document.getElementById('添加元素的按钮ID').onclick = function(){window.document.getElementBy('onmouseover事件源ID').onclick =             function(){}}//或者采取下面的这种形式也可以,直接赋值valuetd5.setAttribute("onclick","delate(this);");

结果是行的通的,于是我把所有触发的函数需要参数的部分全部改成了上面的形式,所有问题都得到了解决。

实现反选的巧妙方法

另外,在学习时有一部分代码和老师讲的思路一样,但老师的代码更为简洁,和题目无关,但想总结下来。

     //我的思路for(var i = 0;i < click_element.length;i++){if(click_element[i].checked === true){click_element[i].checked = false;}else if(click_element[i].checked === false){click_element[i].checked = true;}}//老师代码:仅仅用了一行//简化for(var i = 0;i < click_element.length;i++){click_element[i].checked = !click_element[i].checked;}

附完整代码 CSS样式部分可略

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>#div1{text-align: center;}table{margin: auto;width:1000px;text-align: center;border: 2px solid gray;border-spacing: 0px;}.thS{border: 2px solid  gray;}.thF{border: 2px solid  gray;background-color: greenyellow;}th,td{border: 2px solid  gray;}#div3{text-align: center;width: 100%;}</style><script>window.onload= function () {function de(Obj){//删除行 可以通过获取父标签的方法 获取trvar getTd = Obj.parentNode;var getTr = getTd.parentNode;//获取tablevar table = getTr.parentNode;table.removeChild(getTr);}// 第一个// click_alldocument.getElementById("firstcheckbox").onclick = function(){// 获取所有的复选框var element = document.getElementsByName("check");for(var i = 0;i < element.length;i++){//获取后this为数据源element[i].checked = this.checked;}}var click_all = window.document.getElementById("click_all");click_all.onclick = function(){var click_element = document.getElementsByName("check");for(var i = 0;i < click_element.length;i++){click_element[i].checked = true;}}//查找值 将true改为false 将false 改为true//anti_clickvar anti_click = window.document.getElementById("anti_click");anti_click.onclick = function(){var click_element = document.getElementsByName("check");//简化for(var i = 0;i < click_element.length;i++){click_element[i].checked = !click_element[i].checked;}}//全不选var not_click = window.document.getElementById("not_click");not_click.onclick = function(){var click_element = document.getElementsByName("check");for(var i = 0;i < click_element.length;i++){click_element[i].checked = false;}}window.document.getElementById(`add`).onclick =function(){var a = window.document.getElementById("code");var b = window.document.getElementById("name");var c = window.document.getElementById("sex");var code = a.value;//code为对象类型 其后加上 value获取值var name = b.value;var sex = c.value;var table = document.getElementById("table");button = "<input type='checkbox' name='check' value='+code+'>";//appendChild方式var tr = document.createElement("tr");tr.setAttribute("class","thS");tr.onmouseover = function () {this.className = "thF";}tr.onmouseout = function () {this.className = "thS";}var td0 = document.createElement("td");var in0 = document.createElement("input");in0.setAttribute("type","checkbox");in0.setAttribute("id","firstcheckbox");in0.setAttribute("name","check");td0.appendChild(in0);var td1 = document.createElement("td");td1.appendChild(document.createTextNode(code));tr.appendChild(td1);var td2 = document.createElement("td");td2.appendChild(document.createTextNode(name));tr.appendChild(td2);var td3 = document.createElement("td");td3.appendChild(document.createTextNode(sex));var td4 = document.createElement("td");//<a href='javascript:void(0);' οnclick='delate(this)' >delete</a>var td5 = document.createElement("a");td5.setAttribute("href","javascript:void(0);");td5.onclick = function(){de(this);}td5.appendChild(document.createTextNode("delete"));td4.appendChild(td5);tr.appendChild(td0);tr.appendChild(td1);tr.appendChild(td2);tr.appendChild(td3);tr.appendChild(td4);table.appendChild(tr);}}</script></head>
<body><div id="div1"><form  method="get" action="Demo8_table.html"><input type = "text" id = "code" ><input type="text" id = "name"><input type = "text" id = "sex"><input type="button" id = "add" value="add"></form></div><div id = "div2"><table id = "table"><caption>学生信息表</caption><tr id = "tr" class="thS"><th><input type="checkbox"  id="firstcheckbox"></th><th>编号</th><th>姓名</th><th>性别</th><th>操作</th></tr></table></div><div id = "div3"><input type="button" id="click_all" value="全选"><input type="button" id="anti_click" value="反选"><input type="button" id="not_click" value="全不选"></div></body>
</html>


不足之处,近一天的时间未找到错误原因,只是找到了解决途径,感谢李俍为我提供了思路,使问题得到了解决。感谢大家的阅读,初学者若有总结错误之处,恳请批评指正。

解决onclick事件调用其它带参数的函数方法无效的问题相关推荐

  1. JS调用后台带参数的方法

    JS调用后台带参数的方法 对于前台调用后台的方法,我们想到最多的就是用AJAX,这个是毋庸置疑的, 我就不再这里多说了.我今天主要想说的是用JS调用后台的方法. 对于后台往前台传值,用这种<%= ...

  2. C mysql带参数存储过程_C# 调用Mysql 带参数存储过程

    使用C#调用Mysql 带参数的存储过程: 1.创建带参数的存储过程:USP_Temp_Test 2.两个参数:IN 参数为 P_XML , OUT 参数为 P_ErrorOut 3.C#代码调用该存 ...

  3. JavaScript调用cs中带参数的函数

    这个问题就是在前台js中调用c#后台中带参数的函数 如: .cs: public string Method(string name) {   return name; } javascript: v ...

  4. JS中setInterval、setTimeout不能传递带参数的函数的解决方法

    setInterval 和 setTimeout 这两个函数比较好用,但会遇到比如说我隔个几秒后要执行的函数是带参数的,这种情况怎么办?可以用匿名函数包装处理 //不带参数的函数function te ...

  5. js setTimeout 传递带参数的函数的2种方式

    js setTimeout 传递带参数的函数的2种方式 Created by Marydon on 2018年9月14日 1.准备工作 function sayYourName(param) {ale ...

  6. JavaScriptjQuery.带参数的函数

    带参数的函数 创建带参数的函数 创建公式如下: function 函数名(参数1,参数2,...){ // 语句 } 同一节创建函数几乎一样,不同之处多了参数,参数可以是一个,也可以是多个. 参数在这 ...

  7. axios get带参数的请求方法

    最近在自己写的项目中遇到get带参数请求的axios封装,记录一下使用的方法.方便下次查看. 因为axios的post和get带参数的请求方法是不大一样的. 下面是post的参数请求 这个是get带参 ...

  8. python 装饰器 参数-python函数装饰器之带参数的函数和带参数的装饰器用法示例...

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

  9. python装饰器函数-python函数装饰器之带参数的函数和带参数的装饰器用法示例

    本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法.分享给大家供大家参考,具体如下: 1. 函数带多个参数 # 普通的装饰器, 打印函数的运行时间 def decrator(fun ...

最新文章

  1. 【干货】优秀的移动客户端 Web App设计,让用户体验飞起来
  2. linux中Shell历史命令记录文件的路径是什么
  3. Memcached 源码分析——从 main 函数说起
  4. 全国计算机考试光盘,全国计算机一级模拟考试题(光盘).doc
  5. 在手机测试html,借助 IIS 管理器 -- 用手机测试HTML页面
  6. GTK+开发环境搭建(Centos+Netbeans)
  7. Python3利用pymysql操作 MySQL
  8. 【转】对Java Serializable(序列化)的理解和总结
  9. iphone个人热点无法开启_iPhone无法开启个人热点怎么回事【解决方法】
  10. order调用mdp
  11. XML的常用领域及其优势
  12. 软件设计师历年真题常错的题加解析——上午题
  13. qpsk 16qam matlab,谁能提供16qam和qpsk调制解调的ofdm程序
  14. 开学季:好好聊聊自己的大学生活
  15. android开发中Wifi功能总结
  16. 图书馆座位预约系统管理/基于微信小程序的图书馆座位预约系统
  17. 仙侣奇缘2 无法 启动mysql_仙侣奇缘2服务端
  18. 【Ubuntu】SMBus Host controller not enabled(虚拟机进入不了图形界面)
  19. DevOps流水线(1)什么是Pipeline流水线?
  20. 呼叫中心系统的基本构成和二次开发思路

热门文章

  1. POJ3690:Constellations——题解
  2. RESTful API 设计最佳实践
  3. (备忘)Java数据类型中String、Integer、int相互间的转换
  4. windows域设计best practice
  5. HttpServlet详解
  6. Coolite 中GridView点击行中的按钮时跳转至不同的页面
  7. Memory Information on Windows Mobile(续)
  8. [文摘20070307]英语表示“走”的20种形式
  9. elasticsearch docker无法挂载_使用Docker安装Graylog日志收集系统
  10. Linux 下高级日志文件查看器Log File Navigator