javascript
  • document.write
  • 2010-03-10 61 views 2 likes 
    2

    因此我有一個外部JavaScript文件,我們可以將它稱爲something.js,然後我將它寫入文檔。出於某種原因,我無法訪問Safari或FireFox中的功能。動態編寫腳本時Javascript功能無法訪問

    它去有點像這樣:

    <script type="text/javascript"> 
        document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E")); 
        myFunction(); 
    </script> 
    

    所以這告訴我myFunction是空的,但如果我把同樣的函數調用在something.js年底,它的工作原理。現在這不是確切的情況,所以我意識到對於這個特殊情況,這不是最好的解決方法。

    +0

    直接使用'

    2

    我認爲這是因爲myFunction();在包含它在瀏覽器中加載的整個.js文件之前被調用,請嘗試延遲myFunction();調用幾秒鐘,然後再次測試以確保這是問題所在。

    +0

    如果我延遲2秒,它會延遲我的網頁加載2秒? – 2010-03-10 22:59:47

    +0

    它可能,是的! ... – Cheeso 2010-03-10 23:00:51

    +0

    是的,特別是如果這個腳本代碼存在於你的頁面代碼的開頭 – 2010-03-10 23:01:40

    0

    使用document.write打印腳本包含標記後,瀏覽器在加載外部腳本之前繼續執行(嘗試調用myFunction())。所以,你的腳本還沒有可用。

    0
    1. 把你的動態script塊文檔的 head(如果它不是 已經)
    2. 取出myFunction()電話。
    3. myFunction()調用不同 script塊 文檔某處低。

    第1步是最好的做法,但我不認爲任何瀏覽器會嗆,如果你動態地包括在文檔中的某些其他點的JS文件。

    關鍵是你不能在包含的同一個腳本塊中使用包含的JS代碼。

    這適用於Firefox,我不能擔保Safari。

    <html> 
        <head> 
         <script type="text/javascript"> 
          document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E")); 
         </script> 
        </head> 
        <body> 
         <script type="text/javascript"> 
          myFunction(); 
         </script> 
        </body> 
    </html> 
    
    0

    通常我不會寫兩個不同的答案,但是這是一個非常不同的答案,這只是作爲可能的工作。

    撥打電話something_ready()在something.js的底部。不要在something.js中定義something_ready(),在你的html文檔中定義它。

    所以沒有定時器,沒有不必要的檢查。

    <script type="text/javascript"> 
         document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E")); 
    
         function something_ready(){ 
          myFunction(); 
         } 
        </script> 
    

    這將工作,它只是假設你有權訪問something.js,你可能不會。如果不是,我提供的其他答案將起作用。

    0

    這是行不通的嗎?

    <script type="text/javascript"> 
    document.write(unescape("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E")); 
    document.write("<"+"script type='text/javascript>myFunction();<"+"/script>"); 
    </script> 
    
    0

    要做到這一點,最簡單的辦法就是寫兩個劇本<塊>。

    <script type="text/javascript"> 
        document.write(decodeURI("%3Cscript src='something.js' type='text/javascript'%3E%3C/script%3E")); 
    </script> 
    <script type="text/javascript"> 
        myFunction(); 
    </script> 
    

    文件撰寫時,文本直接寫入文件中,<腳本>標籤之後。因此,當瀏覽器遇到<腳本>標記時,它將等待腳本完成加載,然後再繼續下一頁。任何發生在加載腳本中的document.write都可能會影響頁面的其餘部分(例如,如果您執行「document.write('<div>')」,則會影響其餘佈局)。

    因此,如果您使用兩個<腳本>標籤,第一個是由瀏覽器遇到的,它使用文件撰寫輸出一個新<腳本>標籤。一旦<腳本>標記完成,瀏覽器繼續向下翻頁,並立即遇到新的,動態添加的<腳本>標記。這<腳本>標記告訴瀏覽器加載您的外部Javascript。瀏覽器將等待執行第二個原始<腳本>標記,直到此<腳本>標記已完成加載。那麼你的功能myFunction將可用。

    之所以做這一切在一個<腳本>標籤不起作用是因爲文件撰寫不會發生,直到<腳本>運行完畢後(myFunction的還不可用)。它的工作原理有兩個<腳本>標籤的原因是因爲瀏覽器等待,直到每個<腳本>標籤連續運行,文件撰寫提出了新的<腳本>標籤一致。