2014-10-10 91 views
0

我正在處理一個有以下問題的項目:PHP var-> Javascript-> PHP

數據庫給出(通過php)一個包含需要加載的JavaScript文件列表的數組。它存儲在變量$array(php)中。我需要使用php(foreach loop)來提取這些源文件並通過JavaScript加載它們。它是這樣的:

document.write("<?php foreach($js_files as $filename) {if(trim($filename) <> ""){echo '<script  type=\'text/javascript\' src=$filename></script> \n';}} ?> "); 

的問題是,它加載幾個文件,但出現問題與第一個(一個谷歌的API文件)。有沒有人對此有過溶劑?或者我需要看哪個方向的任何想法。

+3

我認爲解決方案將完全改變你的方法。 – 2014-10-10 10:44:32

+0

'echo' \ n'' 無法工作。您需要使用雙引號來使用內聯變量($ filename)。如果你使用單引號'$ filename'將只是一個字符串,而不是變量。 – mochalygin 2014-10-10 10:48:44

+0

這是不可能改變我的方法。我正在處理的數據庫提供了必須加載的資源列表。輸出格式是一個數組。我需要在觸發回調函數時加載文件 – user3464409 2014-10-10 11:28:53

回答

0

因爲"會破壞JavaScript字符串,所以您必須跳過if(trim($filename) <> "")中的代碼「」。

+0

這裏的轉義如何工作?我一直給我錯誤 – user3464409 2014-10-10 11:26:31

+0

刪除'MrCode說'的包裝爲'document.write(「」),並刪除src與「」 – 2014-10-10 11:31:11

+0

我需要在JavaScript中的PHP,所以我不能... – user3464409 2014-10-10 11:36:46

1

如果需要從JavaScript函數中觸發代碼,則可以刪除document.write,以便創建新的腳本對象,並添加到head標籤。

<?php 
    foreach($js_files as $filename){ 
    if(trim($filename) != ''){ 
     echo 'var s = document.createElement("script");'; 
     echo 's.type = "text/javascript";'; 
     echo 's.src = "' . $filename . '";'; 
     echo 'document.getElementsByTagName("head")[0].appendChild(s);' 
    } 
    } 
?> 
+0

這必須在javascript回調函數中觸發,所以我不認爲這是一個解決方案 – user3464409 2014-10-10 11:26:07

+0

請參閱我的編輯.... – MrCode 2014-10-10 11:38:44

1

這是一個多層次的壞主意,但可以相當容易地解決。但首先: 1)切勿使用document.write()。要動態加載腳本,最好是使用:

var script = document.createElement('script'); //create a script element 
script.src = 'javascript.js'; //path to src file 
//now get the body element and append the new script element 
document.getElementsByTagName('body')[0].appendChild(script); 

2)如果他們需要在一個特定的順序加載,這樣加載腳本將可能無法正常工作,動態腳本的下載異步進行的(非確定性)

3)一般來說,您應該連接您的js文件以減少http請求,您可以使用像grunt這樣的工具進行自動構建過程。

4)如果你真的想這些腳本動態加載雖然,你可以使用我在介紹的過程(1)來獲取文件名使用ajax

//depends on jQuery, but could be written vanilla if needed 
$.get('myPhp.php', function(resp){ 
    var arr = resp.split(','); //splits returned string on the comma 
    var i = arr.length; 
    //iterate through the results set 
    while (i--) { 
     //do process from (1) above 
    } 
}); 

注意,這將仍然有無序的問題。如果你需要順序動態加載檢查出類似require.js