2014-09-20 101 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(),以及和在我的客户端代码可以使用与后端进行通信的代码相同。