1. 程式人生 > 其它 >centos7 下squid 安裝配置 與認證配置

centos7 下squid 安裝配置 與認證配置

DOM

1. 節點層級

document節點表示每個文件的根節點,根節點的唯一子節點是<html>元素,稱為文件元素(documentElement)。

1.1 Node型別

每個節點都有nodeType屬性,表示該節點的型別。節點型別由定義在Node型別上的12個數值常量

if (someNode.nodeType == Node.ELEMENT_NODE){
	alert("Node is an element.");
}
  1. nodeName、nodeValue

    if (someNode.nodeType == 1){
    	value = someNode.nodeName; // 會顯示元素的標籤名
    }
    // 元素節點的nodeValue屬性為null
    

  2. 節點關係

    每個節點都有一個childNodes屬性,其中包含一個NodeList的例項。NodeList會根據DOM結構實時更新。

    let firstChild = someNode.childNodes[0];
    let secondChild = someNode.childNodes.item(1); //支援item方法
    let count = someNode.childNodes.length;
    
    //轉換為陣列
    let arrayOfNodes = Array.prototype.slice.call(someNode.childNodes, 0);
    //或
    let arrayOfNodes = Array.from(someNode.childNodes);
    

    每個節點都有一個parentNode屬性,指向其DOM樹中的父元素。使用previousSibling和 nextSibling可以在胞親之間導航。

    父節點和它的第一個及最後一個子節點也有專門屬性: firstChildlastChild分別指向childNodes中的 第一個和最後一個子節點。

    最後還有一個所有節點都共享的關係。ownerDocument 屬性是一個指向代表整個文件的文件節點的指標。


  3. 操縱節點

    appendChild() 用於在childNodes列表末尾新增節點,方法返回新新增的節點。

    如果節點時已經存在節點,則會移動節點。一個節點不會在文件中同時出現在兩個或更多個地方。

    insertBefore() 可以將節點插入到特定位置:

    // 第二個引數傳入null時與appendChild()相同
    returnedNode = someNode.insertBefore(newNode, null);
    alert(newNode == someNode.lastChild); //true
    // 作為新的第一個子節點插入
    returnedNode = 
    someNode.insertBefore(newNode, someNode.firstChild);
    

    replaceChild() 接收兩個引數:要插入的節點和要替換的節點

    // 替換第一個子節點
    let returnedNode =
    someNode.replaceChild(newNode, someNode.firstChild);
    

    removeChild() 用於移除節點

    // 刪除第一個子節點
    let formerFirstChild = someNode.removeChild(someNode.firstChild);
    

  4. 其他方法

    cloneNode() 複製節點,如果傳入true則還會複製內部子節點(不會複製事件處理程式)

    let deepList = myList.cloneNode(true);
    alert(deepList.childNodes.length);
    

    normalize() 用於處理文字節點,後面討論。


1.2 Document型別

屬性 描述
document.documentElement 始終指向HTML頁面中的<html>元素
document.body 直接指向<body>元素
document.doctype 指向<!doctype>標籤
document.title 可以修改標題欄,但不會改變<title>標籤中的內容
document.referrer 獲取連結到當前頁面的那個頁面的URL
  1. 定位元素

    方法 描述
    getElementById() 接收元素id,如果找到返回元素,沒找到返回null,多個則返回第一個
    getElementsByTagName() 接收一個引數,要獲取元素的標籤名,返回包含零個或多個元素的NodeList。
    getElementsByName() 根據name屬性返回元素NodeList 常用於表單
    // <img src="myimage.gif" name="myImage">
    let images = document.getElementsByTagName("img");
    let myImage = images["myImage"]; //通過name獲取
    

  2. 特殊集合

    document.forms:所有表單

    document.images:所有圖片

    document.links:所有連結


1.3 Element型別

可以通過nodeName或tagName來獲取標籤名(大寫)

