文章來源:freecodecamp網址:
https://chinese.freecodecamp.org/
HTML 是一種標記語言,使用特殊的語法或標記來向瀏覽器描述網頁的結構。HTML 元素由開始和結束標簽構成,標簽之間是文本內容。 不同的標簽可以讓文本內容以標題、段落、列表等形式展現。
在這個課程中,你將通過編寫一個展示貓咪圖片的應用,學習最常見的 HTML 元素——它們可以用來構成任何網頁。
注:本示例為第三個示例,以下內容來自freecodecamp。文章中圖示為調試當時界面,供學習參考。
p 元素是網站上段落文本使用的元素。 p 是“paragraph(段落)”的縮寫。
你可以像這樣創建一個段落:
<p>I'm a p tag!</p>
要求:在 h2 元素下方添加一個 p 元素,其內容是 Hello Paragraph。
注意: 按照慣例,所有 HTML 標簽都應該是小寫字母,例如應使用 <p></p>,而不會使用 <P></P>。
原始代碼界面:
<h1>Hello World</h1>
<h2>CatPhotoApp</h2>
更改后代碼如下:
JavaScript 使用 Unicode 編碼 (Unicode encoding)對字符串進行編碼。大多數字符使用 2 個字節編碼,但這種方式只能編碼最多 65536 個字符。
這個范圍不足以對所有可能的字符進行編碼,這就是為什么一些罕見的字符使用 4 個字節進行編碼,比如 (數學符號 X)或者 (笑臉),一些象形文字等等。
以下是一些字符對應的 unicode 編碼:
字符 | UNICODE | UNICODE 中的字節數 |
a | 0x0061 | 2 |
≈ | 0x2248 | 2 |
0x1d4b3 | 4 | |
0x1d4b4 | 4 | |
0x1f604 | 4 |
所以像 a 和 ≈ 這樣的字符占用 2 個字節,而 , 和 的對應編碼則更長,它們具有 4 個字節的長度。
很久以前,當 JavaScript 被發明出來的時候,Unicode 的編碼要更加簡單:當時并沒有 4 個字節長的字符。所以,一部分語言特性在現在仍舊無法對 unicode 進行正確的處理。
比如 length 認為這里的輸入有 2 個字符:
alert(''.length); // 2
alert(''.length); // 2
…但我們可以清楚地認識到輸入的字符只有一個,對吧?關鍵在于 length 把 4 個字節當成了 2 個 2 字節長的字符。這是不對的,因為它們必須被當作一個整體來考慮。(即所謂的“代理偽字符”(surrogate pair),你可以在這里進一步閱讀有關的的信息 字符串)。
默認情況下,正則表達式同樣把一個 4 個字節的“長字符”當成一對 2 個字節長的字符。正如在字符串中遇到的情況,這將導致一些奇怪的結果。我們將很快在后面的文章中遇到 [集合和范圍 ...]。
與字符串有所不同的是,正則表達式有一個修飾符 u 被用以解決此類問題。當一個正則表達式使用這個修飾符后,4 個字節長的字符將被正確地處理。同時也能夠用上 Unicode 屬性(Unicode property)來進行查找了。我們接下來就來了解這方面的內容。
在 Firefox 和 Edge 中缺乏支持
盡管 unicode property 從 2018 年以來便作為標準的一部分, 但 unicode 屬性在 Firefox (bug) 和 Edge (bug) 中并沒有相應的支持。
目前 XRegExp 這個庫提供“擴展”的正則表達式,其中包括對 unicode property 的跨平臺支持。
Unicode 中的每一個字符都具有很多的屬性。它們描述了一個字符屬于哪個“類別”,包含了各種關于字符的信息。
例如,如果一個字符具有 Letter 屬性,這意味著這個字符歸屬于(任意語言的)一個字母表。而 Number 屬性則表示這是一個數字:也許是阿拉伯語,亦或者是中文,等等。
我們可以查找具有某種屬性的字符,寫作 \p{…}。為了順利使用 \p{…},一個正則表達式必須使用修飾符 u。
舉個例子,\p{Letter} 表示任何語言中的一個字母。我們也可以使用 \p{L},因為 L 是 Letter 的一個別名(alias)。對于每種屬性而言,幾乎都存在對應的縮寫別名。
在下面的例子中 3 種字母將會被查找出:英語、格魯吉亞語和韓語。
let str = "A ? ?";
alert( str.match(/\p{L}/gu) ); // A,?,?
alert( str.match(/\p{L}/g) ); // null(沒有匹配的文本,因為沒有修飾符“u”)
以下是主要的字符類別和它們對應的子類別:
- 字母(Letter) L
- 小寫(lowercase) `Ll`
- 修飾(modifier) `Lm`,
- 首字母大寫(titlecase) `Lt`,
- 大寫(uppercase) `Lu`,
- 其它(other) `Lo`。
- 數字(Number) N
- 十進制數字(decimal digit) `Nd`,
- 字母數字(letter number) `Nl`,
- 其它(other) `No`。
- 標點符號(Punctuation) P
- 鏈接符(connector) `Pc`,
- 橫杠(dash) `Pd`,
- 起始引用號(initial quote) `Pi`,
- 結束引用號(final quote) `Pf`,
- 開(open) `Ps`,
- 閉(close) `Pe`,
- 其它(other) `Po`。
- 標記(Mark) M (accents etc):
- 間隔合并(spacing combining) `Mc`,
- 封閉(enclosing) `Me`,
- 非間隔(non-spacing) `Mn`。
- 符號(Symbol) S:
- 貨幣(currency) `Sc`,
- 修飾(modifier) `Sk`,
- 數學(math) `Sm`,
- 其它(other) `So`。
- 分隔符(Separator) Z
- 行(line) `Zl`,
- 段落(paragraph) `Zp`,
- 空格(space) `Zs`。
- 其它(Other) C :
- 控制符(control) `Cc`,
- 格式(format) `Cf`,
- 未分配(not assigned) `Cn`,
- 私有(private use) `Co`,
- 代理偽字符(surrogate) `Cs`。
因此,比如說我們需要小寫的字母,就可以寫成 \p{Ll},標點符號寫作 \p{P} 等等。
也有其它派生的類別,例如:
Unicode 支持相當數量的屬性,列出整個清單需要占用大量的空間,因此在這里列出相關的鏈接:
舉個例子,讓我們來查找 16 進制數字,寫作 xFF 其中 F 是一個 16 進制的數字(0…1 或者 A…F)。
一個 16 進制數字可以表示為 \p{Hex_Digit}:
let regexp = /x\p{Hex_Digit}\p{Hex_Digit}/u;
alert("number: xAF".match(regexp)); // xAF
讓我們再來考慮中文字符。
有一個 unicode 屬性 Script (一個書寫系統),這個屬性可以有一個值:Cyrillic,Greek,Arabic,Han (中文)等等,這里是一個完整的列表。
為了實現查找一個給定的書寫系統中的字符,我們需要使用 Script=<value>,例如對于西里爾字符:\p{sc=Cyrillic}, 中文字符:\p{sc=Han},等等。
let regexp = /\p{sc=Han}/gu; // returns Chinese hieroglyphs
let str = `Hello Привет 你好 123_456`;
alert( str.match(regexp) ); // 你,好
表示貨幣的字符,例如 $,€,¥,具有 unicode 屬性 \p{Currency_Symbol},縮寫為 \p{Sc}。
讓我們使用這一屬性來查找符合“貨幣,接著是一個數字”的價格文本:
let regexp = /\p{Sc}\d/gu;
let str = `Prices: $2, €1, ¥9`;
alert( str.match(regexp) ); // $2,€1,¥9
之后,在文章 量詞 +,*,? 和 {n} 中我們將會了解如何查找包含很多位的數字。
修飾符 u 在正則表達式中提供對 Unicode 的支持。
這意味著兩件事:
有了 unicode 屬性我們可以查找給定語言中的詞,特殊字符(引用,貨幣)等等。
HTML DOM 允許 JavaScript 改變 HTML 元素的內容。
改變 HTML 輸出流
JavaScript 能夠創建動態的 HTML 內容:
今天的日期是: Thu Aug 25 2016 09:23:24 GMT+0800 (中國標準時間)
在 JavaScript 中,document.write() 可用于直接向 HTML 輸出流寫內容。
實例
<!DOCTYPE html>
<html>
<body>
<script>
document.write(Date());
</script>
</body>
</html>
絕對不要在文檔加載完成之后使用 document.write()。這會覆蓋該文檔。 |
改變 HTML 內容
修改 HTML 內容的最簡單的方法時使用 innerHTML 屬性。
如需改變 HTML 元素的內容,請使用這個語法:
document.getElementById(id).innerHTML=新的 HTML
本例改變了 <p>元素的內容:
實例
<html>
<body>
<p id="p1">Hello World!</p>
<script>
document.getElementById("p1").innerHTML="新文本!";
</script>
</body>
</html>
本例改變了 <h1> 元素的內容:
實例
<!DOCTYPE html>
<html>
<body>
<h1 id="header">Old Header</h1>
<script>
var element=document.getElementById("header");
element.innerHTML="新標題";
</script>
</body>
</html>
實例講解:
上面的 HTML 文檔含有 id="header" 的 <h1> 元素
我們使用 HTML DOM 來獲得 id="header" 的元素
JavaScript 更改此元素的內容 (innerHTML)
改變 HTML 屬性
如需改變 HTML 元素的屬性,請使用這個語法:
document.getElementById(id).attribute=新屬性值
本例改變了 <img> 元素的 src 屬性:
實例
<!DOCTYPE html>
<html>
<body>
<img id="image" src="smiley.gif">
<script>
document.getElementById("image").src="landscape.jpg";
</script>
</body>
</html>
實例講解:
上面的 HTML 文檔含有 id="image" 的 <img> 元素
我們使用 HTML DOM 來獲得 id="image" 的元素
JavaScript 更改此元素的屬性(把 "smiley.gif" 改為 "landscape.jpg")
如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。