我正在努力在不同的基于PHP的CMS(Wordpress,Joomla等)之间移植应用程序。我已经定义了一些类,这些类允许我的代码在每个平台上都未经修改地运行(这部分工作正常)。给我带来问题的一个部分是这些平台之间存在一些javascript差异;例如,调用ajax请求的URL对于每个平台都是不同的。
问题:在Javascript级别处理此类平台差异的最佳方法是什么,尤其是考虑到Javascript不知道它运行的是哪个CMS平台?我可以为每个平台创建一个不同版本的ajax.js,但这会导致不必要的代码重复,这将使未来的开发和发展成为可能。维护更加困难,特别是因为只有大约20个ajax URL实例会发生变化。
那么:有没有办法加载特定于平台的JS文件,例如,定义Ajax URL并将该变量保存到我的主ajax.js文件中?这将解决我的问题,但我不确定这是否可能在JS中。有没有其他好的选择来参数化这些问题,以便这样的情况可以优雅地处理?
答案 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等相关联的变量声明。
我认为如果需要的不仅仅是简单的变量替换,它可能会变得非常混乱。