1. 程式人生 > >動態修改script標籤中的src屬性存在的問題

動態修改script標籤中的src屬性存在的問題

需求:通過指令碼動態修改script標籤的src來載入一段外部指令碼並執行
實現方式(#1)

<script type="text/" id="external-script">
</script>
<script type="text/javascript">
    document.getElementById('external-script').src='url2';
</script>

url2的內容如下

alert('I am dynamic');

結果

  • Chrome: 什麼事都沒發生(沒有請求url2)
  • Firefox: 什麼事都沒發生(沒有請求url2)
  • IE9:什麼事都沒發生(請求url2但不執行url2的指令碼)
  • IE(6,7,8): I am dynamic(請求並執行了url2的指令碼)

注意實現方式中,第一段的script標籤中間是有內容的(空格、換行符以及回車符)。

如何來解釋這個問題呢?要解釋這個問題,們來看兩個變種的例子,第一個例子(明確內聯內容),如下所示(#2):

<script type="text/javascript" id="external-script">
alert('I am inline');
</script>
<script type="text/javascript">
    document.getElementById('external-script').src='url2';
</script>

結果如下:

  • Chrome: I am inline(沒有請求url2)
  • Firefox: I am inline(沒有請求url2)
  • IE9:I am inline(請求url2但不執行url2的指令碼)
  • IE(6,7,8): I am inline I am dynamic(請求並執行了url2的指令碼)

再來看看第二個變種的例子(#3):

<script type="text/javascript" id="external-script" src="url1">
    alert('I am inline script');
</script>
<script type="text/javascript">
    document.getElementById('external-script').src='url2';
</script>

其中url1的內容如下:

alert('I am url1');

結果如下:

  • Chrome: I am url1(沒有請求url2)
  • Firefox: I am url1(沒有請求url2)
  • IE9:I am url1(請求url2但不執行url2的指令碼)
  • IE(6,7,8): I am url1 I am dynamic(請求並執行了url2的指令碼)

首先這裡肯定的是src屬性是修改成功的,可以通過看dom的變化看到src已經設定進去了。這個時候我們比對這三個例子,思考幾十秒。分析下這三 個例子,其實#2和#1是一樣的,這裡用#2是為了說明#1中的空格、換行符以及回車符會被瀏覽器認為是內聯的指令碼。通過比對#2和#3,是不是會讓你想 到什麼?沒錯,我們第一個會想到的就是:當script標籤既有src屬性又有內聯指令碼的時候瀏覽器該如何處理? , 先來解釋這個問題。

一談到瀏覽器應該怎樣處理,就不得不翻出各種寶典,這次不再是葵花寶典了,而是九陰真經(W3C的HTML4標準),標準中關於script標籤的src部分有如下一段話:

If the src attribute is not set, user agents must interpret the contents of the element as the script. If the src has a URI value, user agents must ignore the element’s contents and retrieve the script via the URI

上面這段話的意思就是說:

如果src沒有設定,那麼就執行內聯指令碼,如果src設定了瀏覽器就必須忽略內斂指令碼而要去請求src指定的url的內容

這解釋了為什麼#3中標準瀏覽器(甚至IE6,7,8)都沒有執行內聯指令碼(因為src設定了url1)。

搞清楚了這個基礎問題之後,接下來問題就定位到了動態修改script的src屬性的時候瀏覽器如何處理? ,從結果來看,標準的瀏覽器都沒有去請求url2(更改src無效),這回IE6,7,8終於犯傻了。當然了,咱們也不能隨隨便便說人家犯傻,要拿出證據,這個時候繼續拿出九陰真經W3C的HTML5標準,其中有這樣一句話:

Changing the src, type, charset, async, and defer attributes dynamically has no direct effect; these attribute are only used at specific times described below.

意思就是說:

修改src是沒用的,對src的處理只會在特定的時候進行(個人猜測就是第一次看到這個屬性的時候瀏覽器會去做相應處理,之後就無視它了)。

好了,這下真相大白了:這解釋了為啥#3和#1中除了IE6,7,8之外其他瀏覽器都沒有去請求url2(IE9請求了,但沒執行),而且實驗發現IE6,7,8對動態修改src都會做請求執行處理。

最後,這個故事至少告訴我們:寫script標籤的時候千萬別手賤打回車。

參考文件:

相關推薦

動態修改script標籤src屬性存在的問題

需求:通過指令碼動態修改script標籤的src來載入一段外部指令碼並執行實現方式(#1): <script type="text/" id="external-script"> </script> <script type="text/ja

關於html頁面img標籤src屬性的理解

今天在練習SSM框架時,接觸到了關於html頁面中圖片的引用,因為案例中採用的是作者自己的絕對路徑,雖然這種方法也沒問題,但採用相對路徑應該會更完美,也能加深自己對相對路徑的熟悉。於是百度了一下,得到如下總結,記錄之,方便後續檢視。 圖片檔案和html檔案在同一路徑下

Vue動態繫結img的src屬性

問題:不同的status值,載入不同的圖片,如下程式碼雖然動態綁定了src,但是並不能成功載入圖片 <div> <img :src="imgUrl"/> <p>{{info}}</p> </div> computed:

HTMLimg標籤src屬性絕對路徑問題解決辦法,完全解決!

需求:有時候自己的專案img的src路徑需要用到本地某資料夾下的圖片,而不是直接使用專案根目錄下的圖片。 場景:eclipse,tomcat,html,img,src,java 注意:不需要尋找tomcat真實路徑下的server.xml去修改,這個地方不需要修改。 解決辦法:1、在ec

script標籤defer和async屬性的區別

script標籤存在兩個屬性,defer和async,因此script標籤的使用分為三種情況:   1.<script src="example.js"></script>    沒有defer或async屬性,瀏覽器會立即載入並執行相應的指令碼。也就是說在渲染script標籤之後的文

JavaScript查詢Html字串的img標籤替換src屬性的內容

JavaScript示例程式碼如下:  var newContent= content.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi,function(match,capture){   //capture

script標籤async,defer兩個屬性的區別

1、相同點   (1)、載入檔案時不阻塞頁面渲染; (2)、對於inline的script無效; (3)、使用這兩個屬性的指令碼中不能呼叫document.write方法; (4)、有指令碼的onload的事件回撥; (5)、允許不定義屬性值,僅僅使用屬性名;

script標籤的async和defer屬性

眾所周知,html中的script標籤都是同步按順序來執行的,並且在載入和執行的時候會中斷DOM解析器的解析過程,下面列舉一個簡單的例子來觀察這一過程: loadjs.html程式碼: <!DOCTYPE html> <html> <hea

jsoup獲取script標籤的內容

String page = HttpUtil.doGet(href); Document document = Jsoup.parse(page); Elements elements = document.select("

script標籤引用js檔案的變數或方法

例如專案中使用app.js檔案做如下定義: //定義變數 (function($){ window.dog = {}; })(mui); //定義方法 function run(){ console.log('呼叫js檔案中的run方法'); } 接著在html

VS動態修改App.config遇到的坑(宿主進程問題)

void get 針對 bug 圖片 解決方案 很多 選項 sco 昨天遇到了很奇怪的一個bug,具體描述如下:   這個系統是c/s架構的針對多個工廠做的資材管理系統,由於有很多個工廠,每個工廠都有自己的服務器。所以需要動態的改變連接字符串去鏈接不同的服務器。   由於這

Js與標籤屬性 關於在JS設定標籤屬性 js和jquery通過this獲取html標籤屬性

關於在JS中設定標籤屬性 2017-10-09 23:04 by 清風221, 12790 閱讀, 0 評論, 收藏, 編輯 Attribute 該屬性主要是用來在標籤行內樣式,新增、刪除、獲取屬性。且適用於自定義屬性。

修改select 標籤的值

背景: 前臺下拉列表中的值需要與input標籤中輸入的值相等 思路: 1.下拉列表為空時,input標籤有值的情況下複製給select標籤 2.後臺只需要一直讀取select標籤的值即可,不需要再重複讀取input標籤的內容 解決方法: jquery:$("#produ

淺談script標籤的async和defer

script標籤用於載入指令碼與執行指令碼,在前端開發中可以說是非常重要的標籤了。直接使用script指令碼的話,html會按照順序來載入並執行指令碼,在指令碼載入&執行的過程中,會阻塞後續的DOM渲染。 現在大家習慣於在頁面中引用各種的第三方指令碼,如果第三方服務商出現了一些小

JS方法is not defined解決辦法--方法不能寫在匯入jQuery包的script標籤

前幾天被一個問題坑的很慘,今天用空,來記錄一下。在JSP頁面的HTML標籤裡寫著onclick觸發事件,在script標籤裡寫著這個事件的方法,可是一執行瀏覽器就報錯** is not defined。比如就這個標籤:<input type="text" onclick

標籤href屬性動作和onclick事件的區別

最常用的兩個引數是href和name。其中href是hypertext reference的縮略詞,用於設定連結地址。連結地址必須為url地址,如果沒有給出具體路徑,則預設路徑和當前頁的路徑相同。 連結到的檔案也分為幾種情況:如果為HTML檔案,則在當前瀏覽器中直接開啟;如果為可執行檔案(.exe檔案),則直

使用jquery給input 標籤 新增屬性

現:            1.<input type="text" id=-"cert" /> 想要變成: 2.<input type="text" id="cert" readOnly="readOnly"> 在js中新增標籤 1轉換

JS從後臺獲取資料,前臺動態新增tr標籤的td標籤

功能描述: 要求從後臺查詢該省份的所有城市,然後動態的再前臺固定的tr標籤中新增相應的td標籤來展示城市基本資訊; 一、前臺jsp及js原始碼 jsp:在固定的tr標籤中新增一個

jquery獲取標籤屬性值 並且賦值

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <script

js獲取imagesrc屬性的方法語句

js中獲取image的src值的語句: var path =  $('#suolue').attr('src'); var path = document.getElementById("suolue").src; var path = $("#suolue")[0].src; 以