Javascript:如何最好地处理平台特定设置

时间:2013-11-13 12:49:15

标签: javascript php ajax cross-platform

我正在努力在不同的基于PHP的CMS(Wordpress,Joomla等)之间移植应用程序。我已经定义了一些类,这些类允许我的代码在每个平台上都未经修改地运行(这部分工作正常)。给我带来问题的一个部分是这些平台之间存在一些javascript差异;例如,调用ajax请求的URL对于每个平台都是不同的。

问题:在Javascript级别处理此类平台差异的最佳方法是什么,尤其是考虑到Javascript不知道它运行的是哪个CMS平台?我可以为每个平台创建一个不同版本的ajax.js,但这会导致不必要的代码重复,这将使未来的开发和发展成为可能。维护更加困难,特别是因为只有大约20个ajax URL实例会发生变化。

那么:有没有办法加载特定于平台的JS文件,例如,定义Ajax URL并将该变量保存到我的主ajax.js文件中?这将解决我的问题,但我不确定这是否可能在JS中。有没有其他好的选择来参数化这些问题,以便这样的情况可以优雅地处理?

2 个答案:

答案 0 :(得分:1)

我通常使用某种适配器对象来处理这个问题。即定义您的跨平台代码可以调用的接口,然后注入该接口的特定于平台的实现。所以,例如......

<script src="adapter.php"></script>
<script src="app.js"></script>

app.js是所有应用程序共享的JS代码。举一个简短的例子,它可能是这样的:

var App = {
  checkin: function() {
    Adapter.send('GET', Adapter.CHECKIN_URL + '?user=' + user)
  }
}

同时,adapter.php(或adapter.py或adapter.rb或您要运行的任何服务器端代码)端点是服务器端代码,用于决定要发送回特定于平台的状态。例如,您可以将其重定向到这些脚本中的一个或另一个:

适配器-New.js:

var Adapter = {
  CHECKIN_URL: '/rest/checkin',

  send: function(method, url) {
    // Maybe we have jquery available in this case
    $.ajax({type: method, url: url});
  }
}

适配器-Old.js:

var Adapter = {
  CHECKIN_URL: '/old_api_checkin',

  send: function(method, url) {
    // And pretend there's no jquery in this case
    var xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.send();
  }
}

(这显然是一个非常人为的,过度简化的版本,但希望它能为您提供一般的想法。)

答案 1 :(得分:0)

嗯,如果我参与这个项目,我会在包装器类中包含代码,该代码类充当动态JS文件,它包含在主要的ajax.js页面之前。该文件将包含与必要的URL等相关联的变量声明。

我认为如果需要的不仅仅是简单的变量替换,它可能会变得非常混乱。