主頁 > 企業開發 > DOM

DOM

2022-01-27 07:14:44 企業開發

DOM

基本概念

所謂DOM是給檔案中的每一個標簽都對應的創建一個物件,

我們要為每一個HTML標簽創建一個物件的物件,

我們可以通過這個對應的物件來操作這個標簽(所有屬性,內容,樣式等等),

創建的這個物件和編程語言是無關的,

JS就實作了DOM模型,也就是說,在JS中默認就會為頁面的所有的標簽創建一個對應的物件模型,我們可以通過對應的API獲取這些物件模型,通過這些物件模型操作頁面的標簽,

通過JS操作DOM物件

DOM物件模型的最頂層是一個物件:document,表示整個檔案,這個物件是內置的,不需要你創建,直接可以使用, 就好像我們之前使用的一個API document.getElementById(id);

tips: JS是基于物件的語言,   ---  我個人理解,JS更加的面向物件,

[1]獲取頁面中的標簽對應的DOM物件,

JS給我們提供了幾個API:(一些提供的方法,這些方法都是document物件的方法)

通過元素的id直接獲取一個指定的標簽的DOM物件document.getElementById(id);

引數ID就是要獲取的元素的ID

案例:

        var usernameDom = document.getElementById("username");
l(usernameDom);
alert(usernameDom);

瀏覽器控制臺輸出的效果:

瀏覽器格式化之后得到的效果,也就是物件的toString,

alert的效果:

上面的toString是[object HTMLInputElement]

tips:頁面上不能出現相同id的元素,如果出現相同id的元素,我們通過id獲取這個元素的時候,只能獲取到第一個,

②獲取頁面的所有的元素

document.all; 這里回傳的是一個陣列

    var all = document.all;
l(all);

③獲取指定型別的元素

documetn.xxxx

  • Document.anchors

  • Document.body

  • Document.forms

  • Document.images

  • Document.links

④幾個常用的獲取頁面一組元素的API

document.getElementsByTagName(tagName) : 獲取指定標簽名的一組元素,回傳一個物件陣列,

Document.getElementsByClassName(): 獲取一組有相同的class的元素,

document.querySelector(selector): 回傳第一個符合選擇器要求的dom元素,這里的selector就是CSS的選擇器

document.querySelectorAll(selector): 獲取所有的符合指定的選擇器的元素的陣列

案例:

    // 通過標簽的名字獲取一組元素
var divs = document.getElementsByTagName("div");
l(divs);
alert(divs);
for(var x = 0 ; x < divs.length;x ++){
l(divs[x]);
}

alert一個HTMLdom元素集合:

object HTMLCollection

控制臺輸出:

 HTMLCollection(2)[div,div]

這些集合可以按照陣列的方式進行遍歷,

其他的API的案例:

    // 通過類名獲取
var es = document.getElementsByClassName("red");
l(es);

tips: 只要這個標簽擁有這個類名即可,不在乎是否還有其他的類名,

通過CSS 選擇器選擇元素:

    // 通過類選擇器獲取一個元素(如果有多個,只獲取第一個)
var es = document.querySelector("table .red");
l(es);
    // 通過類選擇器獲取一組元素
var es = document.querySelectorAll(".red,.blue");
l(es);

[2]使用DOM操作標簽的屬性

所謂操作標簽的屬性,就是給標簽的屬性賦值和獲取標簽的屬性值,

比如之前用過的 xxxx.value

基本的語法:

var xxDom = getxxxx/queryxxxx
// 獲取屬性值
var attrValue = https://www.cnblogs.com/xiaoxiaodeboke/p/xxDom.屬性名
// 設定屬性值
xxDom.屬性名 = attrValue

幾乎所有的屬性值都可以操作,

幾個特殊的屬性值:

readonly,disabled,checked,selected

這些屬性在HTML標簽中存在即生效,但是在JS中,只有設定為true才,false就是不生效,

案例1:獲取和設定輸入框的value屬性

    <h2>獲取和設定輸入框的value屬性</h2>
<input type="text" id="username">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"哈哈" onclick="getUserName()">
<input type="text" id="result">
<script type="text/javascript">
function getUserName(){
var usernameDom = $("username");
var resultDom = $("result");
resultDom.value = usernameDom.value;
}
</script>

案例2:設定圖片的src屬性:

    <div>
<img style="border: 1px solid;" id="bigImg" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-1.jpg" alt="">
</div>
<div>
<ul>
<li style="display: inline-block;">
<img onmouseover="showImg('1')" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-1.jpg" width="30" border="1px solid;" alt="">
</li>
<li style="display: inline-block;">
<img onmouseover="showImg('2')" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-2.jpg" width="30" border="1px solid;" alt="">
</li>
<li style="display: inline-block;">
<img onmouseover="showImg('3')" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-3.jpg" width="30" border="1px solid;" alt="">
</li>
<li style="display: inline-block;">
<img onmouseover="showImg('4')" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-4.jpg" width="30" border="1px solid;" alt="">
</li>
<li style="display: inline-block;">
<img onmouseover="showImg('5')" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-5.jpg" width="30" border="1px solid;" alt="">
</li>
<li style="display: inline-block;">
<img onmouseover="showImg('6')" src=https://www.cnblogs.com/xiaoxiaodeboke/p/"images/img-6.jpg" width="30" border="1px solid;" alt="">
</li>
</ul>
</div>
<script type="text/javascript">
function showImg(index){
// 獲取大圖片的DOM物件
var bigImg = $("bigImg")
// 修改圖片的src屬性
bigImg.src = "images/img-"+index+".jpg";
}
</script>

