簡體   English   中英

讓服務器返回一個JavaScript函數然后被調用的干凈方法是什么?

[英]What's a clean way to have the server return a JavaScript function which would then be invoked?

我的應用程序被設計為一系列尚未編寫的插件。 這有很長一段時間的原因,但每次新的一年,業務邏輯都會有所不同,我們不知道它會是什么樣的(想想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。

我懷疑你需要ajax來返回javascript,你可能只是每年更改.js文件。

請注意,如果您的腳本跨域運行,則需要對其進行簽名

無論如何,你可能正在尋找EVAL,理論上黑客可以利用它來搞亂你的網站。 它也會減慢速度,使調試變得更難......

同樣,您可能不需要異步加載JavaScript。 如果邏輯每年都在變化,那就是改變.js文件。 如果邏輯在瀏覽器仍在頁面上時發生變化,則需要使用ajax加載它...這可能會導致編程命名空間出現問題。 (即,您在舊代碼的實時命名空間中引入了新代碼,並且版本不能很好地工作)。

愚蠢的想法,但我可以建議您返回一個href到外部JS文件並加載而不是返回實際的JS代碼?

聽起來你已經決定了你的架構,你決心找到一種方法讓它工作。 但是,為什么不直接修改DOM,為什么不讓插件返回相關的HTML並用它們的輸出更新容器的innerHTML?

好吧,警察只是使用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'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM