整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          應(yīng)該學(xué)會的20個JavaScript代碼寫法

          應(yīng)該學(xué)會的20個JavaScript代碼寫法

          1. IntersectionObserver實現(xiàn)滾動效果

          當(dāng)元素滾動到可視區(qū)之后,給元素添加一個動畫

          代碼如下:

          習(xí)目標(biāo):了解JavaScript是如何與HTML結(jié)合來創(chuàng)建動態(tài)網(wǎng)頁,網(wǎng)頁中嵌入JavaScript的不同方式,JavaScript的內(nèi)容類型及其與<script>的關(guān)系

          <script>元素

          <script>是由Netscape創(chuàng)造出來,后來加到HTML規(guī)范中的。

          <script>有8個屬性:

          1、async:表示立即開始下載腳本,但不能阻止其他頁面動作,比如下載資源或者等待其他腳本加載。只對外部腳本文件有效。

          2、charset:使用src屬性指定代碼字符集。這個屬性很少用,因為大多數(shù)瀏覽器不在乎它的值。

          3、crossorigin;配置資源請求的CORS(跨源資源共享)設(shè)置。默認(rèn)情況下不使用CORS。crossorigin=“anonymous”配置文件請求不用設(shè)置憑據(jù)標(biāo)志。crossorigin=”use-credentials“設(shè)置憑據(jù)標(biāo)志,意味著出站請求會包含憑據(jù)。

          4、defer:表示腳本可以延遲到文檔全部解析和顯示后再執(zhí)行。新版本中只能用于外部腳本。

          5、integrity:允許比對接收到的資源和指定的加密簽名以驗證子資源完整性(SRI,Subresource integrity),如果驗證簽名不匹配則腳本不會執(zhí)行。這個屬性可以用于確保內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN,Content Delivery Network)不會提供惡意內(nèi)容。

          6、language:此屬性已被廢止。

          7、src:表示包含外部要執(zhí)行的代碼的外部文件。

          8、type:代替language,表示代碼塊中腳本語言的內(nèi)容類型(也稱為MIME類型),按照慣例這個值始終都是”text/JavaScript“,盡管”text/JavaScript“和”text/ecmascript“都已經(jīng)廢棄。JavaScript文件的MIME類型通常是”application/x-javascript“,不過給type屬性這個值的話可能會導(dǎo)致腳本被忽略。在非IE的瀏覽器中有效的值還有”application/JavaScript“和”application/ecmascript"。如果這個值是module,則代碼會被當(dāng)成是ES6模塊,而且只有這時候代碼中才能出現(xiàn)import和export關(guān)鍵字。

          使用<script>的方式有內(nèi)聯(lián)和外嵌兩種,只要把code寫入<script>code</script>中就好,code中要是包含字符串“<script>”,只要加上轉(zhuǎn)義字符“\”即可。

          如果要外嵌JavaScript代碼只要使用src屬性來鏈接外部文件即可如:

          <script src=“example.js”></script>

          XHTML 文檔中,可以忽略結(jié)束標(biāo)簽寫成<script src=“example.js”/>即可,但是這在HTML中不能使用。

          標(biāo)簽位置

          過去把JavaScript和CSS一起寫在head中,但是這意味著必須下載所有code并解析和解釋完成后才開始渲染頁面,對于JavaScript很多的頁面會導(dǎo)致頁面渲染速度過慢,為解決這個問題,JavaScript一般寫在body元素的頁面內(nèi)容的最后邊,如下

          <html>

          <head></head>

          <body>

          message

          <script>code<\script>

          <\body>

          </html>

          推遲使用腳本

          在外聯(lián)JavaScript時可以使用defer屬性來推遲腳本的運(yùn)行。可以寫成:

          <html>

          <head>

          <script defer src="example.js">code<\script>

          </head>

          <body>

          message

          <\body>

          </html>

          異步執(zhí)行腳本

          async屬性從腳本處理方式上與defer類似,但是不同的是標(biāo)記async的腳本并不能保證腳本按照他們的出現(xiàn)順序執(zhí)行,比如:

          <html>

          <head>

          <script sync src="example1.js">code<\script>

          <script sync src="example2.js">code<\script>

          </head>

          <body>

          message

          <\body>

          </html>

          不能保證example1比example2先執(zhí)行。

          動態(tài)加載腳本

          除了<script>以外還可以用其他方式加載腳本。因為JavaScript可以使用DOM API,所以通過向DOM中動態(tài)地加入script元素同樣可以加載指定腳本。只要創(chuàng)建一個script元素并將其添加到DOM即可。

          let script=document.createElement('script');

          script.src='gibberish.js';

          document.head.appendChild(script);

          當(dāng)然,在把 HTMLElement 元素添加到 DOM 且執(zhí)行到這段代碼之前不會發(fā)送請求。默認(rèn)情況下,以這種方式創(chuàng)建的<script>元素是以異步方式加載的,相當(dāng)于添加了 async 屬性。不過這樣做可能會有問題,因為所有瀏覽器都支持 createElement()方法,但不是所有瀏覽器都支持 async 屬性。因此,如果要統(tǒng)一動態(tài)腳本的加載行為,可以明確將其設(shè)置為同步加載:

          let script=document.createElement('script');

          script.src='gibberish.js';

          script.async=false;

          document.head.appendChild(script);

          以這種方式獲取的資源對瀏覽器預(yù)加載器是不可見的。這會嚴(yán)重影響它們在資源獲取隊列中的優(yōu)先級。根據(jù)應(yīng)用程序的工作方式以及怎么使用,這種方式可能會嚴(yán)重影響性能。要想讓預(yù)加載器知道這些動態(tài)請求文件的存在,可以在文檔頭部顯式聲明它們:

          <link rel="preload" href="gibberish.js">

          XHTML中的變化

          可擴(kuò)展超文本標(biāo)記語言(XHTML,Extensible HyperText Markup Language)是將 HTML 作為 XML的應(yīng)用重新包裝的結(jié)果。與 HTML 不同,在 XHTML 中使用 JavaScript 必須指定 type 屬性且值為text/javascript,HTML 中則可以沒有這個屬性。XHTML 雖然已經(jīng)退出歷史舞臺,但實踐中偶爾可能也會遇到遺留代碼,為此本節(jié)稍作介紹。在 XHTML 中編寫代碼的規(guī)則比 HTML 中嚴(yán)格,這會影響使用<script>元素嵌入 JavaScript 代碼。下面的代碼塊雖然在 HTML 中有效,但在 XHML 中是無效的。

          <script type="text/javascript">

          function compare(a, b) {

          if (a < b) {

          console.log("A is less than B");

          } else if (a > b) {

          console.log("A is greater than B");

          } else {

          console.log("A is equal to B");

          }

          }

          </script>

          在 HTML 中,解析<script>元素會應(yīng)用特殊規(guī)則。XHTML 中則沒有這些規(guī)則。這意味著 a < b語句中的小于號(<)會被解釋成一個標(biāo)簽的開始,并且由于作為標(biāo)簽開始的小于號后面不能有空格,這會導(dǎo)致語法錯誤。避免 XHTML 中這種語法錯誤的方法有兩種。第一種是把所有小于號(<)都替換成對應(yīng)的 HTML實體形式(<)。結(jié)果代碼就是這樣的:

          <script type="text/javascript">

          function compare(a, b) {

          if (a < b) {

          console.log("A is less than B");

          } else if (a > b) {

          console.log("A is greater than B");

          } else {

          console.log("A is equal to B");

          }

          }

          </script>

          這樣代碼就可以在 XHTML 頁面中運(yùn)行了。不過,缺點是會影響閱讀。好在還有另一種方法。第二種方法是把所有代碼都包含到一個 CDATA 塊中。在 XHTML(及 XML)中,CDATA 塊表示文檔中可以包含任意文本的區(qū)塊,其內(nèi)容不作為標(biāo)簽來解析,因此可以在其中包含任意字符,包括小于號,并且不會引發(fā)語法錯誤。使用 CDATA 的格式如下:

          <script type="text/javascript"><![CDATA[

          function compare(a, b) {

          if (a < b) {

          console.log("A is less than B");

          } else if (a > b) {

          console.log("A is greater than B");

          } else {

          console.log("A is equal to B");

          }

          }

          ]]></script>

          在兼容 XHTML 的瀏覽器中,這樣能解決問題。但在不支持 CDATA 塊的非 XHTML 兼容瀏覽器中則不行。為此,CDATA 標(biāo)記必須使用 JavaScript 注釋來抵消:

          <script type="text/javascript">

          //<![CDATA[

          function compare(a, b) {

          if (a < b) {

          console.log("A is less than B");

          } else if (a > b) {

          console.log("A is greater than B");

          } else {

          console.log("A is equal to B");

          }

          }

          //]]>

          </script>

          這種格式適用于所有現(xiàn)代瀏覽器。雖然有點黑科技的味道,但它可以通過 XHTML 驗證,而且對XHTML 之前的瀏覽器也能優(yōu)雅地降級。

          廢棄的語法

          自 1995 年 Netscape 2 發(fā)布以來,所有瀏覽器都將 JavaScript 作為默認(rèn)的編程語言。type 屬性使用一個 MIME 類型字符串來標(biāo)識<script>的內(nèi)容,但 MIME 類型并沒有跨瀏覽器標(biāo)準(zhǔn)化。即使瀏覽器默認(rèn)使用 JavaScript,在某些情況下某個無效或無法識別的 MIME 類型也可能導(dǎo)致瀏覽器跳過(不執(zhí)行)相關(guān)代碼。因此,除非你使用 XHTML 或<script>標(biāo)簽要求或包含非 JavaScript 代碼,最佳做法是不指定 type 屬性。在最初采用 script 元素時,它標(biāo)志著開始走向與傳統(tǒng) HTML 解析不同的流程。對這個元素需要應(yīng)用特殊的解析規(guī)則,而這在不支持 JavaScript 的瀏覽器(特別是 Mosaic)中會導(dǎo)致問題。不支持的瀏覽器會把<script>元素的內(nèi)容輸出到頁面上,從而破壞頁面的外觀。Netscape 聯(lián)合 Mosaic 拿出了一個解決方案,對不支持 JavaScript 的瀏覽器隱藏嵌入的 JavaScript 代碼。最終方案是把腳本代碼包含在一個 HTML 注釋中,像這樣:

          <script><!--

          function sayHi(){

          console.log("Hi!");

          }

          //--></script>

          使用這種格式,Mosaic 等瀏覽器就可以忽略<script>標(biāo)簽中的內(nèi)容,而支持 JavaScript 的瀏覽器則必須識別這種模式,將其中的內(nèi)容作為 JavaScript 來解析。雖然這種格式仍然可以被所有瀏覽器識別和解析,但已經(jīng)不再必要,而且不應(yīng)該再使用了。在XHTML 模式下,這種格式也會導(dǎo)致腳本被忽略,因為代碼處于有效的 XML 注釋當(dāng)中。

          行內(nèi)代碼與外部文件

          雖然可以直接在 HTML 文件中嵌入 JavaScript 代碼,但通常認(rèn)為最佳實踐是盡可能將 JavaScript 代碼放在外部文件中。不過這個最佳實踐并不是明確的強(qiáng)制性規(guī)則。推薦使用外部文件的理由如下。

          ? 可維護(hù)性。JavaScript 代碼如果分散到很多 HTML 頁面,會導(dǎo)致維護(hù)困難。而用一個目錄保存所有 JavaScript 文件,則更容易維護(hù),這樣開發(fā)者就可以獨(dú)立于使用它們的 HTML 頁面來編輯代碼。

          ? 緩存。瀏覽器會根據(jù)特定的設(shè)置緩存所有外部鏈接的 JavaScript 文件,這意味著如果兩個頁面都用到同一個文件,則該文件只需下載一次。這最終意味著頁面加載更快。

          ? 適應(yīng)未來。通過把 JavaScript 放到外部文件中,就不必考慮用 XHTML 或前面提到的注釋黑科技。包含外部 JavaScript 文件的語法在 HTML 和 XHTML 中是一樣的。在配置瀏覽器請求外部文件時,要重點考慮的一點是它們會占用多少帶寬。在 SPDY/HTTP2 中,預(yù)請求的消耗已顯著降低,以輕量、獨(dú)立 JavaScript 組件形式向客戶端送達(dá)腳本更具優(yōu)勢。比如,第一個頁面包含如下腳本:

          <script src="mainA.js"></script>

          <script src="component1.js"></script>

          <script src="component2.js"></script>

          <script src="component3.js"></script>

          ...

          后續(xù)頁面可能包含如下腳本:

          <script src="mainB.js"></script>

          <script src="component3.js"></script>

          <script src="component4.js"></script>

          <script src="component5.js"></script>

          ...

          在初次請求時,如果瀏覽器支持 SPDY/HTTP2,就可以從同一個地方取得一批文件,并將它們逐個放到瀏覽器緩存中。從瀏覽器角度看,通過 SPDY/HTTP2 獲取所有這些獨(dú)立的資源與獲取一個大JavaScript 文件的延遲差不多。在第二個頁面請求時,由于你已經(jīng)把應(yīng)用程序切割成了輕量可緩存的文件,第二個頁面也依賴的某些組件此時已經(jīng)存在于瀏覽器緩存中了。當(dāng)然,這里假設(shè)瀏覽器支持 SPDY/HTTP2,只有比較新的瀏覽器才滿足。如果你還想支持那些比較老的瀏覽器,可能還是用一個大文件更合適。

          文檔模式

          IE5.5 發(fā)明了文檔模式的概念,即可以使用 doctype 切換文檔模式。最初的文檔模式有兩種:混雜模式(quirks mode)和標(biāo)準(zhǔn)模式(standards mode)。前者讓 IE 像 IE5 一樣(支持一些非標(biāo)準(zhǔn)的特性),后者讓 IE 具有兼容標(biāo)準(zhǔn)的行為。雖然這兩種模式的主要區(qū)別只體現(xiàn)在通過 CSS 渲染的內(nèi)容方面,但對JavaScript 也有一些關(guān)聯(lián)影響,或稱為副作用。本書會經(jīng)常提到這些副作用。

          IE 初次支持文檔模式切換以后,其他瀏覽器也跟著實現(xiàn)了。隨著瀏覽器的普遍實現(xiàn),又出現(xiàn)了第三種文檔模式:準(zhǔn)標(biāo)準(zhǔn)模式(almost standards mode)。這種模式下的瀏覽器支持很多標(biāo)準(zhǔn)的特性,但是沒有標(biāo)準(zhǔn)規(guī)定得那么嚴(yán)格。主要區(qū)別在于如何對待圖片元素周圍的空白(在表格中使用圖片時最明顯)。

          混雜模式在所有瀏覽器中都以省略文檔開頭的 doctype 聲明作為開關(guān)。這種約定并不合理,因為混雜模式在不同瀏覽器中的差異非常大,不使用黑科技基本上就沒有瀏覽器一致性可言。標(biāo)準(zhǔn)模式通過下列幾種文檔類型聲明開啟:

          <!-- HTML 4.01 Strict -->

          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"

          "http://www.w3.org/TR/html4/strict.dtd">

          <!-- XHTML 1.0 Strict -->

          <!DOCTYPE html PUBLIC

          "-//W3C//DTD XHTML 1.0 Strict//EN"

          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

          <!-- HTML5 -->

          <!DOCTYPE html>

          準(zhǔn)標(biāo)準(zhǔn)模式通過過渡性文檔類型(Transitional)和框架集文檔類型(Frameset)來觸發(fā):

          <!-- HTML 4.01 Transitional -->

          <!DOCTYPE HTML PUBLIC

          "-//W3C//DTD HTML 4.01 Transitional//EN"

          "http://www.w3.org/TR/html4/loose.dtd">

          <!-- HTML 4.01 Frameset -->

          <!DOCTYPE HTML PUBLIC

          "-//W3C//DTD HTML 4.01 Frameset//EN"

          "http://www.w3.org/TR/html4/frameset.dtd">

          <!-- XHTML 1.0 Transitional -->

          <!DOCTYPE html PUBLIC

          "-//W3C//DTD XHTML 1.0 Transitional//EN"

          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

          <!-- XHTML 1.0 Frameset -->

          <!DOCTYPE html PUBLIC

          "-//W3C//DTD XHTML 1.0 Frameset//EN"

          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

          準(zhǔn)標(biāo)準(zhǔn)模式與標(biāo)準(zhǔn)模式非常接近,很少需要區(qū)分。人們在說到“標(biāo)準(zhǔn)模式”時,可能指其中任何一個。而對文檔模式的檢測(本書后面會討論)也不會區(qū)分它們。本書后面所說的標(biāo)準(zhǔn)模式,指的就是除混雜模式以外的模式。

          <noscript>元素

          針對早期瀏覽器不支持 JavaScript 的問題,需要一個頁面優(yōu)雅降級的處理方案。最終,<noscript>元素出現(xiàn),被用于給不支持 JavaScript 的瀏覽器提供替代內(nèi)容。雖然如今的瀏覽器已經(jīng) 100%支持JavaScript,但對于禁用 JavaScript 的瀏覽器來說,這個元素仍然有它的用處。<noscript>元素可以包含任何可以出現(xiàn)在<body>中的 HTML 元素,<script>除外。在下列兩種情況下,瀏覽器將顯示包含在<noscript>中的內(nèi)容:

          ? 瀏覽器不支持腳本;

          ? 瀏覽器對腳本的支持被關(guān)閉。任何一個條件被滿足,包含在<noscript>中的內(nèi)容就會被渲染。否則,瀏覽器不會渲染<noscript>中的內(nèi)容。

          下面是一個例子:

          <!DOCTYPE html>

          <html>

          <head>

          <title>Example HTML Page</title>

          <script defer="defer" src="example1.js"></script>

          <script defer="defer" src="example2.js"></script>

          </head>

          <body>

          <noscript>

          <p>This page requires a JavaScript-enabled browser.</p>

          </noscript>

          </body>

          </html>

          這個例子是在腳本不可用時讓瀏覽器顯示一段話。如果瀏覽器支持腳本,則用戶永遠(yuǎn)不會看到它。

          小結(jié)

          JavaScript 是通過<script>元素插入到 HTML 頁面中的。這個元素可用于把 JavaScript 代碼嵌入到HTML 頁面中,跟其他標(biāo)記混合在一起,也可用于引入保存在外部文件中的 JavaScript。本章的重點可以總結(jié)如下。

          ? 要包含外部 JavaScript 文件,必須將 src 屬性設(shè)置為要包含文件的 URL。文件可以跟網(wǎng)頁在同一臺服務(wù)器上,也可以位于完全不同的域。

          ? 所有<script>元素會依照它們在網(wǎng)頁中出現(xiàn)的次序被解釋。在不使用 defer 和 async 屬性的情況下,包含在<script>元素中的代碼必須嚴(yán)格按次序解釋。

          ? 對不推遲執(zhí)行的腳本,瀏覽器必須解釋完位于<script>元素中的代碼,然后才能繼續(xù)渲染頁面的剩余部分。為此,通常應(yīng)該把<script>元素放到頁面末尾,介于主內(nèi)容之后及</body>標(biāo)簽之前。

          ? 可以使用 defer 屬性把腳本推遲到文檔渲染完畢后再執(zhí)行。推遲的腳本原則上按照它們被列出的次序執(zhí)行。

          ? 可以使用 async 屬性表示腳本不需要等待其他腳本,同時也不阻塞文檔渲染,即異步加載。異步腳本不能保證按照它們在頁面中出現(xiàn)的次序執(zhí)行。

          ? 通過使用<noscript>元素,可以指定在瀏覽器不支持腳本時顯示的內(nèi)容。如果瀏覽器支持并啟用腳本,則<noscript>元素中的任何內(nèi)容都不會被渲染。

          ython 程序可以執(zhí)行 JavaScript 代碼。實現(xiàn)這一點的常見方法包括使用以下幾種工具或庫:


          1. **PyExecJS**:

          - `PyExecJS` 是一個可以在 Python 中執(zhí)行 JavaScript 代碼的庫。它支持多種 JavaScript 運(yùn)行時環(huán)境,包括 Node.js、PhantomJS 和 JScript。


          2. **PyMiniRacer**:

          - `PyMiniRacer` 是一個 Python 包裝器,用于在 V8 引擎上執(zhí)行 JavaScript 代碼。它非常輕量,適合需要快速執(zhí)行簡單 JavaScript 代碼的場景。


          3. **Node.js 子進(jìn)程**:

          - 可以使用 Python 的 `subprocess` 模塊來啟動一個 Node.js 進(jìn)程,并在其中執(zhí)行 JavaScript 代碼。


          以下是使用這三種方法的示例:


          ### 使用 PyExecJS


          首先,安裝 `PyExecJS`:


          ```sh

          pip install PyExecJS

          ```


          然后,可以在 Python 中執(zhí)行 JavaScript 代碼:


          ```python

          import execjs


          # JavaScript 代碼

          js_code="""

          function add(a, b) {

          return a + b;

          }

          """


          # 編譯并執(zhí)行 JavaScript 代碼

          ctx=execjs.compile(js_code)

          result=ctx.call("add", 1, 2)

          print(result) # 輸出:3

          ```


          ### 使用 PyMiniRacer


          首先,安裝 `PyMiniRacer`:


          ```sh

          pip install py_mini_racer

          ```


          然后,可以在 Python 中執(zhí)行 JavaScript 代碼:


          ```python

          from py_mini_racer import py_mini_racer


          # 創(chuàng)建一個 V8 引擎實例

          ctx=py_mini_racer.MiniRacer()


          # 執(zhí)行 JavaScript 代碼

          result=ctx.execute("function add(a, b) { return a + b; } add(1, 2);")

          print(result) # 輸出:3

          ```


          ### 使用 Node.js 子進(jìn)程


          首先,確保安裝了 Node.js,然后在 Python 中使用 `subprocess` 模塊:


          ```python

          import subprocess

          import json


          # JavaScript 代碼

          js_code="""

          function add(a, b) {

          return a + b;

          }

          console.log(JSON.stringify(add(1, 2)));

          """


          # 創(chuàng)建一個 Node.js 子進(jìn)程

          process=subprocess.Popen(

          ['node', '-e', js_code],

          stdout=subprocess.PIPE,

          stderr=subprocess.PIPE

          )


          stdout, stderr=process.communicate()


          if process.returncode==0:

          result=json.loads(stdout)

          print(result) # 輸出:3

          else:

          print("Error:", stderr.decode())

          ```


          總結(jié)一下,雖然 Python 本身不直接支持執(zhí)行 JavaScript 代碼,但通過使用上述庫和方法,可以輕松地在 Python 程序中執(zhí)行 JavaScript 代碼。選擇哪種方法取決于你的具體需求和使用場景。


          主站蜘蛛池模板: 国产自产对白一区| 国产精品免费一区二区三区四区 | 91精品一区二区三区久久久久| 狠狠爱无码一区二区三区| 中文字幕一区二区三区视频在线| 亚洲国产国产综合一区首页| 麻豆视频一区二区三区| 亚洲av成人一区二区三区 | 久久一区二区精品| 无码人妻一区二区三区av| 中文字幕在线无码一区| 一区二区三区视频| 国产精品成人国产乱一区| 国产一区美女视频| 亚洲欧美国产国产综合一区| 丰满人妻一区二区三区免费视频| 亚洲色无码专区一区| 亚洲一区二区三区偷拍女厕| 国产在线观看一区二区三区精品| 日韩一区二区三区在线精品| 一区国产传媒国产精品| 熟女少妇精品一区二区| 天天爽夜夜爽人人爽一区二区| 色国产在线视频一区| 成人免费观看一区二区| 亚洲另类无码一区二区三区 | 精品视频一区二区观看| 国产精品分类视频分类一区| 日韩免费无码一区二区三区| 夜夜嗨AV一区二区三区| 国产综合无码一区二区辣椒 | 日韩一区精品视频一区二区 | 亚洲AV成人精品日韩一区18p | 嫩B人妻精品一区二区三区| 福利一区福利二区| 国产成人综合精品一区| 伊人色综合一区二区三区| 日本不卡免费新一区二区三区| 不卡一区二区在线| 日本免费电影一区二区| 一区二区三区观看免费中文视频在线播放 |