案例3:全選和全不選

    <div>
興趣愛好:
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"1">LOL
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"2">KTV
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"3">捏腳
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"4">打麻將
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"5">學js
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"6">做作業
<input name="enjoy" type="checkbox" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"7">健身
</div>
<div>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"全選" onclick="checkAll(true)">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"全不選" onclick="checkAll(false)">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"反選" onclick="resCheckAll()">
<input type="checkbox" onclick="checkInput()" id="ckAll"> 全選
</div>
<script type="text/javascript">
function checkAll(ck){
// 選擇所有的復選框
var enjoys = document.querySelectorAll("[name='enjoy']");
for(var x = 0;x < enjoys.length;x ++){
if(enjoys[x].type=='checkbox'){
enjoys[x].checked = ck;
}
}
}
// 反選
function resCheckAll(){
// 選擇所有的復選框
var enjoys = document.querySelectorAll("[name='enjoy']");
for(var x = 0;x < enjoys.length;x ++){
if(enjoys[x].type=='checkbox'){
enjoys[x].checked = !enjoys[x].checked;
}
}
}
function checkInput(){
// 獲取當前的checkbox
var ckAll = $("ckAll");
// 選擇所有的復選框
var enjoys = document.querySelectorAll("[name='enjoy']");
for(var x = 0;x < enjoys.length;x ++){
if(enjoys[x].type=='checkbox'){
enjoys[x].checked = ckAll.checked;
}
}
}
</script>

案例4:是否啟用

    <input type="checkbox" onclick="enableBtn(this)"> 同意 xxxxxxxxxxx<br/>
<input type="button" id="btn" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"不可以使用" disabled>
<script>
function enableBtn(e){
var btn = $("btn");
if(e.checked){
btn.disabled = false;
btn.value = "可以點擊的按鈕";
}else{
btn.disabled = true;
btn.value = "不可以使用";
}
}
</script>

[3]使用DOM操作標簽的樣式

①直接修改標簽的class

tips:class本身是標簽的屬性,我們修改標簽的class其實就是通過屬性操作修改class的值,

案例1:

        <style type="text/css">
.red{
color:red;
}
.bigFont{
font-size: 36px;
}
</style>
<p id="title" class="bigFont">《虧華寶殿》</p>
<p>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"紅" onclick="addRedClass()">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"不紅" onclick="removeRedClass()">
</p>
<script type="text/javascript">
function addRedClass(){
var titleDom = $("title")
// 操作元素的class屬性,在JS中要使用className
titleDom.className=titleDom.className + " red";
}

function removeRedClass(){
var titleDom = $("title")
// 操作元素的class屬性,在JS中要使用className
titleDom.className=titleDom.className.replace("red","");
}
</script>

tips:標簽的class屬性在js中是className,

案例2:

	<style type="text/css">
		.showImg{
			display: block;
		}
		.hidImg{
			display: none;
		}
	</style>
	<input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/顯示" onclick="$('ykImg').className='showImg'">
	<input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/隱藏" onclick="$('ykImg').className='hidImg'">
	<input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/走你" onclick="$('ykImg').className=$('ykImg').className=='showImg'?'hidImg':'showImg'">
	<br/>
	<img src="https://img.uj5u.com/2022/01/27/298029270710183.jpg" id="ykImg">

②操作標簽的樣式屬性

我們知道標簽都有屬性style, 我們可以通過style屬性直接設定標簽的樣式,

這種樣式,我們也稱之為行樣式,

<div style='boder:1px solid;'></div>

所以我們可以通過操作style屬性的某些值來操作元素的樣式,

獲取樣式屬性的語法:

var value = https://www.cnblogs.com/xiaoxiaodeboke/p/xxxDom.style.xxxx

var color = divDom.style.backgroundColor;

設定樣式屬性的語法:

xxxDom.style.xxx = value;

divDom.style.borderColor = "#f0f0f0";

所有的樣式都在 dom.style屬性里面的,

在css中的樣式屬性名,如果中間是使用“-”連接的,則在JS中的屬性名是:去掉“-”,讓屬性名符合js變數的駝峰命名規則即可, 比如 樣式屬性"background-color" --> backgroundColor

案例1:修改body的背景顏色

    <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"紅" onclick="document.body.style.backgroundColor='green'">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"綠" onclick="document.body.style.backgroundColor='red'">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"黃" onclick="document.body.style.backgroundColor='pink'">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"粉" onclick="document.body.style.backgroundColor='yellow'">

案例2:折疊選單

    <style>
li{
list-style: none;
}
</style>
<ul>
<li style="cursor: pointer;" onclick="showMenu('menu-user')">用戶管理</li>
<li id="menu-user" style="display: none; margin-left: 15px; width: 120px;">
<div><a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">添加用戶</a></div>
<div><a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">用戶串列</a></div>
</li>
<li style="cursor: pointer;" onclick="showMenu('menu-pro')">產品管理</li>
<li id="menu-pro" style="display: none; margin-left: 15px; width: 120px;">
<div><a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">添加產品</a></div>
<div><a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">產品串列</a></div>
</li>
<li style="cursor: pointer;" onclick="showMenu('menu-order')">訂單管理</li>
<li id="menu-order" style="display: none; margin-left: 15px; width: 120px;">
<div><a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">添加訂單</a></div>
<div><a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">訂單串列</a></div>
</li>
</ul>
<script type="text/javascript">
function showMenu(menuId){
var menu = $(menuId);
if(menu.style.display!='none'){
menu.style.display="none";
}else{
menu.style.display="block";
}
}
</script>

