2010-06-10 26 views
5

Ứng dụng của tôi được cấu trúc như một loạt các trình cắm thêm chưa được viết. Có một lý do dài cho điều này, nhưng với mỗi năm mới, logic kinh doanh sẽ khác nhau và chúng tôi không biết nó sẽ như thế nào (Hãy suy nghĩ của TurboTax nếu điều đó giúp). Các trình cắm thêm bao gồm cả các thành phần máy chủ và máy khách. Các thành phần máy chủ giao dịch với logic nghiệp vụ và lưu giữ dữ liệu vào các bảng cơ sở dữ liệu sẽ được tạo ra sau đó. JavaScript điều khiển DOM cho các trình duyệt để hiển thị sau đó.Cách sạch sẽ để máy chủ trả về một hàm JavaScript mà sau đó sẽ được gọi ra là gì?

Mỗi plugin sống trong một hội đồng riêng biệt, để chúng không làm phiền ứng dụng chính, nghĩa là chúng tôi không muốn biên dịch lại ứng dụng chính. Câu chuyện dài ngắn, tôi đang tìm kiếm một cách để trả về các hàm JavaScript cho máy khách từ một yêu cầu nhận Ajax và thực thi các hàm JavaScript này (chỉ được trả về). Gọi một hàm trong Javascript thật dễ dàng. Phần khó khăn là làm thế nào để tổ chức hoặc cấu trúc để tôi sẽ không phải đối phó với vấn đề bảo trì. Vì vậy, concat sử dụng StringBuilder để kết thúc với mã JavaScript là kết quả của việc gọi toString() từ đối tượng xây dựng chuỗi là không có câu hỏi.

Tôi muốn không có sự khác biệt giữa việc viết mã JavaScript bình thường và viết mã Javascript cho mục đích động này.

Cách khác là thao tác DOM ở phía máy chủ, nhưng tôi nghi ngờ rằng nó sẽ thanh lịch như sử dụng jQuery ở phía máy khách. Tôi mở cho một thư viện C# hỗ trợ các cuộc gọi có dây chuyền như jQuery cũng thao túng DOM.

Bạn có bất kỳ ý tưởng nào hoặc là quá nhiều để hỏi hoặc bạn có quá bối rối không?

Chỉnh sửa1: Vấn đề là tránh biên dịch lại, do đó kiến ​​trúc trình cắm thêm. Trong một số phần khác của chương trình, tôi đã sử dụng khái niệm tải tệp Javascript động. Điều đó hoạt động tốt. Những gì tôi đang tìm ở đây là ở đâu đó ở giữa chương trình khi một yêu cầu Ajax được gửi đến máy chủ.

Chỉnh sửa 2: Để minh họa cho câu hỏi của tôi:

Thông thường, bạn sẽ thấy đoạn mã sau. Một yêu cầu Ajax được gửi đến máy chủ, kết quả JSON được trả về cho máy khách, sau đó sử dụng jQuery để thao tác DOM (tạo thẻ và thêm vào thùng chứa trong trường hợp này).

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

Ở trên cực kỳ đơn giản. Nhưng vào năm tới, những gì máy chủ trả về là hoàn toàn khác nhau và cách dữ liệu được hiển thị cũng sẽ khác nhau. Nói cách khác, đây là những gì tôi muốn:

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

Tôi không cần biết, vào thời điểm này những dữ liệu sẽ như thế nào, nhưng trong tương lai tôi sẽ, và sau đó tôi có thể viết fx cho phù hợp.

Trả lời

0

Ý tưởng ngu ngốc, nhưng tôi có thể đề nghị bạn trả lại một href cho tệp JS bên ngoài và tải thay vì trả lại mã JS thực tế không?

+0

Vui lòng xem các chỉnh sửa mới nếu chúng có thể làm cho câu hỏi rõ ràng hơn cho bạn. –

1

Tôi nghi ngờ bạn sẽ cần ajax để trả lại javascript và bạn có thể chỉ cần thay đổi tệp .js mỗi năm.

