Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 客户端包括vs服务器端包括?_Javascript_Jquery_Html_Include - Fatal编程技术网

Javascript 客户端包括vs服务器端包括?

Javascript 客户端包括vs服务器端包括?,javascript,jquery,html,include,Javascript,Jquery,Html,Include,我们有一个包含多个div块的HTML页面。我们希望将这些div分离成多个文件,然后将它们组合成一个文件——最好使用服务器端包含(在我们的例子中是JSP)还是客户端包含 请注意,我们使用的是JQuery—不确定JQuery是否有一种聪明的方法来进行包含。我想说的是服务器端。如果jQuery没有加载,或者用户已经关闭了javascript,那么性能如何?在服务器上进行这种处理会大大提高性能。额外HTTP请求的I/O和处理方面的成本——如果您对客户端进行排序,这是必要的——将是巨大的。在服务器上包含附

我们有一个包含多个
div
块的HTML页面。我们希望将这些div分离成多个文件,然后将它们组合成一个文件——最好使用服务器端包含(在我们的例子中是JSP)还是客户端包含


请注意,我们使用的是JQuery—不确定JQuery是否有一种聪明的方法来进行包含。

我想说的是服务器端。如果jQuery没有加载,或者用户已经关闭了javascript,那么性能如何?

在服务器上进行这种处理会大大提高性能。额外HTTP请求的I/O和处理方面的成本——如果您对客户端进行排序,这是必要的——将是巨大的。在服务器上包含附加内容将导致用户延迟毫秒;在客户机上这样做需要更多数量级的时间


EditPer,这假定可以立即生成正在放在一起的内容(例如,通过包含来自服务器的平面文件)。如果需要花费时间(例如,冗长的数据库调用),则可以加载页面的主要部分,并使用jQuery添加额外的内容。最好的解决方案,一如既往,取决于您的具体情况。

我必须同意其他人的看法,服务器端是最好的地方,但有一点需要注意

如果您的分区包含需要一段时间才能加载的内容,比如说,每个分区都有来自单独web服务调用的内容,那么让JQuery使用get为您加载这些内容可能是有益的,因为可以在异步加载分区的同时加载页面的其余部分


除此之外,是的。。。服务器端

实际上,客户端包含有一个非常有用的属性:客户端浏览器有缓存!如果您的某些内容不希望经常更改,并且每个客户端都希望经常加载页面的某些片段,那么客户端包含是一个好主意,因为可以利用客户端的浏览器缓存


其思想是,您的整个页面包含一组占位符div,其中客户端包含的内容将被删除。HTML片段是通过AJAX调用加载的。如果片段的HTTP响应头指定了过期和/或缓存控制,那么当您的客户端访问下一页时,AJAX请求将从缓存中提供,而不是实际发送到服务器。

我不确定我在客户端与服务器端的争论中处于什么位置。现在流行的做法似乎是在客户端处理事情。也许两者的某种结合是最好的。为了在客户端进行全面的尝试,我决定启动一个对象,该对象没有在客户端异步包含,但缓存了文本供以后使用。有一个加载函数,它将回调函数作为成功加载时调用的参数。还有一个函数可以将对象的内部html设置为加载的文本。该对象需要jquery的上一个include

/**
 * 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);    
}
要使用此对象,可以执行以下操作:

var foo = new Include("foo.inc");
var bar = new Include("bar.inc");
foo.setInnerHtmlOf($('#treeMargin'));
bar.setInnerHtmlOf($('#mainMargin'));

我没有做太多的测试,但它似乎工作得很好

+1我完全同意这一点,并在我的回答中添加了这一点作为警告。谢谢。你能让浏览器兑现HTML文件/片段吗?如果是这样的话,包含主导航(如果整个站点都一样)听起来可能不错,对吧?如果您的片段是通过单独的HTTP请求获得的,那么是的。浏览器可以缓存整个HTTP响应(前提是正确指定了响应的过期时间和缓存控制头),但不会缓存部分响应。这就是我提到AJAX调用的原因。对AJAX调用的响应包含要在浏览器上缓存的HTML片段。