案例3:選項卡

        <style type="text/css">
.tab-li{
display: inline-block; border: 1px solid; border-radius: 5px 5px 0px 0px; cursor: pointer;
font-size: 16px;
}
.content{
width: 100%;
height: 275px;
border-top: 1px solid;
display: none;;
}
ul{
font-size: 0px;
}
</style>
<div style="width: 500px; height: 300px; border: 1px solid;">
<div>
<ul>
<li onclick="showTab('tab1',this)" style="" class="tab-li">選項卡1</li>
<li onclick="showTab('tab2',this)" class="tab-li">選項卡2</li>
<li onclick="showTab('tab3',this)" class="tab-li">選項卡3</li>
</ul>
</div>
<div>
<div class="content" style="display: block; " id="tab1">
第一個選項卡的內容
111111111111111111111
</div>
<div class="content" id="tab2" style="">
第一個選項卡的內容
22222222222222222222222
</div>
<div class="content" id="tab3" style="">
第一個選項卡的內容
33333333333333333333333
</div>
</div>
</div>
<script type="text/javascript">
function showTab(activeId,e){
// 顯示對應的選項卡
// 1. 將所有的選項卡內容div影藏
var contents = document.getElementsByClassName("content");
for(var x = 0;x < contents.length;x ++){
contents[x].style.display="none";
}
// 2. 將當前的選項卡內容顯示出來
var currContent = $(activeId);
currContent.style.display="block";
// 讓當前的標簽處于選中狀態
// 1. 去除所有的tab-li的背景顏色
var lis = document.getElementsByClassName("tab-li");
for(var j = 0;j < lis.length;j++){
lis[j].style.backgroundColor="#fff";
}
// 給當前的li添加背景顏色
e.style.backgroundColor='red';
}
</script>
    <div id="box" style="width: 255px; height: 255px;border:1px solid"
onmousemove="stMove(event)"
onmouseout="stOut()"
onmouseover="stOver()"></div>
<span id="result"></span>
<script type="text/javascript">
function stOver(){
$("box").style.backgroundColor = "#ccc";
}
function stOut(){
$("box").style.backgroundColor = "#fff";
}
function stMove(e){
$("result").innerText=e.x+":"+e.y
}
</script>

[4]使用DOM操作標簽的內容和結構

①動態的創建一個HTML元素,

直接使用字串拼接一段HTML,并且寫入到檔案中,

    <script type="text/javascript">
document.write("<h2>哈哈</h2>");
</script>

我們可以通過document提供的API創建一個DOM物件,

API:  createElement(tagName)

案例:

    <!-- 準備一個空的DIV  -->
<div id="box" style="height: 50px; border: 1px solid;"></div>
<script type="text/javascript">
// 動態創建一個h2 物件
var h2Dom = document.createElement("h2");
       // 設定樣式
h2Dom.style.color="red"
// 給h2中添加文本
h2Dom.innerHTML="嘻嘻嘻";
// 將h2添加到box-div中
document.getElementById("box").append(h2Dom);
</script>

②操作HTML中標簽的內容,

HTML標簽中的內容,指的是非自閉合標簽,

在HTML中的要給標簽內部寫任何內置,直接寫,

在JS中的DOM物件與標簽內容相關的屬性有兩個:

  • innerText : 標簽內部的文本,不會決議HTML標簽,

  • innerHTML: 標簽內部的內容,會自動決議HTML標簽,

通過innerText和innerHTML獲取和設定標簽內容:

    <div id="text-div">
<a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"www.7dian.com">起點</a>
</div>
<div id="html-div">
<a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"www.7dian.com">起點</a>
</div>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"change text" onclick="changeText()">
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"change html" onclick="changeHtml()">
<script type="text/javascript">
function changeText(){
var divDom = document.getElementById("text-div");
// 從text-div取出內部的內容,輸出到控制臺,
var str = divDom.innerText;
console.log(str);
// 準備新的內容寫入text-div
divDom.innerText = "<h2>戴著假發的程式員</h2>";
}
function changeHtml(){
var divDom = document.getElementById("html-div");
// 從html-div取出內部的內容,輸出到控制臺,
var str = divDom.innerHTML;
console.log(str);
// 準備新的內容寫入html-div
divDom.innerHTML = "<h2>戴著假發的程式員</h2>";
}
</script>

我們填入的內容是: <h2>戴著假發的程式員</h2> 瀏覽器將標簽按照文本輸出了,

控制臺輸出的內容:本身DIV中的內容:<a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"www.7dian.com">起點</a> 控制臺只是輸出了文本 -- 起點,沒有標簽

說明: 使用innnerText獲取的內容會忽略內容中的HTML標簽, 使用innnerText去設定內容的時候,也會忽略標簽的作用,將標簽按照文本的方式輸出,

第二個按鈕的效果:

戴著假發的程式員   <href=https://www.cnblogs.com/xiaoxiaodeboke/p/"www.7dian.com">起點</a>

使用innerHTML設定內容,內容HTML標簽會被決議運行, 使用innerHTML獲取內容,不會忽略HTML標簽,

③元素的添加和移除,

添加元素

API-1: Element.append()

Element.append 方法在 Element的最后一個子節點之后插入一組 Node 物件或 DOMString 物件, 被插入的 DOMString 物件等價為 Text 節點,

Element表示任何可以添加子元素的元素,其中Node表示所有的DOM物件, DOMString就是一個字串,

看一個案例理解一下:

案例1:創建新的dom物件,加入元素

        <ul id="msgs">            
