2013-10-31 100 views
3

我是新來的客戶端和服務器端腳本,我想知道,他們怎麼不能互動?爲什麼服務器端和客戶端腳本無法交互?

的主要區別碼征服說here是:

...被稱爲客戶端語言,因爲它已加載一個網頁後,您的計算機上運行的腳本。

而且

服務器端還是後端的HTML被加載之前,而不是之後語言運行其腳本。

即使已經執行了服務器端腳本(例如PHP),在頁面加載後如何不能更改(使用JavaScript)?

我想從JS調用PHP。例如,有沒有可能的方法來做到這一點?

setInterval(<?php someFunction() ?>,10000); 

對不起,如果我誤解了一些東西,請給我指出來。

+0

看看JSON RPC HTTP:// JSON-RPC。 org/ – gawpertron

+1

這是您的瀏覽器加載網站時發生的情況。向服務器請求HTML文件=> PHP運行並生成一個HTML文件=> PHP quits =>瀏覽器接收該文件並呈現它並運行任何JavaScript。當瀏覽器獲取頁面時,PHP完成,並關閉與服務器的連接。你需要看看AJAX做你想做的事。 –

回答

3

他們可以互動,但不像你想象的那樣。

將客戶端JavaScript視爲瀏覽器,並考慮服務器端代碼以及服務器。

然後他們會通過在彼此之間發送消息進行通信,最常用的交換消息的方法是JSON。

總而言之,客戶端代碼可以通過GETPOST請求或使用AJAX發送消息來與服務器進行通信。

服務器可以對這些消息作出響應,它也可以(這是在HTML 5標準中添加的)使用WebSockets將事件發送到客戶端。

2

他們不能交互(有點 - 下面會更詳細地解釋),因爲他們在兩個不同的地方運行。服務器端腳本 - 例如PHP,將在數據發送到用戶的PC之前在服務器上運行並完成運行。

客戶端腳本(例如Javascript)在用戶完成加載頁面數據時開始運行。

因此,簡而言之,PHP甚至在JS開始執行之前完成執行 - 因此它們不能真正進行交互。

如何使它們進行交互是通過一些技巧和JS內的調用來從服務器請求額外的數據 - 因此在那時它們仍將單獨運行,但是您可以讓它們通過在頁面中進行的其他調用。

使用這種方法,儘管它們完全獨立執行,但它們能夠通過數據交換信息(如JSON對象),並給人一種他們一起工作的印象,儘管他們正在這樣做完全不同的地方。

非技術打個比方

使用完全非IT的比喻,希望這將使其更清晰,可以說是服務器端腳本是一個陸軍基地。客戶端腳本是部署到另一個國家的單位。他們都在那裏完成一項特定的任務,但他們完全獨立工作。現在,JSON就像是他們之間的電話。部署的單位可以打電話給基地,請求進一步的指示,然後執行它們,但就基地而言,他們不知道發生了什麼,直到部署的單位再次打電話回家 - 這樣他們纔可以排序一起工作,但單獨做,而不知道對方在做什麼。

0

客戶端在計算機瀏覽器上運行。 服務器端在服務器上運行並生成發送給客戶端的代碼。

Ajax或jQuery可以直接從服務器獲取和發送數據。

1

最簡單的方法是使用AJAX,這是一種動態生成/查找內容的輕量級方法。

var ajax_call = function() { 
    $.ajax({ url: 'script.php?argument=value' }); // gets the php code you need. 
}; 

var interval = 1000 * 60 * X; // X = amount of minutes it will take till it executes. 

setInterval(ajax_call, interval); // sets the ajax_call function in motion 

讓我知道這是否工作。

1

簡單的例子:

var request = new XMLHttpRequest(); 
request.open('GET', 'http://example.com/yourfile.php?func=someFunc', false); 
request.send(); 

setInterval(request.responseText, 10000); 

或分配給VAR:

yourvar = request.responseText; 
setInterval(yourvar, 10000); 

然後在yourfile.php:

$func = $_GET['func']; 
//use $func to call func or do other stuff 
+0

我想可以使用AJAX。 –

+0

你爲什麼要做'setInterval(request.responseText,10000);'?很確定'responseText'不是一個函數。 –