目录
一、通过querySelector / querySelectorAll获取元素
浏览器提供的一个全局对象,类似于CSS中的选择器,可以精准的获取元素对象,这组API都来自于document下,document是浏览器提供的一个全局对象,表示当前页面DOM API基本都是documet对象的方法;
对于单个标签元素的获取,使用querySelector,即可;
如下代码:
<div class="hello" id="hi">你好</div>
<script>
let div = document.querySelector('div');
console.log(div);
</script>
这时候就打开浏览器按下F12,选中控制台,就可以发现,刚刚获取的div元素结果都获取到了;(如下图)

querySelector只是获取单个元素标签,当出现多个相同的元素标签时,只会选中第一个;如果想把多个元素都获取到,可以使用querySelectorAll来完成操作,这个时候返回值就是一个数组,每个元素是一个对象;
如下代码:
<div class="hello" id="hi">你好</div>
<div class="word">世界</div>
<div class="China">中国</div>
<script>
let divs = document.querySelectorAll('div');
console.log(divs);
</script>
打开浏览器按下F12,选中控制台就可以发现:(如下图)

通过innerHTML获取的是标签内部的子元素内容,所以只适用于双标签,单标签不可以的
获取元素并修改div内容(如下代码)
<div>
<span>hello</span>
<span>world</span>
</div>
<script>
let div = document.querySelector('div');
//读取元素
console.log(div.innerHTML);
//修改元素
div.innerHTML = '<p>这里修改了div元素里的内容</p>'
console.log(div.innerHTML);
</script>
执行效果如下图:

通过querySelector / querySelectorAll对元素对象的获取,可以通过此对象对标签属性的修改,修改的就是标签中写的键值对;
如下代码:点击空的a标签,修改href;(不光是这个栗子,其他所有标签的属性也是通过类似的方法进行操作)
<a href="#">点我跳转百度</a>
<script>
let a = document.querySelector('a');
a.onclick = function() {
a.href = "https://www.baidu.com";
}
</script>
通过value获取单标签元素的内容,例如input的标签中,value表示了输入框的内容,修改他,浏览器上的样式也会跟着修改;
如下代码:点击计数(按下+,数字加一,按下-,数字减一)
<input type="text" value="0">
<button class="add">+</button>
<button class="sub">-</button>
<script>
let input = document.querySelector('input');
let add = document.querySelector('.add');
let sub = document.querySelector('.sub');
add.onclick = function() {
//这里注意需要转化为int类型,否则就是字符串
let oldValue = parseInt(input.value);
oldValue = parseInt(oldValue + 1);
input.value = oldValue;
}
sub.onclick = function() {
//这里注意需要转化为int类型,否则就是字符串
let oldValue = parseInt(input.value);
oldValue = parseInt(oldValue - 1);
input.value = oldValue;
}
</script>
checked表示了当前复选框的状态——被选中或者未被选中;
如下代码:(单选和全选)
<span>你有什么爱好?</span><br>
<input type="checkbox" class="one">弹琴<br>
<input type="checkbox" class="one">唱歌<br>
<input type="checkbox" class="one">健身<br>
<input type="checkbox" class="all">全选<br>
<script>
let solo = document.querySelectorAll('.one');//返回一个数组
let all = document.querySelector('.all');
all.onclick = function() {
for(let i = 0; i < solo.length; i++) {
solo[i].checked = all.checked;
}
}
</script>
表示了当前单标签的type属性是什么,同时也可以对其进行修改;
如下代码:(显示密码和隐藏密码)
<span>输入密码:</span>
<input type="password">
<button>显示密码</button>
<script>
let input = document.querySelector('input');
let button = document.querySelector('button');
button.onclick = function() {
if(input.type == 'password') {
input.type = 'text';
button.innerHTML = '隐藏密码';
}else if(input.type == 'text') {
input.type = 'password';
button.innerHTML = '显示密码';
}else {
alert('类型错误!')
}
}
</script>
CSS中的元素属性,都可以通过JS进行修改,通过 元素.style.属性 即可得到style的属性,例如fontSize,这个属性名和CSS中的样式名是对应的,但是CSS里使用脊柱命名,js中是使用小驼峰命名,于是CSS中的font-size就可以认为等价于fontSize;
如下代码:点击字体,开始变大
<h2 style="font-size: 30px;">点击我可以变大</h2>
<script>
let h2 = document.querySelector('h2');
h2.onclick = function() {
let oldSize = h2.style.fontSize;
oldSize = parseInt(oldSize);
oldSize += 10;
//设置样式的值的时候一定要带上单位!
h2.style.fontSize = oldSize + 'px';
}
</script>
CSS开发中最常用的是通过类选择器进行选择,通过修改class属性,实现修改样式的效果,而在JS中通过 元素.className 的方式获得属性,因为在 JS中class是一个关键字,于是就用className来表示这个类属性了~
如下代码:(白天模式and夜间模式)
<style>
/*白天模式*/
.light {
color: black;
background-color: white;
}
/*夜间模式*/
.night {
color: aliceblue;
background-color: black;
}
/*将div铺满整个网页*/
/*html铺满其父类——整个浏览器*/
html {
height: 100%;
}
/*body铺满其父类html*/
body {
height: 100%;
}
/*div铺满其父类body*/
div {
height: 100%;
}
</style>
<div class="light">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
Lorem ipsum dolor sit amet consectetur adipisicing elit. Vitae maiores maxime corrupti quaerat blanditiis laudantium odio. Quo totam temporibus quia earum enim. Doloremque ipsam sed debitis quod soluta, ea necessitatibus?
</div>
<script>
let div = document.querySelector('div');
div.onclick = function() {
if(div.className == 'light') {
div.className = 'night';
}else {
div.className = 'light';
}
}
</script>
分为两个步骤:
第一步:创建元素结点(如下代码)
<body>
<script>
let div = document.createElement('div');
div.id = 'mydiv';//设置id属性
div.className = 'divName';//设置class属性
div.innerHTML = '好久不见你还好吗?';
console.log(div);
</script>
</body>
解释:
此时浏览器上并不会有显示,只是创建出了一个新的div结点并填充了属性;通过写下console.log(div),可以在浏览器的控制台里观察到此标签;(下如图)