</ul>
<input type="text" id="msg">
<input onclick="addMsg()" type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"add">
<script type="text/javascript">
function addMsg(){
// 獲取文本框物件
var textDom = document.getElementById("msg");
var value = textDom.value;
// 動態的創建一個li dom物件
var liDom = document.createElement("li");
// 在liDom中添加對應的文本
liDom.append(value);// DOMString -> String
// 將liDom加入ul
document.getElementById("msgs").append(liDom);// node
}
</script>

案例2:獲取頁面的dom物件,加入元素

    <input type="text" id="username" placeholder="請輸入用戶名">
<input type="button" onclick="gotoDiv()" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"走你">
<div style="border : 1px solid; height: 200px;" id="result">
</div>
<script type="text/javascript">
function gotoDiv(){
var resultDom = document.getElementById("result");
var usernameDom = document.getElementById("username");
// 將usernameDom加入到resultDom
resultDom.append(usernameDom);
}
</script>

Node.appendChild

**Node.appendChild()** 方法將一個節點附加到指定父節點的子節點串列的末尾處,如果將被插入的節點已經存在于當前檔案的檔案樹中,那么 appendChild() 只會將它從原先的位置移動到新的位置(不需要事先移除要移動的節點),

這意味著,一個節點不可能同時出現在檔案的不同位置,所以,如果某個節點已經擁有父節點,在被傳遞給此方法后,它首先會被移除,再被插入到新的位置,若要保留已在檔案中的節點,可以先使用

其實這個方法和append差不多,接收的引數肯定是Node,就是DOM物件,

看案例:

    <ul id="msgs">      
</ul>
<input type="text" id="msg">
<input onclick="addMsg()" type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"add">
<script type="text/javascript">
function addMsg(){
// 獲取文本框物件
var textDom = document.getElementById("msg");
var value = textDom.value;
// 動態的創建一個li dom物件
var liDom = document.createElement("li");
// 在liDom中添加對應的文本 這里不能使用appendChild
liDom.append(value);// DOMString -> String
// 將liDom加入ul   這里可以使用appendChild
document.getElementById("msgs").appendChild(liDom);// node
}
</script>

tips:appendChild不接受字串,

洗掉元素

Element.remove()

**Element.remove()** 方法,把物件從它所屬的 DOM 樹中洗掉,

看案例:

    <ul id="names"></ul>
<script type="text/javascript">
var ulDom = document.getElementById("names");
for(var x = 0;x < 10;x ++){
var liDom = document.createElement("li");
liDom.append("鳴人:"+x);
ulDom.append(liDom);
}
</script>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"洗掉" onclick="removeMingren()">
<script type="text/javascript">
function removeMingren(){
// 先問,要洗掉索引為多的
var index = window.prompt('請輸入索引','0');
// index就是輸入的索引值
if(index){ //如果選擇了取消,index就是undefined
// 獲取所有的liDOM物件陣列
var lis = document.getElementsByTagName("li");
// 遍歷陣列
for(var x = 0;x < lis.length;x ++){
// 找到要洗掉的元素的索引
if(index == x){
//洗掉當前的元素
lis[x].remove();
break;
}
}
}
}
</script>

Node.removeChild

Node.removeChild() 方法從DOM中洗掉一個子節點,回傳洗掉的節點,

看案例:

    <div id="div1">
<input type="text" id="msg">
</div>
<div id="div2">

</div>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"走你" onclick="zouni()">
<script type="text/javascript">
function zouni(){
// 將div1中的input移動到div2中,
// 獲取DOM
var div1Dom = document.getElementById('div1');
var div2Dom = document.getElementById('div2');
var msgDom = document.getElementById('msg');
// div2Dom.append(msgDom);
// input從第一個div中洗掉
var dom = div1Dom.removeChild(msgDom);
div2Dom.append(dom);
}
</script>

克隆元素

Node.cloneNode

Node.cloneNode() 方法回傳呼叫該方法的節點的一個副本.

看案例:

    <div id="div1">
<input type="text" id="msg">
</div>
<div id="div2">

</div>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"走你" onclick="zouni()">
<script type="text/javascript">
function zouni(){
// 將div1中的input移動到div2中,
// 獲取DOM
var div2Dom = document.getElementById('div2');
var msgDom = document.getElementById('msg');
// 克隆msgDom
var newDom = msgDom.cloneNode();
// 將克隆出來的DOM物件加入div2
div2Dom.append(newDom);
}
</script>

綜合案例1:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<ul id="names"></ul>
<script type="text/javascript">
var ulDom = document.getElementById("names");
for(var x = 0;x < 10;x ++){
var liDom = document.createElement("li");
liDom.append("鳴人:"+x);
ulDom.append(liDom);
}
</script>
<input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"洗掉" onclick="removeMingren()">
<script type="text/javascript">
function removeMingren(){
// 先問,要洗掉索引為多的
var index = window.prompt('請輸入索引','0');
// index就是輸入的索引值
if(index){ //如果選擇了取消,index就是undefined
// 獲取所有的liDOM物件陣列
var lis = document.getElementsByTagName("li");
// 遍歷陣列
for(var x = 0;x < lis.length;x ++){
// 找到要洗掉的元素的索引
if(index == x){
//洗掉當前的元素
lis[x].remove();
break;
}
}
}
}
</script>
</body>
</html>

根據檔案結構篩選DOM物件

幾個關鍵詞:

  • DOM物件 檔案物件,頁面元素對應的物件,

  • Element (元素) 就是我們常說的DOM物件, Element不包含空檔案節點的,

  • Node (節點) Node的范圍是大于Element, Node包含了空檔案節點,

