刚入职的时候看到公司用的HTML日志生成工具附带的Panel,工具不够用,找个Fail还要找半天,于是自己琢磨着添砖加瓦。以前也是个半吊子前端工程师,现在可倒好,想要改页面却连页面生成的模板在哪里都不知道,只有通过改动JavaScript才能实现对页面的修改。

固然,操作DOM有原版的

  1. document.getElementsBy

一族,可是它们get的时候不能通过 class 和 标签 来区分,比如:

  1. <div class="FAIL">
  2. <tr class="FAIL">
  3. <td class="FAIL ">I am row NO.1</td>
  4. <td class="TRACE">I am row NO.2</td>
  5. <td class="DEBUG">I am row NO.3</td>
  6. <td class="ERROR">I am row NO.4</td>
  7. </tr>
  8. </div>

通过Class查找会找出一堆FAIL;通过Tag查找……算了吧;通过ID查找……好吧根本没有定义过ID。

活人总不能被尿憋死,CSS3中增强了对选择器的支持,新特性中有:

  1. document.querySelector

函数家族,他们是:

  1. document.querySelector('tagName.className')

An Element object representing the first element in the document that matches the specified set of CSS selectors, or null is returned if there are no matches.(By MDN)

返回匹配输入的CSS选择器的第一个元素,如果没有匹配的元素,返回空(null)。

  1. document.querySelectorAll('tagName.className')

If you need a list of all elements matching the specified selectors, you should use querySelectorAll() instead.(By MDN)

如果你需要找到所有的匹配元素,请使用querySelectorAll

真的是很方便了。实际案例在下面!

还值得一提的是,这个方法相比于Anchor,多了方便的动画和滚动位置设定

  1. document.querySelectorAll(eventName)[index].scrollIntoView({ behavior:"auto, "block: "start", inline: "nearest" });

三个属性分别控制动画、滚动到所选区域的哪里,滚动到本页面的哪里。比起 “herf="#top"”来讲方便了许多啊!

部分案例代码:

  1. /*
  2. Function to add some new buttons to the panel
  3.  
  4. Input: *None*
  5.  
  6. Returns: *None*
  7.  
  8. Effects: add "to top", "to bottom", "find fail" and "find error" buttons
  9.  
  10. Modified on Mar 2019 by Jack Lyu
  11.  
  12. Advise / Next stage: remove functions and put these buttons inside the HTML pages
  13. */
  14.  
  15. function addButtons() {
  16. //adding anchor to page
  17. var pageTop = document.createElement('a');
  18. pageTop.setAttribute("id", "top");
  19. var pageBottom = document.createElement('a');
  20. pageBottom.setAttribute("id", "bottom")
  21. var tableBody = document.getElementById("content");
  22. tableBody.insertBefore(pageTop, tableBody.firstChild);
  23. $(pageBottom).insertAfter(tableBody);
  24.  
  25. //adding link to page
  26. var infoText = document.createElement('p');
  27. infoText.setAttribute("style", "font-size: 1em;margin:0 0 5px 5px");
  28. infoText.innerHTML = "Navigator v1.0<br><div style='color:red;>'>Error(s):" + window.counterError + " Fail(s):" + window.counterFail + "</div>";
  29. var toTop = document.createElement('a');
  30. toTop.setAttribute("href", "#top");
  31. toTop.setAttribute("onclick", "resetCounter('All')");
  32. toTop.setAttribute("style", "color:#333333;margin:5px 0 0 5px;border:2px solid #6CDFEA;");
  33. toTop.innerHTML = "To Top";

  34. // 省略一部分
  35.  
  36. panleBottom.insertBefore(toBottom, panleBottom.lastChild);
  37.  
  38. //adding "find next fail" button function
  39. var failButton = document.createElement('div');
  40. failButton.setAttribute("style", "margin: 15px 0 0 5px;");
  41. var findNextFail = document.createElement('a');
  42. findNextFail.setAttribute("href", "javascript:void(233)");
  43. findNextFail.setAttribute("onclick", "findNext('tr.FAIL')");
  44. findNextFail.setAttribute("style", "color:#333333;border:3px solid #F02311;margin-left:5px;padding:5px 1.19em 5px 5px;width:30%;text-align:center");
  45. findNextFail.innerHTML = "Next FAIL";
  46. failButton.insertBefore(findNextFail, failButton.lastChild);
  47. //adding "Prev fail" button function
  48. var findFail = document.createElement('a');
  49. findFail.setAttribute("href", "javascript:void(233)");
  50. findFail.setAttribute("onclick", "findNext('tr.FAIL',false)");
  51. findFail.setAttribute("style", "color:#333333;border:3px solid #F02311;padding:5px 1.19em 5px 5px;width:30%;text-align:center");
  52. findFail.innerHTML = "Prev FAIL";
  53. failButton.insertBefore(findFail, failButton.lastChild);

  54. // 省略一部分

  55. //add both button to panle
  56. panleBottom.insertBefore(errorButton, panleBottom.lastChild);
  57. }
  58.  
  59. /*
  60. Function to locate target event
  61.  
  62. Input: eventName
  63.  
  64. Returns: *None*
  65. */
  66.  
  67. function findEvent(eventName) {
  68. var list = document.querySelectorAll(eventName);
  69. var tag = eventName.split(".")[1];
  70. for (let index = list.length - 1; index >= 0; index--) {
  71. list[index].setAttribute("id", tag + index);
  72. list[index].firstChild.setAttribute("style", "background-color:#FFC943")
  73. }
  74. }
  75.  
  76. /*
  77. Function to find next event
  78.  
  79. Input: eventName
  80.  
  81. Returns: *None*
  82.  
  83. Notice: Only work on some browsers: Chorme 29 and above(animation work on 61 above), IE8 and above, Firefox 1 and above(animation work on 36 above)
  84. */
  85.  
  86. function findNext(eventName, isNext) {
  87. var index;
  88. if (isNext == false) {
  89. addCounter(eventName, 2);
  90. findNext(eventName);
  91. return;
  92. }
  93. else if (eventName == 'tr.ERROR') {
  94. if (pointerError < 1) { resetCounter('tr.ERROR'); }
  95. index = counterError - pointerError;
  96. pointerError--;
  97. }
  98. else if (eventName == 'tr.FAIL') {
  99. if (pointerFail < 1) { resetCounter('tr.FAIL'); }
  100. index = counterFail - pointerFail;
  101. pointerFail--;
  102. }
  103.  
  104. else { alert('Script findNext error, call maintainer for help.'); }
  105. document.querySelectorAll(eventName)[index].scrollIntoView({ block: "start", inline: "nearest" });
  106. }
  107.  

[2019.03.16]使用DOM操作函数和CSS选择器来针对已有的HTML进行只凭JS的改动的更多相关文章

  1. JS DOM操作 函数 事件 阻止事件冒泡

    一 函数 1.字符串函数 s.tolowerCase( ):    -- 变小写 s.toupperCase( ):   -- 变大写 s.substr( 2 , 8 ):     -- 截取     ...

  2. 2019.03.16 ZJOI2019模拟赛 解题报告

    得分: \(100+27+20=147\)(\(T1\)巨水,\(T2,T3\)只能写暴力分) \(T1\):深邃 比较套路的一眼题,显然是一个二分+贪心,感觉就是\(NOIP2018Day1T3\) ...

  3. jQuery-1.9.1源码分析系列(十一) DOM操作

    DOM操作包括append.prepend.before.after.replaceWith.appendTo.prependTo.insertBefore.insertAfter.replaceAl ...

  4. 【summary】JQuery 相关css、ajax、数据操作函数或方法

    总结一下JQuery常用的函数方法,更加系统的整理一下. JQuery遍历的一些函数: 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集 ...

  5. 原生JavaScript常用的DOM操作

    之前项目一直都是用JQuery或者Vue来做的,确实好用,毕竟帮我们解决了很多浏览器兼容问题,但是后面发现大公司面试题都是要原生Javascript来做,然后我就一脸懵逼哈哈哈,毕竟大公司需要的框架或 ...

  6. React.js 小书 Lesson21 - ref 和 React.js 中的 DOM 操作

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson21 转载请注明出处,保留原文链接和作者信息. 在 React.js 当中你基本不需要和 DO ...

  7. ref 和 React.js 中的 DOM 操作

    在 React.js 当中你基本不需要和 DOM 直接打交道.React.js 提供了一系列的 on*方法帮助我们进行事件监听,所以 React.js 当中不需要直接调用 addEventListen ...

  8. javascrtpt DOM操作

    DOM DOM:(document object mode)文档对象模型.DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构. 目的就是为了能让js操作html元素而制定的一个规范 DO ...

  9. 解密jQuery内核 DOM操作的核心函数domManip

    domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...

随机推荐

  1. vue实例的生命周期函数

    Vue的生命周期函数通常分为以下三类: ①实例创建时的生命周期函数:②实例执行时的生命周期的函数:③实例销毁时的生命周期的函数. 代码与注释详解: <!DOCTYPE html> < ...

  2. SpringBoot 2.0 mybatis mapper通用类

    <!---mybatis通用类包含mybatis和连接池 mybatis和连接池就不需要引入--> <dependency> <groupId>tk.mybatis ...

  3. Ubuntu 16.04 nvidia-smi报错(重装Nvidia驱动)

    之前因为学习TensorFlow,所以在自己的Ubuntu上安装了cuda,cudnn以及Nvidia驱动.但可能是由于自己经常不注重正常关闭自己的Ubuntu,这就导致了一个问题: 某天在查看自己的 ...

  4. flex 实例 豆瓣手机端布局实现

    0.最终成品

  5. 小程序应用的Python服务器部署高配,依然是腾讯云秒杀阿里云!

    上一篇文章,“小程序创业最低配置部署,腾讯云折扣秒杀阿里云!”介绍了小程序项目启动时的最低配置服务器选择,但当项目良好发展时,还是要把服务器配置调整到标准水平,承受住日益增长的流量访问. 随着Pyth ...

  6. 源码浅谈(二):java中的 Integer.parseInt(String str)方法

    这个方法是将字符串转换为整型 一.parseInt方法 ,可以看到默认又调用了parseInt(s,10) ,  第二个参数为基数,默认10 ,当然也可以自己设置  public static int ...

  7. Java:配置环境(Mac)——Eclipse;修改JDK版本后,Eclipse打不开

    1.官网下载 选择一个速度快的镜像 推荐东软这个 2.双击下载的安装包,下一步 其中有一步是选择Eclipse版本,SE选第一个,EE第二个.仔细审题吧. 3.配置JDK 应用.关闭 4.测试:写个H ...

  8. Ngnix负载均衡安装及配置

    1.ngnix概念 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5 ...

  9. Asp.Net中virtual、override理解

    virtual关键字用于指定属性或方法在派生类中重写.默认情况下,派生类从其基类继承属性和方法,如果继承的属性或方法需要在派生类中有不同的行为,则可以重写它,即可以在派生类中定义该属性或方法的新实现, ...

  10. SQLServer之ISO游标使用

    什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...