2013-08-05 26 views
4

爲什麼腳本type =「text/plain」不是onload?下面的loadPlain不會觸發回調,但loadScript會。腳本或鏈接標記上的「type」或「rel」,「text/plain」的Javascript onload回調

我希望這工作......應該不是嗎?

loadPlain("http://localhost/ajax/libs/jquery/1.10.2/jquery.min.js", function(element) { 
      alert(1); 
      alert(element.innerHTML); 
    }, undefined, {}) 

    function loadPlain(path, callback, errorCallback, options) { 
      var element = document.createElement('script'); 
      element.setAttribute("type", 'text/plain'); 
      element.setAttribute("src", path); 

      return loadBase(element, callback, errorCallback, options); 
    } 

    function loadScript(path, callback, errorCallback, options) { 
      var element = document.createElement('script'); 
      element.setAttribute("type", 'text/javascript'); 
      element.setAttribute("src", path); 

      return loadBase(element, callback, errorCallback, options); 
    } 


    function loadBase(element, callback, errorCallback, options) { 
      element.loaded = false; 

      if (element.readyState){ // IE 
        element.onreadystatechange = function(){ 
          if (element.readyState == "loaded" || element.readyState == "complete"){ 
            element.onreadystatechange = null; 

            loadBaseOnload(element, callback); 
          } 
        }; 
      } else {     // Others 
        element.onload = function() { 
          loadBaseOnload(element, callback); 
        }; 
      } 

      element.onerror = function() { 
        errorCallback && errorCallback(element); 
      }; 

      (options.elementAppendTo || document.head || loadBase.head || (loadBase.head = document.getElementsByTagName('head')[0]) || document.body).appendChild(element); 

      return element; 
    } 

    function loadBaseOnload(element, callback) { 
      if (element.loaded != true) { 
        element.loaded = true; 
        if (callback) callback(element); 
      } 
    } 

請注意,我知道XMLHttpRequest的,但那不是問題:)

+0

你是如何使用你的函數loadPlain的?我問,因爲它在風格上與你的函數loadScript看起來很相似,所以它可能會以你使用它的方式導致問題。 – Trendy

回答

8

的WHATWG有list of known script MIME types並且不得被視爲腳本語言的一些被列入黑名單的MIME類型(誰規定了瀏覽器的行爲,旁邊的W3C組織):

下面列出的MIME類型的字符串用戶代理商必須承認,和語言它們所指:

  • "application/ecmascript"
  • "application/javascript"
  • "application/x-ecmascript"
  • ...

以下MIME類型(有或沒有參數)不得被解釋爲腳本語言:

  • "text/plain"
  • "text/xml"
  • "application/octet-stream"
  • "application/xml"

注意:這些類型在此處明確列出,因爲它們是定義不明確的類型,但仍然可能用作數據塊的格式,並且如果它們突然被用戶解釋爲腳本劑。

什麼WHATWG規範要求「數據塊」這裏有封閉在<script>標籤非腳本

在這個例子中,使用了兩個腳本元素。一個嵌入一個外部腳本,另一個包含一些數據。

<script src="game-engine.js"></script> 
<script type="text/x-game-map">` 
........U.........e 
o............A....e 
.....A.....AAA....e 
.A..AAA...AAAAA...e 
</script> 

指定爲<script>標籤load事件明確表明他們火腳本通過<script>標籤,不對無腳本的數據塊中提到的WHATWG規範的組件。如果type未被識別爲與瀏覽器支持的腳本語言相對應的MIME類型,則A <script>元素是數據塊。這意味着,像text/plain這樣的黑名單類型永遠不會被識別爲腳本,而在必須支持和非必需支持列表中,例如application/dart(Google的Dart語言)中的類型值可能會被某些瀏覽器支持。

此外,包括非腳本typesrc並不符合規範。只有當指定行內的數據塊是合法的:

當用於包括數據塊(相對於腳本)中,數據必須嵌入直列,必須使用type屬性給出的數據的格式, src屬性不得指定爲,並且腳本元素的內容必須符合爲使用的格式定義的要求。

+0

無論如何,人們會預期onload會發射。但我想這是不可能的。即使鏈接類型樣式表也不會觸發onload。我想我將不得不爲這個使用xmlhttprequest ... – momomo

1

如果您指定的腳本爲「text/plain的」瀏覽器不會用它做任何事情。

您必須將其指定爲「script/javascript」才能將其作爲JavaScript執行。

+0

但我只想要onload發射,我不需要它來執行javacript,只是想知道它何時加載... – momomo

+0

這對我來說沒有意義..爲什麼要加載資源並且那麼什麼都不做? – Halcyon

+0

我不是把它加載爲javascript,我只是想要它的內容。我已經有了通過添加腳本來加載的邏輯,所以我想我可以使用相同的東西,然後在 – momomo

相關問題