当前位置: 首页 > news >正文

JavaScript part2

一.前言

前面我们讲了一下js的基础语法,但是这些还是远远不够的,我们要想操作标签,实现一个动态且好看的页面,就得学会BOM和DOM,这些都是浏览器和页面的,这样我们才能实现一个好看的页面

二.BOM对象

BOM:Broswer object model,即浏览器提供我们开发者在javascript用于操作浏览器的对象。

2.1 window对象

窗口方法:

// js中最大的一个对象.整个浏览器窗口出现的所有东西都是window对象的内容.
console.log( window );

// alert()  弹出一个警告框
window.alert("hello");

//confirm  弹出一个确认框,点击确认,返回true, 点击取消,返回false
var ret = confirm("您确认要删除当前文件么?");
console.log( ret  );

// 弹出一个消息输入框,当点击确认以后,则返回可以接收到用户在输入框填写的内容.如果点击取消,则返回null
var ret = prompt("请输入一个内容","默认值");
console.log( ret );

// close() 关闭当前浏览器窗口
window.close();

//打开一个新的浏览器窗口
window.open("http://www.baidu.com","_blank","width=800px,height=500px,left=200px,top=200px";

这些都很简单,我们看一眼过就行了

定时方法:

setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。而setTimeout是在指定的毫秒数后调用code一次


// 设置循环定时器
var ID = window.setInterval(code,millisec)   // 每millisec毫秒执行一次code
// 取消循环定时器
window.clearInterval(ID);

// 设置单次定时器
var ID = window.setTimeout(code,millisec) // millisec毫秒后执行code一次
// 取消单次定时器
window.clearTimeout(ID);

这个也是非常的简单,但是我们会给大家一个定时器的小案例 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><input id='ID1' type="text">
<button onclick="begin()">开始</button>
<button onclick="end()">暂停</button><script>function showtime(){ele=document.getElementById('ID1')ele.value=new Date().toLocaleString()}var idfunction begin(){if(id===undefined){showtime()id=setInterval(showtime,1000)console.log(id)}}function end(){clearInterval(id)id=undefined;}</script></body>
</html>

最后结果长这样,想知道效果自己去测试就好了,这里为什么要判断一下id===undefined呢,这是为了防止开多个定时器,大家开控制台看打印id就知道了,当然这里有很多看不懂的大家等看完dom就都能学会啦

2.2 Location ( 地址栏)对象

这里给个案例自己品

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<button onclick="func1()">查看Location对象</button>
<button onclick="func2()">跳转到往日情怀酿作酒的博客~</button>
<button onclick="func3()">F5</button>
<script>function func1(){console.log( location );}// 地址栏对象控制和操作地址栏// 所谓的地址就是当前页面所在地址// 地址结构:// 协议://域名:端口/路径/文件名?查询字符串#锚点console.log( `协议=>${location.protocol}` );console.log( `端口=>${location.port}` );console.log( `域名=>${location.hostname}` );console.log( `域名:端口=>${location.host}` );console.log( `路径=>${location.pathname}` );console.log( `查询字符串=>${location.search}` );console.log(`完整的地址信息=>${location.href}`);function func2(){// location.href="https://blog.csdn.net/weixin_74178589?spm=1011.2124.3001.5343"; // 页面跳转location.assign("https://blog.csdn.net/weixin_74178589?spm=1011.2124.3001.5343"); // 页面跳转}function func3(){location.reload(); // 刷新页面}
</script>
</body>
</html>

2.3 本地存储对象 

使用存储对象的过程中, 对象数据会根据域名端口进行保存的,所以 js不能获取当前页面以外其他域名端口保存到本地的数据。也就是说,我们存储对象获取数据只能是自己当前端口或者域名下曾经设置过的数据,一旦端口或者域名改变,则无法获取原来的数据。

localStorage    本地永久存储
  localStorage.setItem("变量名","变量值");   保存一个数据到存储对象
  localStorage.变量名 = 变量值               保存一个数据到存储对象

  localStorage.getItem("变量名")   获取存储对象中保存的指定变量对应的数据
  localStorage.变量名              获取存储对象中保存的指定变量对应的数据

  localStorage.removeItem("变量名")   从存储对象中删除一个指定变量对应的数据
  localStorage.clear()               从存储对象中删除所有数据

sessionStorage  本地会话存储
  sessionStorage.setItem("变量名","变量值");   保存一个数据到存储对象
  sessionStorage.变量名 = 变量值               保存一个数据到存储对象

  sessionStorage.getItem("变量名")   获取存储对象中保存的指定变量对应的数据
  sessionStorage.变量名              获取存储对象中保存的指定变量对应的数据

  sessionStorage.removeItem("变量名")   从存储对象中删除一个指定变量对应的数据
  sessionStorage.clear()               从存储对象中删除所有数据

localStorage和sessionStorage的区别:

1、localStorage和sessionStorage一样都是用来存储客户端临时信息的对象。

2、他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现)。