if (element.tagName.toLowerCase() == "div"){ 
	//推薦,適用於所有文件
}
  1. HTML元素

    有5個標準屬性,id,dir(文字方向),lang,title(滑鼠放置後顯示),className(相當於class,class為關鍵字不可以使用)

    <div id="myDiv" class="bd" title="Bodytext" lang="en" dir="ltr"></div>
    

    這些都有對應的屬性值可以修改

    let div = document.getElementById("myDiv");
    alert(div.id); // "myDiv"
    alert(div.className); // "bd"
    div.id = "someOtherId";
    div.className = "ft";
    

  2. 取得屬性

    getAttribute()、setAttribute()和 removeAttribute()。

    let div = document.getElementById("myDiv");
    alert(div.getAttribute("id")); //"myDiv"
    alert(div.getAttribute("class")); //"bd"
    // 這裡要注意class而不是className要填真實名稱
    

    根據html5 的要求自定義屬性要以data-開頭

    除了五個標準屬性還有其他公認(非自定義)屬性也是DOM物件屬性(如align)

    div.align='left';
    

    getAttribute()和DOM屬性訪問的兩個差異

    1. style屬性

      getAttribute()訪問style屬性時,返回的是CSS字串。

      通過DOM物件的屬性訪問時,style屬性返回的是一個(CSSStyleDeclaration)物件。DOM物件的style屬性用於以程式設計方式讀寫元素樣式,因此不會直接對映為元素中style屬性的字串值。

    2. 所有事件屬性

      當在元素上使用事件屬性時(比如 onclick),屬性的值是一段JavaScript程式碼。

      使用 getAttribute()訪問事件屬性,則返回的是字串形式的原始碼,(標籤上未設定則為null)

      通過DOM物件的屬性訪問事件屬性時返回的則是一個JavaScript函式(未指定該屬性則返回 null)


  3. 設定屬性

    setAttribute() 可以設定html屬性和自定義屬性

    也可以通過DOM屬性設定元素屬性:

    div.id = "someOtherId";
    // DOM物件上的自定義屬性,不會成為元素的屬性
    div.mycolor = "red";
    alert(div.getAttribute("mycolor")); //null(IE除外)
    

  4. 建立元素

    document.createElement()方法建立新元素。這個方法接收一個引數,即要建立元素的標籤名。

1.4 Text型別

Text節點中包含的文字可以通過nodeValue、data、textContext屬性訪問

// 輸出為"Some &lt;strong&gt;other&lt;/strong&gt; message"
div.firstChild.nodeValue = "Some<strong>other</strong> message";
//HTML程式碼,即小於號、大於號或引號會被轉義
  1. 建立節點

    document.createTextNode()

    let textNode = document.createTextNode("<strong>Hello</strong> world!");
    
  2. 規範化

    normalize() 在父節點上呼叫可以合併相鄰全部的文字節點


2. MutationObserver介面

使用MutationObserver可以觀察整個文件、DOM樹的一部分,或某個元素。此外還可以觀察元素屬性、子節點、文字,或者前三者任意組合的變化。

2.1 基本用法

初始化並傳入一個回撥函式:

let observer = new MutationObserver(() => console.log('DOM was mutated!'));
  1. observe() 方法

    MutationObserver例項不會關聯DOM的任何部分。要把這個observer與DOM關聯起來,需要使用observe()方法。這個方法接收兩個必需的引數:要觀察其變化的DOM節點,以及一個MutationObserverInit物件。

    MutationObserverInit物件用於控制觀察哪些方面的變化,是一個鍵/值對形式配置選項的字典。

    例如:觀察<body>元素上的屬性變化

    let observer = new MutationObserver(() => 
                         console.log('<body> attributes changed'));
    observer.observe(document.body, { attributes: true });
    
    document.body.className = 'foo';
    console.log('Changed body class');
    // Changed body class
    // <body> attributes changed
    //非同步觸發回撥函式
    

  2. 回撥與MutationRecord

    回撥函式會接收一個MutationRecord物件,記錄變化資訊

    let observer = new MutationObserver((mutationRecords) =>
    									console.log(mutationRecords));
    

  3. disconnect()提前終止回撥

    會斷開與DOM之間的監視,未呼叫的回撥不會執行

    document.body.className = 'foo';
    observer.disconnect();
    document.body.className = 'bar';
    //(沒有日誌輸出)
    

    因為回撥是非同步的所以所有回撥都會取消

    document.body.className = 'foo';
    setTimeout(() => { 
        observer.disconnect();
    	document.body.className = 'bar';
    }, 0);
    // <body> attributes changed
    // 這樣可以執行部分
    

    4.複用MutationObserver

    // 觀察兩個子節點
    observer.observe(childA, { attributes: true });
    observer.observe(childB, { attributes: true });
    // 修改兩個子節點的屬性
    childA.setAttribute('foo', 'bar');
    childB.setAttribute('foo', 'bar');
    // [<div>, <span>]
    

    5.重用MutationObserver

    呼叫disconnect()並不會結束MutationObserver的生命。重新observe()繫結可以繼續使用


2.2 觀察範圍

設定 描述
attributes: true 屬性變化
attributeFilter: ['屬性1','屬性2'] 指定觀察的屬性
attributeOldValue: true 記錄原屬性值,儲存在oldValue中
characterData: true 觀察文字節點變化
characterDataOldValue: true 記錄原屬字元資料
childList: true 觀察目標節點子節點的新增和移除
subtree: true 所有後代節點