0

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

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

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

4

2 回答 2

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();
  }
}

(这显然是一个非常做作和过度简化的版本,但希望它能给你一个大致的想法。)

于 2013-11-13T13:08:17.650 回答
0

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

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

于 2013-11-13T12:54:34.263 回答