querySelector - 選擇單一元素
1 | ---HTML--- |
你就可以看到,我們除了可以用getElementById
來選取DOM元素之外,我們也可以用querySelector
來選取
目標DOM元素,而且id
或className
都可以選擇。
querySelectorAll - 可重複選取多個元素
要注意的是querySelectorAll
回傳的是一個NodeList
的類陣列。
你可以看到我們透過querySelectorAll來取得span
標籤的類陣列。
並透過ES6 寫法來將類陣列的內容淺複製到真正的陣列裡面。
如此,才能讓這個新的陣列來進行只有陣列才能用的方法囉。
setAttribute - 增加標籤屬性 v.s getAttribute - 取得標籤屬性內容
上面這個例子,我們可以透過setAttribute
來為一個a
連結新增href
的屬性,並為這個屬性塞入值。
接著,再用getAttribute
來取得這個a
連結的href
屬性的內容。
插入 HTML 標籤的兩種方法
innerHTML
方法: 組完字串之後,傳進語法進行渲染
優點: 效能快
缺點: 資安風險
createElement
方法: 以DOM節點處理
優點: 安全性高
缺點: 效能差
innerHTML
a. 以上這個範例你可以看到我們透過innerHTML
來為.container裡面塞入了子節點。
b. 注意~~我們將class的名稱加入innerHTML
的內容裡面時,如果以最外面用單引號的時候,你裡面就要用雙引號喔,不然,這段字串會組不起來。
innerHTML會清除原本的內容
c. 你可以看到原本.container裡面有一個Hello的內容,在我們用innerHTML
來將子節點塞入之後,它是會直接被清掉的喔。
innerHTML 傳統寫法v.s字版字面值
另外,我們想要在innerHTML
的字串裡面塞入變數的話有兩種寫法
ex:
1 | ---傳統寫法--- |
你可以看到以上的差別,傳統的寫法的意思是前面的字串是<a href="
, 中間的變數內容是https://www.google.com/
,後面的
字串是">按鈕</a>
,所以,整體結果組出來才會是<a href="https://www.google.com/">按鈕</a>
的效果。
那在字版字面值的寫法,
只要外面要反引號包起來,然後,變數的部分用${}
包起來就可以達成跟上面的一樣效果囉~
innerHTML 與 for 迴圈
以上這個範例你可以看到,我們透過for迴圈將str變數的內容一直塞入各元素的連絡電話的內容,
等到塞完之後,再利用innerHTML來將這段組好的字串塞進去,就可以得到畫面上的效果囉。
createElement 寫法
以上這個範例你可以看到我們先透過createElement
創出一個li
的節點,
並在途中利用setAttribute
和textContent
來為這個新節點塞入內容和屬性,最後,再用appendChild
,
來為父元素塞入這個新創出來的子節點。
XSS 跨網站指令碼注意事項(Cross-site scripting)
innerHTML 不建議用在送出表單的部分
因為,如果在送出表單部分使用innerHTML
,惡意使用者很可能會蓄意的
加入一些js的語法,來駭入你的網站。
所以,innerHTML
是建議用在內部從遠端抓到可信任資料的時候,並要將這些資料渲染到
畫面上時,才建議使用innerHTML
。
所以,這種時候,在安全性上,使用createElement
的語法就比較可以避免以上這種攻擊。
那以上這種攻擊,就有一種術語叫做XSS攻擊,跨網站式的攻擊。
event(事件)
當你在function裡面丟入一個引數e,此時,當我們跟該元件互動的時候,
瀏覽器會將我們跟該元件互動的資訊(像是: 鼠標點擊的座標…等等),並將這些資訊存到這個引數e裡,此時,我們就能透過解析這個e所帶的資訊,來設計我們希望的相對應的互動了~
例:
1 | 在html檔案中 |
根據以上的例子,當我們點擊那個input
的按鈕的時候,會觸發它的onclick
事件,這個時候,因為我們有丟入引數e,所以,瀏覽器會將我們跟那個按鈕互動的相關資訊,都記在e裡面。