其中所有<xxx></xxx>的都是Element,也是Node, 但是代碼的空格部分,不是Element,是TextNode,

幾個API

  • Node.childNodes

Node.childNodes 回傳包含指定節點的子節點的集合,該集合為即時更新的集合(live collection),

案例:

<h2>Node.childNodes</h2>
<div id="box">
   <span>123</span>
   <a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"">百度</a>
   <ul>
       <li>1</li>
       <li>2</li>
   </ul>
</div>
<script>
   // 獲取box
   var boxDom = document.getElementById("box");
   // 獲取boxDom下的所有的子元素節點 這里的節點包含的空文本節點
   var nodes = boxDom.childNodes;
   // 我們可以將nodes當作陣列來處理,
   console.log(nodes);
</script>
  • Element.children

Element.children 是一個只讀屬性,回傳 一個Node的子elements ,是一個動態更新的 HTMLCollection,

和Node.childNodes的區別就是不包含空的文本節點,

案例:

<script>
   // 獲取box
   var boxDom = document.getElementById("box");
   // 獲取boxDom下的所有的子元素節點 這里的節點不包含的空文本節點
   var nodes = boxDom.children;
   // 我們可以將nodes當作陣列來處理,
   console.log(nodes);
</script>
  • Node.firstChild

  • Node.lastChild

  • Element.firstElementChild

  • Element.lastElementChild

  • Node.parentNode 獲取父節點

  • Node.parentElement 獲取父元素

案例:

<h2>
  - Node.parentNode 獲取父節點
- Node.parentElement 獲取父元素
</h2>
<div>
   <ul>
       <li>卡卡西 <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"刪" onclick="removeLi(this)"></li>
       <li>卡卡東 <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"刪" onclick="removeLi(this)"></li>
       <li>卡卡南 <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"刪" onclick="removeLi(this)"></li>
       <li>卡卡北 <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"刪" onclick="removeLi(this)"></li>
       <li>卡卡中 <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"刪" onclick="removeLi(this)"></li>
   </ul>
</div>
<script>
?
   function removeLi(ele){
       // 這里的ele表示當前元素 這里的當前元素是input
       // 獲取父元素
       var liDom = ele.parentElement;
       // 洗掉
       liDom.remove();
  }
</script>
 

選擇兄弟節點:

  • Node.nextSibling

Node.nextSibling 是一個只讀屬性,回傳其父節點的 childNodes 串列中緊跟在其后面的節點,如果指定的節點為最后一個節點,則回傳 null,

  • Node.previousSibling

回傳當前節點的前一個兄弟節點,沒有則回傳null.

  • nextElementSibling

nextElementSibling 回傳當前元素在其父元素的子元素節點中的后一個元素節點,如果該元素已經是最后一個元素節點,則回傳null,該屬性是只讀的.

  • previousElementSibling

previousElementSibling 回傳當前元素在其父元素的子元素節點中的前一個元素節點,如果該元素已經是第一個元素節點,則回傳null,該屬性是只讀的.

案例:

<h2>兄弟節點的篩選</h2>
<div>
   <span>第一個元素</span>
   <input type="button" value=https://www.cnblogs.com/xiaoxiaodeboke/p/"click me" onclick="stClick(this)">
   <a href=https://www.cnblogs.com/xiaoxiaodeboke/p/"www.7dianit.com">起點編程</a>
</div>
<script>
   function stClick(ele){
       console.log("下一個節點:"+ele.nextSibling);
       console.log("下一個元素:"+ele.nextElementSibling);
       console.log("上一個節點:"+ele.previousSibling);
       console.log("上一個元素:"+ele.previousElementSibling);
  }
</script>

[5]使用DOM操作標簽的事件

了解的事件

  • onclick 單擊事件

  • onchange 修改事件

  • ondbclick 雙擊事件

  • onfocus 獲得焦點的事件

  • onblur 失去焦點的事件

表單元素的事件案例:

<input id="username" type="text" value="https://www.cnblogs.com/xiaoxiaodeboke/p/請輸入用戶名"
onblur="stBlur()"
onfocus="stFocus()">
<script>
function stFocus(){
$("username").value="";
}
function stBlur(){
$("username").value="https://www.cnblogs.com/xiaoxiaodeboke/p/請輸入用戶名";
}
</script>

  • onmouseover 滑鼠懸浮事件

  • onmouseout 滑鼠離開的事件

  • onmousemove 滑鼠移動事件

  • onmouseleave 滑鼠離開事件

  • onmouseenter 滑鼠進入事件

  • onmousedown 滑鼠按下事件

  • onmouseup 滑鼠松開事件

滑鼠事件案例:

<div id="box" style="width: 255px; height: 255px;border:1px solid"
onm ousemove="stMove(event)"
onm ouseout="stOut()"
onm ouseover="stOver()"></div>
<span id="result"></span>
<script type="text/javascript">
function stOver(){
$("box").style.backgroundColor = "#ccc";
}
function stOut(){
$("box").style.backgroundColor = "#fff";
}
function stMove(e){
$("result").innerText=e.x+":"+e.y
}
</script>

  • onkeydown 鍵盤按下的事件

  • onkeyup 鍵盤松開事件

  • onkeypress 按鍵事件

鍵盤事件案例:

<body onkeydown="stKeydown(event)">
<div style="width: 200px; height: 200px; border: 1px solid;" id="panel" >
</div>
<script>
function stKeydown(e){
console.log(e);
$("panel").innerHTML="按下了"+e.code+"鍵:"+e.key;
}
</script>
</body>

不熟悉的事件:

  • onload 加載事件

  • onscroll 滾動事件

  • onsubmit 表單提交事件

  • oncontextmenu 右鍵選單事件

  • onselect 被選擇的時候

幾乎所有的事件都可以傳遞引數:

event表示事件源, 如果是滑鼠事件可以獲取滑鼠的屬性, 如果是鍵盤事件,我們可以通過event獲取按鍵的key和code,

onload事件

常見的就是給body添加load事件,

看問題:

<script>
function doLoad(){
  var btn = document.getElementById("btn");
  console.log(btn); // null
}
</script>
<body onl oad="doLoad()">
  <!--等body全部加載完成之后,再執行doLoad(),而且是自動執行-->
  
<input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/click me" id="btn">
<script>
  console.log(1231213);
</script>
</body>

有時我們希望有些程式頁面加載之后自動執行,這些程式不是寫在函式中的,但是如果這些程式中有獲取頁面元素的部分,一定要將這些程式寫在HTML代碼的最后面,

如果希望在頁面加載完成之后再執行這些程式,可以使用body的onload事件,

但是其實常見的實際應用都是選擇將要自動執行的程式放在HTML檔案最后面,

問題:onload意思是等頁面完全加載完成再執行, 如果我們自己將程式寫在HTML最后,頁面結構完成之后,程式就可以執行,

onscroll事件

滾動條滾動的時候觸發這個事件,

    <h2>滾動事件</h2>
    <div onscroll="doScroll(this)" style="overflow:auto; width: 300px; height: 100px; border: 1px solid;">
        <div style="width: 600px; height: 50px; "></div>
    </div>
    <script>
        function doScroll(ele){
            console.log(ele.scrollLeft);
        }
    </script>

oncontextmenu 右鍵選單事件

    <div oncontextmenu="alert(1)" style="width: 200px; height: 200px; border: 1px solid;"> </div>

onselect 被選擇的時候

只有在文本框和文本域內選擇文本才會觸發select事件.

    <div>
        <input type="text" onselect="alert(1)">
    </div>

onsubmit 表單的提交事件

這個事件是form標簽的事件,

表單的主要作用是收集資料,最侄訓將資料提交到表單的action指定的位置,

提交表單需要使用 submit按鈕或者image按鈕,

看案例:

    <!-- 目前沒有處理登陸的業務,這里就是模擬 -->
    <form action="doLogin.html" >
        <p><input type="text" name="username" placeholder="請輸入用戶名"></p>
        <p><input type="text" name="userpass" placeholder="請輸入密碼"></p>
        <p>用戶型別:<select name="usertype" id="">
            <option value="https://www.cnblogs.com/xiaoxiaodeboke/p/1">管理員</option>
            <option value="https://www.cnblogs.com/xiaoxiaodeboke/p/2">操作員</option>
            <option value="https://www.cnblogs.com/xiaoxiaodeboke/p/3">普通用戶</option>
        </select></p>
        <p>
            登陸型別:
            <input type="radio" value="https://www.cnblogs.com/xiaoxiaodeboke/p/1" name="logintype">基礎登陸
            <input type="radio" value="https://www.cnblogs.com/xiaoxiaodeboke/p/2" name="logintype">高級登陸
        </p>
        <p>
            <input type="submit" value="https://www.cnblogs.com/xiaoxiaodeboke/p/登陸">
        </p>
    </form>

輸入內容,點擊提交:

我們會發現,當點擊登陸按鈕(submit)的時候,會將表單中的內容阻止成: name=value&name=value...

使用“?”連接在表單的action指向的url: doLogin?username=admin&userpass=123456,,,

表單中的所有的input,select, textarea都是表單域,

所有的表單域都應該有name屬性,name屬性是可以相同的,

當我們提交表單的時候,瀏覽器會自動將表單域的內容按照 name=value&name=value的方式使用“?”連接在提交的url(form標簽的action中指定的)后面.

onsubmit是表單提交的事件,當onsubmit回傳false的時候,這個表單無法提交,

只有當onsubmit不return false的時候,表單才能提交,

我們往往在onsubmit中對表單的資料進行校驗:

案例:

    <script>
        function checkForm(){
            var username = document.querySelector("[name='username']").value;
            if(username==''){
                alert("用戶名不能為空");
                return false;
            }
            var userpass = document.querySelector("[name='userpass']").value;
            if(userpass==''){
                alert("密碼不能為空");
                return false;
            }
            return true;
        }
    </script>
    <!-- 目前沒有處理登陸的業務,這里就是模擬 -->
    <form onsubmit="return checkForm()" action="doLogin.html">
        <p><input type="text" name="username" placeholder="請輸入用戶名"></p>
        <p><input type="text" name="userpass" placeholder="請輸入密碼"></p>
        <p>用戶型別:<select name="usertype" id="">
            <option value="https://www.cnblogs.com/xiaoxiaodeboke/p/1">管理員</option>
            <option value="https://www.cnblogs.com/xiaoxiaodeboke/p/2">操作員</option>
            <option value="https://www.cnblogs.com/xiaoxiaodeboke/p/3">普通用戶</option>
        </select></p>
        <p>
            登陸型別:
            <input type="radio" value="https://www.cnblogs.com/xiaoxiaodeboke/p/1" name="logintype">基礎登陸
            <input type="radio" value="https://www.cnblogs.com/xiaoxiaodeboke/p/2" name="logintype">高級登陸
        </p>
        <p>
            <input type="submit" value="https://www.cnblogs.com/xiaoxiaodeboke/p/登陸">
        </p>
    </form>