第二步:把元素结点插入到dom树中;(有两种方法)
方法一:通过appendChild 或者 append将结点插入到指定结点的最后一个孩子结点的后面(如下代码)
<body>
<div class="target">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<script>
let div = document.createElement('div');
div.id = 'mydiv';//设置id属性
div.className = 'divName';//设置class属性
div.innerHTML = '好久不见你还好吗?';
console.log(div);
let target = document.querySelector('.target');
target.appendChild(div);//这里也可以使用append达到同样的效果
</script>
</body>
效果如下:(浏览器页面)

效果如下:(浏览器控制台)

方法二:使用 insertBefore(要插入的结点,要插入的位置) 将节点插入到指定的节点位置(如下代码,插入到下标为1的位置;“注意:下标从0开始”)
<body>
<div class="target">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<script>
let div = document.createElement('div');
div.id = 'mydiv';//设置id属性
div.className = 'divName';//设置class属性
div.innerHTML = '好久不见你还好吗?';
console.log(div);
let target = document.querySelector('.target');
target.insertBefore(div, target.children[1]);//表示插入到第1个孩子结点的位置(下标从0开始)
</script>
</body>
效果如下:(浏览器页面)

效果如下:(浏览器控制台)

使用 removeChild 删除子节点
如下代码:
<div id="top">
<div>1</div>
<div id="nested">我是要被删除的结点</div>
<div>2</div>
</div>
<script>
let d = document.getElementById("top");
let nested = document.getElementById("nested");
let throwawayNode = d.removeChild(nested);
</script>
注意:

查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm