Tôi không chắc chắn nơi tôi rơi vào phía khách hàng so với cuộc tranh luận phía máy chủ. Điều phổ biến để làm những ngày này dường như là để xử lý mọi thứ ở phía khách hàng. Có lẽ một số kết hợp của hai là tốt nhất. Chỉ cần để thử nó hoàn toàn phía khách hàng, tôi quyết định quay lên một đối tượng mà phía khách hàng bao gồm không đồng bộ, nhưng lưu trữ các văn bản để sử dụng sau này. Có một hàm tải có chức năng gọi lại như một tham số được gọi là tải thành công. Ngoài ra còn có một chức năng để thiết lập html bên trong của một đối tượng cho văn bản được nạp. Đối tượng yêu cầu bao gồm jquery trước đó.
/**
* An object to manage client side includes.
*
* Loads of text are asynchronous but the result will be cached for later use.
*
* @param urlText - the url of the inlcude text
* @returns an Include object
*/
function Include(urlText)
{
var self;
var loaded;
var txt;
var url;
/**
* Sets the url for the include.
*
* Will unload a previously set include.
*
* @param url
*/
this.setUrl = setUrl;
function setUrl(url)
{
if (self.url != url)
{
unload();
}
self.url = url;
}
/**
*
* @returns the url
*/
this.getUrl = getUrl;
function getUrl()
{
return self.url;
}
/**
* Unloads the current url.
*/
this.unload = unload;
function unload()
{
self.txt = null;
self.loaded = false;
}
/**
* Loads the current url asynchronously
*
* @param fnPostLoad function to call on successful completion
*/
this.load = load;
function load(fnPostLoad)
{
if (self.loaded)
{
if (fnPostLoad != null)
{
fnPostLoad.call();
}
return;
}
$.ajax({
type : "GET",
dataType : "text",
url : self.url,
success : function(data) {
self.txt = data;
self.loaded = true;
if (fnPostLoad != null)
{
fnPostLoad.call();
}
},
error : function(){
alert("An error occurred accessing client side include located at: " + self.url);
}
});
};
/**
* Sets the inner html of a given object to be the text of this include.
*
* Will load the url if not loaded.
*
* @param obj
*/
this.setInnerHtmlOf = setInnerHtmlOf;
function setInnerHtmlOf(obj)
{
load(function(){obj.html(self.txt);})
}
// initialize members
self = this; // must be done first
loaded = false;
txt = null;
setUrl(urlText);
}
Để sử dụng đối tượng này, bạn có thể làm điều gì đó như thế này:
var foo = new Include("foo.inc");
var bar = new Include("bar.inc");
foo.setInnerHtmlOf($('#treeMargin'));
bar.setInnerHtmlOf($('#mainMargin'));
Tôi đã không làm quá nhiều thử nghiệm, nhưng nó dường như làm việc khá độc đáo.
Nguồn
2012-11-19 17:27:37
+1 Tôi đồng ý hoàn toàn với điểm này và đã thêm nó làm báo trước cho câu trả lời của tôi. Cảm ơn. – lonesomeday