2014-04-26 25 views
1

我很好奇將PHP輸出傳遞給Javascript。兩件事具體:使PHP運行在.js頁面上不可行嗎?

  • 我假設這可以安全地使用腳本標記在.php頁面上。有什麼理由不這樣做?

  • 你能在.js頁PHP運行?需要進行哪些配置更改?再一次,會不會有一個理由?

+0

爲什麼你想傳遞給Javascript的數據類型?是動態的(會定期更新的)還是靜態內容? –

+0

我的特殊問題是開發服務器與生產服務器。我正在想方法只有一個頁面需要在它們之間保持唯一性,並且PHP和Javascript都會選擇變量(例如,主機URL等)。我想盡量讓這個問題更廣泛,因爲我可以考慮其他用途。但要回答你的問題,不,在我的情況下,數據不會經常變化。 – equazcion

+0

我沒有看到你的問題和dev/prod環境之間的鏈接。也許在問題中增加一些你想使用的變量的例子可能會幫助我們看到你想要做的事情。 –

回答

2

我假設這可以在.php頁面上使用腳本標記安全地完成。有什麼理由不這樣做?

是。沒有理由不。

您可以讓PHP在.js頁面上運行嗎?需要進行哪些配置更改?再一次,會不會有一個理由?

是的,你將不得不配置你的網絡服務器使用PHP模塊的.js後綴。在nginx的你可能會添加位置線中的.js結尾的文件: -

location ~ \.js$ 
{ 
} 

在Apache上你會做這樣的事情: -

AddType application/x-httpd-php .php .js 

一個你可能不希望這樣做的原因,任何靜態的JS文件都會通過PHP模塊,這會導致額外的開銷。另一種辦法是引用PHP文件中的HTML腳本標記如: -

<script src="myfile.php"></script> 

,然後確保你的PHP返回其與正確的內容類型如輸出: -

header('Content-Type: application/javascript'); 
+0

謝謝,這是很好的信息。 – equazcion

0

你說的都對。

  • 可以輸出動態內容(PHP)在<script>標籤.php頁面上
  • 可以在輸出動態內容(PHP)的所有的JavaScript文件,雖然延長仍然是.php

實施例1

<script type="text/javascript"> 
var myobject = { 
    data: '<?php echo $myPHPvariable; ?>'; 
}; 
// or better yet: 
var myBetterObject = <?php echo json_encode($myPhpObject); ?>; 

function foo() { ... } 
</script> 

實施例2

不推薦

<?php 
// This is an all-javascript file but the extension ends with .php 

header('Content-Type: application/javascript'); 
?> 

var myobject = { 
    data: '<?php echo $myPHPvariable; ?>'; 
}; 
function foo() { ... } 

然後你包括你的HTML文檔中的文件有:

<script type="text/javascript" src="/custom_javascript.php"></script> 

它一定要與.php結束,幸運的是瀏覽器就知道它是JavaScript的由type="text/javascript"部分,因爲你的PHP腳本輸出正確的Content-Type標題。

0

第一個解決方案是簡單的:申報輸出HTML一些JS變量,它們可以通過PHP代碼不變或產生:

<script> 
var my_variable = '<?php echo($my_variable); ?>'; 
</script> 

然後你就可以在你的JavaScript代碼使用這個變量。

.js文件應該是靜態的,讓瀏覽器緩存他們,所以每次用戶加載頁面時,他們就不會被加載。通過使用PHP隨時生成.js文件,使用緩存.js的瀏覽器可能會遇到問題,而不是預期生成的文件。例如,如果您的變量包含動態內容作爲您網站的最新消息,日期時間等。

所以,您可以做到這一點,但您必須防止瀏覽器緩存文件,增加帶寬使用率或期望瀏覽器加載緩存.js文件時的意外行爲。使用這種方式沒有任何好處。

+0

如果您告訴瀏覽器不要緩存它們,您不會遇到任何問題 – Paulpro

+0

我同意,但這會浪費帶寬。 –

+1

是的,理想情況下,您只會在變量聲明您需要從服務器動態獲取所有數據並告訴瀏覽器緩存所有其他.js一年左右的數據時才這樣做,然後使查詢字符串無效時你修改它們。 – Paulpro