让服务器返回一个JavaScript函数然后被调用的干净方法是什么?

时间:2010-06-10 19:01:19

标签: javascript ajax

我的应用程序被设计为一系列尚未编写的插件。这有很长一段时间的原因,但每次新的一年,业务逻辑都会有所不同,我们不知道它会是什么样的(想想TurboTax,如果有帮助的话)。插件由服务器和客户端组件组成。服务器组件处理业务逻辑并将数据持久保存到数据库表中,数据库表也将在以后创建。 JavaScript操纵DOM以供浏览器随后渲染。

每个插件都存在于一个单独的程序集中,因此它们不会干扰主应用程序,即我们不想重新编译主应用程序。简而言之,我正在寻找一种从Ajax get请求返回JavaScript函数到客户端的方法,并执行这些JavaScript函数(刚刚返回)。在Javascript中调用函数很容易。困难的部分是如何组织或结构,以便我不必处理维护问题。因此,使用StringBuilder结束使用JavaScript代码作为从字符串构建器对象调用toString()的结果是不可能的。

我想在正常编写JavaScript代码和为此动态目的编写Javascript代码之间没有区别。

另一种方法是在服务器端操作DOM,但我怀疑它在客户端使用jQuery会如此优雅。我对C#库开放,它支持像jQuery这样的可链接调用,它也可以操作DOM。

你有什么想法,或者问得太多,或者你是否太困惑了?

Edit1 :重点是避免重新编译,因此是插件架构。在程序的其他一些部分,我已经使用了动态加载Javascript文件的概念。这很好。当我向服务器发送Ajax请求时,我在这里看到的是程序中间的某个地方。

编辑2 :说明我的问题:

通常,您会看到以下代码。将Ajax请求发送到服务器,将JSON结果返回给客户端,然后客户端使用jQuery来操作DOM(在这种情况下创建标记并添加到容器中)。

var container = $('#some-existing-element-on-the-page');
$.ajax({
    type: 'get',
    url: someUrl,
    data: {'': ''},
    success: function(data) {                                                   
      var ul = $('<ul>').appendTo(container);

      var decoded = $.parseJSON(data);                
      $.each(decoded, function(i, e) {
         var li = $('<li>').text(e.FIELD1 + ',' + e.FIELD2 + ',' + e.FIELD3)
            .appendTo(ul);
      });                
    }        
});

以上非常简单。但是明年,服务器返回的内容完全不同,呈现的数据也会有所不同。在某种程度上,这就是我想要的:

var container = $('#some-existing-element-on-the-page');
$.ajax({
    type: 'get',
    url: someUrl,
    data: {'': ''},
    success: function(data) {                           
      var decoded = $.parseJSON(data); 
      var fx = decoded.fx;
      var data = decode.data;
      //fx is the dynamic function that create the DOM from the data and append to the existing container
      fx(container, data);                  
    }        
});

我不需要知道,此时会有什么数据,但将来我会,然后我可以相应地编写fx。

4 个答案:

答案 0 :(得分:1)

我怀疑你需要ajax来返回javascript,你可能每年都可以更改.js文件。

请注意,如果您的脚本运行跨域

,则需要对其进行签名

无论如何,你可能正在寻找EVAL,理论上黑客可以利用它来搞乱你的网站。它也会减慢速度,并使调试变得更加困难......

同样,您可能不需要异步加载JavaScript。如果逻辑每年都在变化,那就是改变.js文件。如果逻辑在浏览器仍在页面上时发生变化,则需要使用ajax加载它...这可能会导致编程命名空间出现问题。 (即,您在旧代码的实时命名空间中引入了新代码,并且版本不能很好地工作)。

答案 1 :(得分:0)

愚蠢的想法,但我可以建议您将一个href返回到外部JS文件并加载而不是返回实际的JS代码吗?

答案 2 :(得分:0)

听起来你已经决定了你的架构,你决心找到一种方法让它工作。但是,为什么不直接修改DOM,为什么不让插件返回相关的HTML并用输出更新容器的innerHTML?

答案 3 :(得分:0)

好吧,警察只是使用eval。 从服务器和eval发送函数作为字符串('myhopefullyuncompromisedjavascriptcode');

success: function(data) {  
var decoded = $.parseJSON(data); 
  var fx = eval(decoded.fx); 
  //where the eval string would contain "(function(params){...})"
  var data = decode.data;
  //fx is the dynamic function that creates the DOM from the data and append to the existing container
  fx(container, data);      

但替代方案并没有那么大。

你可以根据需要加载,但实际上,除了它被封装在.js中之外,它总是相同的。 如果有人能够从您的站点返回随机字符串化的js,或者能够在其他地方使用ajax调用点来加载任意js,那么他们已经能够加载他们自己的任意js。

另一方面,动态加载可以节省一些bw,因为你没有通过线路发送相同的字符串化函数并一次又一次地评估它,可以通过维护函数的客户端哈希来获得相同的好处虽然。

我的pov有点'meh'。