特別注意:  onsubmit="return checkForm()"

通過JS給元素系結和解綁事件

看問題:

    <input type="text" id="name" placeholder="請輸入一個名字">
    <input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/添加" onclick="addName()">
    <ul id="names"></ul>
    <script>
        function addName(){
            var textDom = document.getElementById("name");
            var ulDom = document.getElementById("names");
            // 取出輸入的name
            var name = textDom.value;
            if(name == ''){
                return;
            }
            // 創建一個li
            var liDom = document.createElement("li");
            liDom.append(name);
            // 準備一個洗掉按鈕
            var btnDom = document.createElement("input");
            btnDom.type = "button";
            btnDom.value = "https://www.cnblogs.com/xiaoxiaodeboke/p/洗掉";
            // 給按鈕事件
            // btnDom.onclick="remLi(this)" 這是文本屬性的系結方式,
            // 事件需要的就是一個函式,直接賦值一個函式即可
            btnDom.onclick = function(){
                // 這里的this表示觸發這個事件的元素本身,
                this.parentElement.remove();
            }
            liDom.append(btnDom);
            ulDom.append(liDom);
        }
        function remLi(ele){
            ele.parentElement.remove();
        }
    </script>

動態給元素系結事件方式1:

// 獲取dom物件
var xxxDom = ......
// 系結事件  第一種方式
xxxDom.onxxxxx = function(){
    // 事件的執行代碼   這里的this就表示當前觸發這個事件的元素本身
}
// 系結事件  第二種方式 
// 定義一個函式
function fn(){// 事件的執行代碼   這里的this就表示當前觸發這個事件的元素本身}
// 給元素系結事件
xxxDom.onxxxx = fn;  // 千萬不要有()

案例1: 常見的超鏈接撰寫方式

    <!-- href="javascript:void(0)" 阻止這個超鏈接的連接效果 -->
    <a href="javascript:void(0)" id="stLink">show msg</a>
    <script>
        var linkDom = document.getElementById("stLink");
        // 動態的給超鏈接系結一個事件
        linkDom.onclick=function(){
            // 可以使用js完成一個連接   很多時候這里往往是一個內部的地址,
            // location.href="https://www.cnblogs.com/xiaoxiaodeboke/p/manager/user/adduser/1"
            location.href = "http://www.baidu.com";
        }
    </script>

案例2:拖拽

    <div id="win" style="width: 200px; height: 200px; ">
    </div>
    <script>
        var win = document.getElementById("win");
        
        // 系結事件鼠進入的事件
        win.onmouseenter = function(){
            // 調整樣式
            win.style.position = "absolute";
            win.style.left="0px";
            win.style.top="0px";
        }
        // 滑鼠按下的事件
        win.onmousedown=function(event){
            // 記錄滑鼠當前的位置
            var mx = event.x;
            var my = event.y;
            // 系結滑鼠移動事件
            win.onmousemove=function(ent){
                // 獲取此時滑鼠的位置
                var nx = ent.x;
                var ny = ent.y;
                // 移動當前元素
                var left = parseInt(win.style.left);
                var top = parseInt(win.style.top);
                win.style.left = (left + (nx - mx)) + "px";
                win.style.top = (top + (ny - my)) + "px";
                // 覆寫之前定義的滑鼠的位置
                mx = nx;
                my = ny;
            }
        }
    </script>

解綁元素的事件方式1:

語法:

// 解綁事件,就是將事件置空
xxxDom.onxxx = null;

案例:

    <div id="div" style="border: 1px solid; height: 200px; width: 200px;"></div>
    <input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/系結事件" onclick="bindMouseEventOnDiv()">
    <input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/解綁事件" onclick="unbindMouseEventOnDiv()">
    <script>
        function bindMouseEventOnDiv(){
            // 獲取dom元素
            var divDom = document.getElementById("div");
            // 系結滑鼠移動事件
            divDom.onmousemove=function(event){
                this.innerHTML = event.x+":"+event.y;
            }
        }
        function unbindMouseEventOnDiv(){
            // 獲取dom元素
            var divDom = document.getElementById("div");
            // 解綁事件
            divDom.onmousemove = null;
        }
    </script>

第二種方式給元素系結和解綁事件

系結事件:

xxxDom.addEventListener(type,fn)

type: 事件型別, 去掉on的事件型別,比如要系結 onclilck -> click

fn: 事件的處理函式,

解綁事件:

xxxDom.removeEventListener(type,fn-name)

type:還是型別

fn-name: 表示要移除的函式的名字,

tips: 同一種型別的事件,可以系結多個函式,所以再解綁的時候,就需要指定要解綁的函式的名字,

案例:

    <div id="div" style="border: 1px solid; height: 200px; width: 200px;"></div>
    <input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/系結事件" onclick="bindMouseEventOnDiv()">
    <input type="button" value="https://www.cnblogs.com/xiaoxiaodeboke/p/解綁事件" onclick="unbindMouseEventOnDiv()">
    <script>
        function bindMouseEventOnDiv(){
            // 獲取dom元素
            var divDom = document.getElementById("div");
            // 系結滑鼠移動事件
            divDom.addEventListener("mousemove",showMouseLocation);
            // 再系結一個事件,還是mousemove
            divDom.addEventListener("mousemove",changeBackgroundColor);
        }

        function unbindMouseEventOnDiv(){
            // 獲取dom元素
            var divDom = document.getElementById("div");
            // 解綁事件
            divDom.removeEventListener("mousemove",showMouseLocation)
        }

        // 準備幾個事件
        // 顯示滑鼠的位置
        function showMouseLocation(event){
            // 獲取dom元素
            var divDom = document.getElementById("div");
            // 顯示滑鼠的位置
            divDom.innerHTML = event.x+":"+event.y;
        }

        // 滑鼠按下的時候,修改div的背景顏色
        function changeBackgroundColor(event){
            // 獲取dom元素
            var divDom = document.getElementById("div");
            divDom.style.backgroundColor="rgb(255,"+event.x+","+event.y+")";
        }
    </script>

事件冒泡

HTML檔案本身就是"一棵樹";

默認情況下一個元素的事件被觸發之后,會自動傳播到父節點,

看案例:

    <div id="div1" style="width: 500px; height: 500px; ">
        <div id="div2" style="width: 300px; height: 300px; margin: 100px 100px; ">
            <div id="div3" style=" width: 100px; height: 100px; margin: 100px 100px; "></div>
        </div>
    </div>
    <script>
        window.onload=function(){
            // 這里代碼默認會在頁面加載完成之后自動執行
            document.getElementById("div1").onclick=function(){
                console.log("div1");
            }
            // document.getElementById("div2").onclick=function(){
            //     console.log("div2");
            // }
            document.getElementById("div3").onclick=function(){
                console.log("div3");
            }
        }
    </script>

阻止事件冒泡

  • event.stopPropagation

阻止捕獲和冒泡階段中當前事件的進一步傳播,

但是,它不能防止任何默認行為的發生; 例如,對鏈接的點擊仍會被處理,

    <div id="div1" style="width: 500px; height: 500px; ">
        <div id="div2" style="width: 300px; height: 300px; margin: 100px 100px; ">
            <div id="div3" style=" width: 100px; height: 100px; margin: 100px 100px; "></div>
        </div>
    </div>
    <script>
        window.onload=function(){
            // 這里代碼默認會在頁面加載完成之后自動執行
            document.getElementById("div1").onclick=function(event){
                console.log("div1");
            }
            document.getElementById("div2").onclick=function(event){
                console.log("div2");
            }
            document.getElementById("div3").onclick=function(event){
                console.log("div3");
                // 阻止事件傳播
                event.stopPropagation();
            }
        }
    </script>
補充:

DOM物件的型別是Element,

一個dom物件就對應一個HTML元素,HTML元素有屬性,幾乎每一個屬性都在DOM物件上有對應的,一些特殊的:class對應className,

HTML元素沒有innerTHML和innerText屬性,但是dom物件有,

HTML標簽有的屬性是沒有的,但是我們可以寫比如:

<div id="div" name="kakaxi"></div>

但是這個td對應的DOM物件是沒有這個屬性的,

    <script>
       console.log(document.getElementById("div").name);// undefined
   </script>

但是DOM物件本身就是js物件,JS物件的屬性是可以隨意擴展的,

比如:

       // 自定義的物件
       var p = {};
       // 設定屬性
       p.name="卡卡西";
       console.log(p.name);// 卡卡西
       // 獲取一個DOM物件
       var div = document.getElementById("div");
       // 通過JS設定一個屬性(這個屬性HTML標簽是沒有的)
       div.sellPoint="DIV很強大";
       console.log(div.sellPoint); // 可以獲取到這個屬性
  • 當我們寫HTML的時候,如果強行的給某個標簽寫了一個本來沒有的屬性,這個屬性在標簽層面就是存在的,通過JS獲取這個標簽的DOM物件之后,無法獲取這個屬性,因為DOM和標簽沒有這個屬性的映射,

  • 同樣的道理,在DOM物件上設定一個不存在的屬性,也無法映射到HTML標簽,

但是有時,我們就是希望DOM和HTML標簽之間可以映射HTML本身沒有規定的屬性,

JS提供了專門的API操作屬性:

  • Element.getAttribute(attrName) 獲取指定名稱的屬性值

  • Element.setAttribute(attrName,attrValue) 設定指定的屬性

  • Element.getAttributeNames() 獲取這個元素的所有的屬性的名字

案例:

    <div id="div" name="kakaxi"></div>
   <script>
       console.log(document.getElementById("div").name);
       // 自定義的物件
       var p = {};
       // 設定屬性
       p.name="卡卡西";
       console.log(p.name);// 卡卡西
       // 獲取一個DOM物件
       var div = document.getElementById("div");
       // 通過JS設定一個屬性(這個屬性HTML標簽是沒有的)
       div.sellPoint="DIV很強大";
       console.log(div.sellPoint); // 可以獲取到這個屬性
       console.log(document.getElementById("div").sellPoint);
   </script>
   <p id="p" name="一句詩" age="500">離離原上草</p>
   <script>
       var pdom = document.getElementById("p");
       // 獲取所有的屬性名字
       var names = pdom.getAttributeNames();
       for(var x = 0;x < names.length;x ++){
           console.log(names[x]);
      }
       // 獲取屬性值
       console.log(pdom.getAttribute("name"));
       console.log(pdom.getAttribute("age"));
       // 設定一個屬性
       pdom.setAttribute("class","abc");
       pdom.setAttribute("tel","13813813838");
   </script>

本文來自博客園,作者:{瀟瀟消消氣},轉載請注明原文鏈接:{https://www.cnblogs.com/xiaoxiaodeboke/}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/421649.html

標籤:JavaScript

上一篇:JS基礎語法

下一篇:BOM

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more