2014-09-20 99 views
2

我正在運行一個基於Web的JavaScript客戶端發送AJAX請求的node.js後端。基於共享桌面和基於Web的Javascript REST/Ajax

現在,我想使用純Javascript,即Google的V8做一個小型桌面版的JavaScript客戶端。

在這種情況下,我怎麼能夠啓用對桌面版本的AJAX支持,因爲沒有窗口/文檔對象?在一個完美的世界中,Web和桌面版本將共享相同的代碼?

或者我是否需要在js代碼之外編寫AJAX或REST API,即本地代碼並從js中調用它?

+0

所有你需要做的就是做一個簡單的HTTP請求。 – Brad 2014-09-20 02:39:47

+0

如何?據我所知,任何當前的ECMAScript實現都不支持XMLHttpRequest。 – MarkusM 2014-09-20 03:00:01

+0

這不是,爲什麼它應該是?進行HTTP請求是該框架的一部分,而不是該語言的一部分。這聽起來像你正在V8之上構建自己的框架。我不會這麼做......你可以使用類似Node.js的東西(就像你已經在你的服務器上使用過的那樣),它給你提供了大量的框架。你在最後一個問題中總結了它......是的,你需要用本地代碼編寫這個代碼,然後從你的JS中調用本地代碼。或者,使用現有的框架。 – Brad 2014-09-20 13:47:44

回答

0

正如Brad所說,目前沒有辦法從ECMAScript非web實現發出http請求,即使在http://www.w3.org/TR/XMLHttpRequest/有工作草案也將XMLHttpRequest集成到這些實現中(我猜通過外部綁定)。

我所做的是建立一個全球性的功能,在網頁版這樣實現:

function SendBackendRequest(url, parameters, func) 
{ 
    var request=new ajaxRequest(); 

    request.onreadystatechange=function() { 
     if (request.readyState == 4) { 
      if (request.status == 200 || window.location.href.indexOf("http") ==-1) { 

       func.call(this, request.responseText); 
      } else { 
       func.call(this, ""); 
      } 
     } 
    } 

    request.open("POST", "http://localhost" + url, true); 
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    request.send(parameters); 
}; 

ajaxRequest=function() 
{ 
    var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; 

    if (window.ActiveXObject) { 
     // --- IE 
     for (var i=0; i<activexmodes.length; i++) { 
      try { 
       return new ActiveXObject(activexmodes[i]) 
      } 

      catch(e) { 
       //suppress error 
      } 
     } 
    } else 
    { 
     if (window.XMLHttpRequest) // --- Mozilla, Safari etc 
      return new XMLHttpRequest(); 
     else return false; 
    } 
}; 

在桌面端我只是實現SendBackendRequest(),以及和在我的客戶端代碼可以使用與後端進行通信的代碼相同。