3、localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。

4、不同浏览器无法共享localStorage或sessionStorage中的信息。相同浏览器的不同页面间可以共享相同的 localStorage(页面属于相同域名和端口),但是不同页面或标签页间无法共享sessionStorage的信息。这里需要注意的是,页面及标 签页仅指顶级窗口,如果一个标签页包含多个iframe标签且他们属于同源页面,那么他们之间是可以共享sessionStorage的。

三.DOM对象(JS核心)

DOM document Object Model 文档对象模型

整个html文档,会保存一个文档对象document
console.log( document ); // 获取当前文档的对象

 3.1 查找标签

直接查找标签:

document.getElementsByTagName("标签名")
document.getElementById("id值")
document.getElementsByClassName("类名")

其中getelement返回的是标签对象,而getelements返回的是数组对象

导航查找标签:

elementNode.parentElement           // 父节点标签元素
elementNode.children                // 所有子标签
elementNode.firstElementChild       // 第一个子标签元素
elementNode.lastElementChild        // 最后一个子标签元素
elementNode.nextElementSibling     // 下一个兄弟标签元素
elementNode.previousElementSibling  // 上一个兄弟标签元素

CSS选择器查找:

document.querySelector("css选择器")  //根据css选择符来获取查找到的第一个元素,返回标签对象(dom对象)
document.querySelectorAll("css选择器"); // 根据css选择符来获取查找到的所有元素,返回数组

3.2 绑定事件

静态绑定 :直接把事件写在标签元素中。

<div id="div" οnclick="foo(this)">click</div>

<script>
    function foo(self){           // 形参不能是this,这个self就代表这个标签
        console.log("foo函数");
        console.log(self);
    }
</script>

 动态绑定:在js中通过代码获取元素对象,然后给这个对象进行后续绑定。

<p id="i1">往日情怀酿作酒</p>

<script>

    var ele=document.getElementById("i1");

    ele.οnclick=function(){
        console.log("ok");
        console.log(this);    // this直接用,代表的就是这个对象
    };

</script>

多个标签绑定事件

<ul>
  <li>请关注</li>
  <li>往日情怀酿作酒</li>
  <li>谢谢</li>
</ul>


<script>

  eles=document.querySelectorAll('ul li')
  for(var i=0;i<eles.length;i++){
    eles[i].οnclick=function (){
      console.log(this.innerHTML)
      // console.log(eles[i].innerHTML) //这个会报错
    }
  }
  // console.log(i) //这里打印i会发现等于3

</script>

这个就能体现出this的重要性

 3.3 操作标签

<标签名 属性1=“属性值1” 属性2=“属性值2”……>文本</标签名> 

文本操作:

<div class="c1"><span>click</span></div><script>var ele =document.querySelector(".c1");ele.onclick = function (){// 查看标签文本console.log(this.innerHTML)console.log(this.innerText)// this.innerText='往日情怀酿作酒'this.innerHTML = "<a href='https://blog.csdn.net/weixin_74178589?spm=1011.2124.3001.5343'>往日情怀酿作酒</a>"}</script>

大家可以测试一下,发现innerText和innerHTML的区别就是,前者是一个纯文本,后者会识别标签,然后把标签给识别上去

value操作:

像input标签,select标签以及textarea标签是没有文本的,但是显示内容由value属性决定  

 

<input id="i1" type="text"><script>ele=document.getElementById('i1');ele.click=function (){console.log(this.value)this.value='往日情怀酿作酒'console.log(this.value)}

这个就是当我们点击文本框的时候文本内容就会改变

css样式操作:

<h1>往日情怀酿作酒</h1><script>ele=document.getElementsByTagName('h1');ele[0].οnclick=function (){this.style.color='red'}</script>

这个就是点击变成红色,其实这个也就是操作了节点里面的style属性

属性操作:

elementNode.setAttribute("属性名","属性值")    
elementNode.getAttribute("属性名")       
elementNode.removeAttribute("属性名"); 

 并不是所有属性都可以像value那样操作。

class属性操作**

elementNode.className
elementNode.classList.add
elementNode.classList.remove

因为class是特殊的一个属性,所以有专门的方法,有了这个就能实现很多功能,例如商品:

 

这个就是这么实现的通过改变class属性实现的

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>*{margin: 0;padding: 0;}.tab{width: 800px;height: 300px;/*border: 1px solid red;*/margin: 200px auto;}.tab ul{list-style: none;}.tab-title{background-color: #f7f7f7;border: 1px solid #eee;border-bottom: 1px solid #e4393c;}.tab .tab-title li{display: inline-block;padding: 10px 25px;font-size: 14px;}li.current {background-color: #e4393c;color: #fff;cursor: default;}.hide{display: none;}</style>
</head>
<body><div class="tab"><ul class="tab-title"><li class="current" index="0">商品介绍</li><li class="" index="1">规格与包装</li><li class="" index="2">售后保障</li><li class="" index="3">商品评价</li></ul><ul class="tab-content"><li>商品介绍...</li><li class="hide">规格与包装...</li><li class="hide">售后保障...</li><li class="hide">商品评价...</li></ul>
</div><script>var titles = document.querySelectorAll(".tab-title li");var contents = document.querySelectorAll(".tab-content li");for (var i = 0;i<titles.length;i++){titles[i].onclick = function () {// (1) 触发事件标签拥有current样式for (var j = 0;j<titles.length;j++){titles[j].classList.remove("current")}console.log(this);this.classList.add("current");// (2) 显示点击title对应的详情内容var index = this.getAttribute("index");// console.log(this.getAttribute("index"));// console.log(contents[index]);for (var z = 0;z<contents.length;z++){contents[z].classList.add("hide");}contents[index].classList.remove("hide");}}</script></body>
</html>

 这个代码直接给大家,就不过多赘述了

节点操作 :

// 创建节点:
document.createElement("标签名")
// 插入节点
somenode.appendChild(newnode)             // 追加一个子节点(作为最后的子节点)
somenode.insertBefore(newnode,某个节点)   // 把增加的节点放到某个节点的前边
// 删除节点
somenode.removeChild():获得要删除的元素,通过父元素调用删除
//替换节点
somenode.replaceChild(newnode, 某个节点);

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>img{display: block;}</style></head>
<body><button class="add_btn">添加节点</button>
<button class="del_btn">删除节点</button>
<button class="replace_btn">替换节点</button>
<div class="c1"><h3 class="c2">往日情怀酿作酒</h3>
</div><script>father=document.querySelector('.c1')add=document.getElementsByClassName('add_btn')[0];del=document.getElementsByClassName('del_btn')[0];replace=document.getElementsByClassName('replace_btn')[0]add.onclick=function (){var ele=document.createElement("h3")ele.innerText='往日情怀酿作酒'console.log(ele)father.appendChild(ele)}del.onclick=function (){ele=document.querySelector('.c1').firstElementChildconsole.log(ele)if(ele){father.removeChild(ele)}}replace.onclick=function (){ele=document.querySelector('.c1 h3:first-of-type')console.log(ele)if(ele){re_ele=document.createElement("img")re_ele.src='https://www.keaitupian.cn/cjpic/frombd/2/253/3246004806/1427273025.jpg'console.log(ele)father.replaceChild(re_ele,ele)}}</script></body>
</html>

这个就是很好的一个替换删除的例子 

 

效果大致如下

3.4 常见事件

onload事件:

这个就是当我们加载完所有的文档之后触发的,举个例子就是当我们把script写在文档的上面,如果涉及了dom操作就会因为找不到标签而报错,但是当我们把所有代码放在onload里面的话就会有问题啦,他会等到加载完文档再执行onload里面的内容

onsubmit事件:

于处理表单提交时的操作。当用户提交一个表单时,可以通过这个事件执行特定的 JavaScript 代码,比如验证输入数据、取消提交等 

 onchange事件

用于在输入元素(如 <input>, <select>, 或 <textarea>)的值发生改变时触发。当用户改变输入的内容并移开焦点时,该事件会被触发

onmouse事件:

onmouse 事件系列是 JavaScript 中用于处理与鼠标相关的交互的事件。这些事件包括 onmouseoveronmouseoutonmousemoveonclickondblclickonmousedownonmouseup

onkey事件: 

onkey 事件系列是 JavaScript 中用于处理与键盘交互的事件。主要的键盘事件包括 onkeydownonkeyuponkeypress

onblur和onfocus事件 :

onbluronfocus 是 JavaScript 中用于处理元素获得或失去焦点的事件。这些事件通常用于表单元素,如输入框和文本区域,以增强用户体验

冒泡事件 :

<div class="c1">
    <div class="c2"></div>
</div>


<script>

    var ele1 = document.querySelector(".c1");
    ele1.onclick = function () {
        alert("c1区域")
    };

    var ele2 = document.querySelector(".c2");
    ele2.onclick = function (event) {
        alert("c2区域");
        
        // 如何阻止事件冒泡
        event.stopPropagation();
    }

</script>

这个就是如果子标签再父标签里面,两个都绑定了同一个事件,当两个同时触发同一个事件的时候,子标签也会触发父标签的内容,这样当我们使用event.stopPropagation()就会阻止冒泡事件

四.总结


 

五.补充 

这里给大家一个前端的员工关系代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>.box {width: 80%;height: 270px;margin: 20px auto;}.box td{width: 180px;text-align: center;}.box input{padding: 5px 5px;height: 20px;}</style>
</head>
<body><h3>员工管理系统</h3><div class="box"><table border="1" cellpadding="5px" ><thead><tr><th>姓名</th><th>年龄</th><th>部门</th><th>删除</th><th>编辑</th></tr></thead><tbody class="tbody"><tr><td>张三</td><td>23</td><td>销售</td><td><button onclick="del_tr(this)">删除</button></td><td><button onclick="edit_tr(this)">编辑</button></td></tr><tr><td>李四</td><td>21</td><td>销售</td><td><button onclick="del_tr(this)">删除</button></td><td><button onclick="edit_tr(this)">编辑</button></td></tr><tr><td>王五</td><td>23</td><td>运营</td><td><button onclick="del_tr(this)">删除</button></td><td><button onclick="edit_tr(this)">编辑</button></td></tr></tbody></table>
</div><fieldset class="add-box"><legend>添加员工</legend><p>姓名:<input type="text" class="name"></p><p>年龄:<input type="text" class="age"></p><p>部门:<select name="" id="i1"><option value="销售">销售部</option><option value="运营">运营部</option><option value="财务">财务部</option></select></p><button class="add">添加</button>
</fieldset><script>var add = document.querySelector(".add");var tbody = document.querySelector(".tbody");add.onclick = function () {var inputs = document.querySelectorAll(".add-box input");var tr = document.createElement("tr");for (var i = 0; i < inputs.length; i++) {var td = document.createElement("td"); // <td></td>td.innerHTML = inputs[i].value;tr.appendChild(td);// 清空inputs[i].value = ""}var s = document.querySelector("#i1");td = document.createElement("td");td.innerHTML = s.value;tr.appendChild(td);// 添加删除按钮var button = document.createElement("button");button.innerHTML = "删除";button.setAttribute("onclick", "del_tr(this)");td = document.createElement("td");td.appendChild(button);tr.appendChild(td);// 添加编辑按钮button = document.createElement("button");button.innerHTML = "编辑";button.setAttribute("onclick", "edit_tr(this)");td = document.createElement("td");td.appendChild(button);tr.appendChild(td);tbody.appendChild(tr);};function del_tr(self) {var tr = self.parentElement.parentElement;tbody.removeChild(tr);}function edit_tr(self) {self.innerHTML = "保存";self.setAttribute("onclick","save(this)");console.log(self.parentElement.parentElement.children);var children_td = self.parentElement.parentElement.children;for(var i=0;i<children_td.length-2;i++){var inp = document.createElement("input");inp.setAttribute("type","text");// inp.value = children_td[i].innerHTML;inp.setAttribute("value",children_td[i].innerHTML);console.log("::",inp);children_td[i].innerHTML = "";children_td[i].appendChild(inp);}}function save(self) {self.innerHTML = "编辑";self.setAttribute("onclick","edit_tr(this)");var children_td = self.parentElement.parentElement.children;for(var i=0;i<children_td.length-2;i++){children_td[i].innerHTML = children_td[i].firstElementChild.value}}</script></body>
</html>

 

至此,我们js的基础就全部讲完了,下一节就和大家说jquery,来完善一下我们所学前端的内容

 

相关文章:

JavaScript part2

一.前言 前面我们讲了一下js的基础语法&#xff0c;但是这些还是远远不够的&#xff0c;我们要想操作标签&#xff0c;实现一个动态且好看的页面&#xff0c;就得学会BOM和DOM&#xff0c;这些都是浏览器和页面的&#xff0c;这样我们才能实现一个好看的页面 二.BOM对象 BOM…...

HarmonyOS开发 - 本地持久化之实现LocalStorage实例

用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。数据存储形式为键值对&#xff0c;键的类型为字符串型&#xff0c;值的存储数据类型包括数字型、字符型、布尔型以及这3种类型的数组类型。 说明&#x…...

【C++打怪之路Lv12】-- 模板进阶

#1024程序员节&#xff5c;征文# &#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您…...

第23周Java主流框架入门-SpringMVC 2.RESTful开发风格

课程笔记&#xff1a;RESTful 开发风格 课程介绍 本节课程介绍 RESTful 开发风格&#xff0c;以及如何在 Spring MVC 中应用这种开发模式。传统 MVC 开发通过 Servlet、JSP 和 Java Bean 实现前后端交互&#xff0c;而 RESTful 开发提供了一种新的理念&#xff0c;更适合现代…...

QT枚举类型转字符串和使用QDebug<<重载输出私有枚举类型

一 将QT自带的枚举类型转换为QString 需要的头文件&#xff1a; #include <QMetaObject> #include <QMetaEnum> 测试代码 const QMetaObject *metaObject &QImage::staticMetaObject;QMetaEnum metaEnum metaObject->enumerator(metaObject->indexOf…...

手机柔性屏全贴合视觉应用

在高科技日新月异的今天&#xff0c;手机柔性显示屏作为智能手机市场的新宠&#xff0c;以其独特的可弯曲、轻薄及高耐用性特性引领着行业潮流。然而&#xff0c;在利用贴合机加工这些先进显示屏的过程中&#xff0c;仍面临着诸多技术挑战。其中&#xff0c;高精度对位、应力控…...

《Python游戏编程入门》注-第3章3

《Python游戏编程入门》的“3.2.4 Mad Lib”中介绍了一个名为“Mad Lib”游戏的编写方法。 1 游戏玩法 “Mad Lib”游戏由玩家根据提示输入一些信息&#xff0c;例如男人姓名、女人姓名、喜欢的食物以及太空船的名字等。游戏根据玩家输入的信息编写出一个故事&#xff0c;如图…...

Netty-TCP服务端粘包、拆包问题(两种格式)

前言 最近公司搞了个小业务&#xff0c;需要使用TCP协议&#xff0c;我这边负责服务端。客户端是某个设备&#xff0c;客户端传参格式、包头包尾等都是固定的&#xff0c;不可改变&#xff0c;而且还有个蓝牙传感器&#xff0c;透传数据到这个设备&#xff0c;然后通过这个设备…...

centos安装指定版本的jenkins

打开jenkins镜像包官网&#xff0c;找到自己想要安装的版本&#xff0c;官网地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable 下载指定版本安装包&#xff1a; wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.452.…...

QT 周期性的杀死一个进程(软件),一分钟后自动退出

1.原因&#xff1a;某软件开机自启动很烦&#xff0c;搞一个程序干掉这个自启动的软件 2.QT代码 main.cpp #include "KillXXX.h" #include <QtWidgets/QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);KillXXX k;return a.exec…...

MySQL任意版本安装卸载和数据库原理图绘制

MYSQL任意版本安装和卸载 安装&#xff1a; 1、解压文件 --- 不能出现中文路径 2、在解压目录&#xff08;安装目录&#xff09;下&#xff1a; 1>.创建data文件夹 2>.创建配置文件my.txt 然后修改成ini格式 3、修改配置文件 basedirD:\\mysql\\mysql-5.7.28-winx64…...

技术成神之路:设计模式(二十三)解释器模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;用于定义一种语言的文法表示&#xff0c;并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…...

2024软考《软件设计师》-Python专题知识(含历年真题解析)

自2020年之后&#xff0c;软考软件设计师考试在综合知识部分开始增加Python编程语言相关考点&#xff0c;每年会考2~3分的样子。本文将结合近几年常考的内容&#xff0c;扩展一下Pyhton的基础知识&#xff01;考前看一看&#xff0c;或许有所帮助。 一、基础语法 标识符 第一…...

基于大数据 Python+Vue 旅游推荐可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…...

使用虚拟机搭建环境:CentOS7 Docker、MySQL、Redis 安装与配置

创作灵感 项目实践总结&#xff1a;记录了在虚拟机中安装与配置CentOS7环境下的Docker、MySQL、Redis的全过程&#xff0c;帮助理解和应用各项技术。技术笔记与问题总结&#xff1a;详细梳理了每一步安装的关键点与常见问题&#xff0c;并给出了解决方案。职业感悟与心得&…...

[分享] Docker容器可视化管理工具 - WGCLOUD

WGCLOUD是新一代运维监测平台&#xff0c;它可以监控Docker容器的各种性能数据&#xff0c;比如内存&#xff0c;cpu&#xff0c;Image&#xff0c;运行时间&#xff0c;运行状态&#xff0c;端口映射等信息 WGCLOUD也支持在页面启动&#xff0c;重启&#xff0c;停止Docker容…...

保存网页中 canvas 的内容

在开发人员工具中,保存网页中 canvas 的内容,可以用这个方法: 1. 在 dom 中创建一个下载按钮 <button id="save">保存</button>2. 控制台中运行: const gCanvas = document.querySelector(#page_1);function onSave() {gCanvas.toBlob((blob) =&g…...

PID控制原理

PID控制原理 PID控制器是一种经典且广泛应用于工业控制领域的反馈控制器&#xff0c;它由比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三个部分组成。通过对这三个部分的综合调节&#xff0c;PID控制器能够实现对被控对象的…...

python 使用 企微机器人发送消息

import requestswecom_bot_webhook ""msg_text "" # 要发送的消息内容""" mentioned_mobile_list : 手机号列表 , 提醒手机号对应的群成员(某个成员) """ res requests.post(wecom_bot_webhook,json{"msgtype"…...

ARM/Linux嵌入式面经(五二):华为

文章目录 一面技术面相关问题1. **硬件改进的具体内容是什么?**硬件改进的具体内容深入询问及回答2. **在维护前任师兄的代码时,你遇到了哪些挑战?**问题回答面试官追问及回答3. **在嵌入式系统中,内存泄漏通常有哪些原因?**一、内存泄漏的主要原因二、内存泄漏的具体场景…...

[旧日谈]高清画面撕裂问题考

背景 无边框透明背景透明的窗口&#xff0c;在随着缩放比例非整数倍数放大时的画面发生了露底、撕裂问题。 当我们在使用Qt开发的时候&#xff0c;遇到了一个结构性问题。因为我们的软件是自己做的&#xff0c;所以要自己定义标题栏&#xff0c;所以我们设置了软件为FrameLess…...

Nginx反向代理-域名代理前后端项目部署流程

一、下载Nginx 地址&#xff1a;https://nginx.org/en/download.html 1、稳定版本下载 二、Nginx配置 1、下载文件完成后&#xff0c;解压文件 2、打开文件目录下conf目录&#xff0c;打开找到nginx.conf 3、文件配置 注意&#xff1a;.conf 文件使用文本编辑器编辑后&…...

代码随想录(十二)——图论

并查集 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xff1a;join(int u, int v)&#xff0c;将两个节点连在同一个根节点上判断两个节点是否在…...

如何通过 Service Mesh 构建高效、安全的微服务系统

1. 引言 1.1.什么是 Service Mesh&#xff1f; Service Mesh 是一种基础架构层&#xff0c;负责处理微服务之间的通信&#xff0c;它通过在每个服务旁边部署代理&#xff08;通常称为 Sidecar&#xff09;来捕获和管理服务间的网络流量。这种方式解耦了微服务的业务逻辑和基础…...

MySQL 临时表详解

在 MySQL 中&#xff0c;临时表&#xff08;Temporary Table&#xff09;是一种非常有用的工具&#xff0c;可以帮助我们在执行复杂查询时存储临时数据。临时表的存在时间仅限于会话期&#xff0c;当会话结束后&#xff0c;临时表自动销毁。本文将详细讲解 MySQL 临时表的创建、…...

Kafka系列之:Kafka集群新增节点后实现数据均衡

Kafka系列之:Kafka集群新增节点后实现数据均衡 一、背景二、Kafka集群快速负载均衡方案三、按照Topic负载均衡Kafka系列之:使用Kafka Manager实现leader分区平衡和broker节点上分区平衡一、背景 Kafka集群新增节点,要使得每个节点数据均衡,在增加完kafka topic分区后,要进…...

实验:使用Oxygen发布大型手册到Word格式

此前&#xff0c;我曾发表过一篇文章《结构化文档发布的故事和性能调优》&#xff0c;文中讨论了在将大型DITA手册转换为PDF格式时可能遇到的性能挑战及相应的优化策略。 近日&#xff0c;有朋友咨询&#xff0c;若将同样的大型手册输出为MS Word格式&#xff0c;是否也会面临…...

一个基于.NET8+WPF开源的简单的工作流系统

项目介绍 AIStudio.Wpf.AClient 是一个基于 WPF (Windows Presentation Foundation) 构建的客户端框架&#xff0c;专为开发企业级应用而设计。该项目目前版本为 6.0&#xff0c;进行了全面优化和升级&#xff0c;提供了丰富的功能和模块&#xff0c;以满足不同场景下的开发需…...

MFC工控项目实例二十七添加产品参数

承接专栏《MFC工控项目实例二十六创建数据库》 在型号参数界面添加三个参数试验时间、最小值、最大值。变量为double m_edit_time; double m_edit_min; double m_edit_max; 1、在SEAL_PRESSURE.h中添加代码 class CProductPara { public:union{struct{...double m_edit_min;…...

PgSQL常用SQL语句

PgSQL常用SQL语句 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 PgSQL是一种开源的关系型数据库管理系统&#xff0c;它是PostgreSQL的一种实现。本文将介绍一些常用的PgSQL SQL语句&a…...

大连城市建设档案馆官方网站/seo搜索引擎优化工作内容

1.介绍 Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。使用Config Server&#xff0c;您可以在所有环境中管理应用程序的外部属性。客户端和服务器上的概念映射与Spring Environment和PropertySource抽象相同&#xff0c;因此它们与Spring应用程序非常契…...

广州网站建设推广易尚/谷歌三件套下载

再谈区块链在积分领域的应用 路云区链 | 31. Aug, 2016 | 3 次阅读 传统积分应用存在的问题 负债型积分总体问题&#xff1a; 1、具有零散、消费乏力、使用限制多、兑换繁琐、难以流通的特点。如A商家“发行”的积分&#xff0c;B商家不给予通兑。 2、同时&#xff0c;…...

做网站的注意什么问题/房地产市场现状分析

更多Java全套学习资源均在专栏&#xff0c;持续更新中↑↑戳进去领取~ &#x1f357;MySQL的安装及登陆基本操作&#xff08;附图&#xff09;手把手带你安装 &#x1f357;MySQL基础&#xff1a;通过SQL对数据库进行CRUD &#x1f357;MySQL基础&#xff1a;通过SQL对表、数据…...

做查询网站费用/行业关键词查询

ER图(实体关系图)是一种数据库建模方法&#xff0c;帮助表示实体和实体之间的关系。 MySQL本身不提供画ER图的功能&#xff0c;你可以使用第三方工具&#xff0c;如&#xff1a; LucidchartMicrosoft VisioGliffyDraw.io 这些工具都支持画ER图&#xff0c;且都有免费版本。可以…...

山西做网站/代写企业软文

我的Docker专栏 https://blog.csdn.net/weixin_45580378/category_12276045.html docker 镜像 https://registry.hub.docker.com/r/nacos/nacos-server/tags 1.下载nacos镜像 这里下载的是2.0.3 docker pull nacos/nacos-server:2.0.32.查看镜像是否下载成功 如下图 docker…...

双流规划建设管理局网站/爱站网关键词查询网站的工具

一、 数据库的导出(expdp)1.创建默认导出目录SQL>create directory [dirname] as ‘[dirpath]’;2.赋予指定用户在此目录的读写权限SQL>GRANT READ, WRITE ON DIRECTORY [dirname] to [dbuser];3.使用expdp导出数据库① 导出完整schema> expdp [username/passwd]DUMPF…...