Lưu ý rằng kịch bản của bạn sẽ cần phải đăng nhập nếu họ chạy chéo miền

Dù sao, có lẽ bạn đang tìm kiếm EVAL, có thể trong lý thuyết được sử dụng bởi tin tặc để gây rối với trang web của bạn.Nó cũng sẽ làm chậm mọi thứ xuống và làm cho mọi việc khó khăn hơn để gỡ lỗi ...

Một lần nữa, có thể bạn không cần tải javascript không đồng bộ. Nếu logic thay đổi hàng năm, đó chỉ là thay đổi các tệp .js. Bạn sẽ cần phải tải nó với ajax nếu logic sẽ thay đổi trong khi trình duyệt vẫn còn trên trang ... có thể gây ra một vấn đề trong các không gian tên lập trình. (ví dụ, bạn giới thiệu mã mới trong không gian tên trực tiếp của mã cũ và các phiên bản không hoạt động tốt).

+0

@ user257493: tên miền chéo không phải là vấn đề. eval cũng không phải là vấn đề. Chúng tôi không thay đổi tập tin js mỗi năm, chúng tôi sẽ phải thêm những cái mới. Chúng tôi vẫn phải kết xuất dữ liệu từ nhiều năm trước đây. Toàn bộ vấn đề là để tránh biên dịch lại, do đó lý do cho các plugin. –

+0

JS không được biên soạn. Bạn có thể minifi nó nhưng thats nó. Bạn có muốn thực hiện việc này không? http://www.webdeveloper.com/forum/showthread.php?t=129579 – Incognito

+0

Chỉ cần thấy trực tuyến này ... http://experimentgarden.com/loading-javascript-functions-via-ajax Bạn có thể tìm thấy nó liên quan đến câu hỏi của bạn. – Incognito

0

Có vẻ như bạn đã quyết định về kiến ​​trúc của mình và bạn quyết tâm tìm cách làm cho nó hoạt động. Nhưng thay vì sửa đổi DOM trực tiếp, tại sao không chỉ có các trình cắm thêm trả lại HTML có liên quan và cập nhật innerHTML của vùng chứa với đầu ra của chúng?

+0

đánh giá cao câu trả lời của bạn. Tôi nghĩ rằng các nỗ lực để xây dựng các html ở phía máy chủ (và cập nhật innerHTML trên máy khách như bạn nói) sẽ làm cho mã ít hơn rất nhiều bảo trì trong thời gian dài. Nó sẽ là một StringBuilder dài với nhiều Append calls() ở mức tốt nhất. Bên trong mỗi cuộc gọi Nối tiếp này, sẽ có các dấu ngoặc mở (<) và đóng (>) ở khắp mọi nơi. –

+0

@Khnle: Bạn cũng có thể sử dụng phía máy chủ HtmlTextWriter. Đây có xu hướng rất tiết, nhưng ít nhất bạn không cần phải nhìn vào những dấu ngoặc đơn khó chịu. – Ishmael

0

Vâng, quá trình cảnh báo chỉ đơn giản là sử dụng eval. Gửi chức năng dưới dạng chuỗi từ máy chủ và 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);  

Các lựa chọn thay thế không thực sự lớn hơn nhiều.

Bạn có thể tải theo yêu cầu nhưng, thực sự, số tiền này tương tự như vậy ngoại trừ việc nó được đóng gói trong một .js.
Nếu ai đó có khả năng trả lại js được xâu ngẫu nhiên từ trang web của bạn hoặc có thể thực hiện điểm gọi ajax của bạn ở nơi khác để tải js tùy ý, thì họ đã có thể tải js tùy ý của riêng họ. Mặt khác, tải động có thể giúp bạn tiết kiệm một số bw, trong đó bạn không gửi cùng một chức năng được xâu chuỗi trên dây và đánh giá nó nhiều lần, cùng một lợi ích có thể bắt nguồn từ việc duy trì băm khách hàng chức năng mặc dù.

một chút 'meh' từ pov của tôi.

Các vấn đề liên quan