【问题标题】:Avoid jQuery Mobile to force script/CSS reload using _=TIMESTAMP query string parameter避免 jQuery Mobile 使用 _=TIMESTAMP 查询字符串参数强制脚本/CSS 重新加载
【发布时间】:2011-03-05 07:12:29
【问题描述】:

据我所知,如果您想将 JavaScript 或 CSS 文件与通过 ajax 自动加载的特定页面一起加载,那么您必须将 CSS/JavaScript 引用放在 <div data-role="page"> 容器中。

例子:

<div data-role="page" data-theme="e">
  <script type="text/javascript" src="/js/jquery/plugins/plugins.js"></script>

一般来说,这很好用。但是,在此过程中,脚本 url 被修改了:

/js/some_sepcial_script.js becomes e.g. js/some_sepcial_script.js?_=1299308309681

1299308309681 是当前的 Unix 时间戳,它会随着每个请求而改变,从而防止缓存。我很确定这是预期的行为,但是如果你想让文件可缓存,有谁知道如何防止时间戳被附加到脚本/CSS url?

【问题讨论】:

    标签: javascript jquery jquery-mobile


    【解决方案1】:

    你试过了吗:?

    $.ajax ({
        // Disable caching of AJAX response */
        cache: false
    });
    

    它应该全局更改 ajax 请求。我只是不确定外部脚本。

    [编辑]

    这是jquery mobile 1.0a3涉及的源码:

    var all = $("<div></div>");
                    //workaround to allow scripts to execute when included in page divs
                    all.get(0).innerHTML = html;
                    to = all.find('[data-role="page"], [data-role="dialog"]').first();
    
                    //rewrite src and href attrs to use a base url
                    if( !$.support.dynamicBaseTag ){
                        var newPath = path.get( fileUrl );
                        to.find('[src],link[href]').each(function(){
                            var thisAttr = $(this).is('[href]') ? 'href' : 'src',
                                thisUrl = $(this).attr(thisAttr);
    
                            //if full path exists and is same, chop it - helps IE out
                            thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' );
    
                            if( !/^(\w+:|#|\/)/.test(thisUrl) ){
                                $(this).attr(thisAttr, newPath + thisUrl);
                            }
                        });
                    }
    

    那里没有添加缓存阻止参数。

    [编辑 2]

    我知道这超出了故障排除范围,但您是否尝试过动态加载 js,如下所述:http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml

    (我知道可以通过 jQuery 完成,但出于测试目的,我试图避免使用 jQuery)

    【讨论】:

    • 感谢您的建议。不幸的是,在这种情况下它似乎不起作用。还有其他想法吗?
    • 源代码中似乎没有添加缓存阻止参数,我似乎无法在测试服务器上重现该问题。您使用的是什么版本,是否有可用的实时示例?
    • 是的,我也看过这部分。那里一切都很好。也许这个问题与bugs.jqueryui.com/ticket/3677有关?
    • 不知道,好像没有关系。如果 jQuery mobile 没有添加它并且它在技术上不是 jQuery 将阻止缓存的 ajax 请求,那么它必须来自另一个插件或来自您的直接输出。
    • 1.是CMS吗? 2. 您是否从动态源或输出源(检查元素与查看源)获取 ?_=1299308309681 3. 是否安装了任何缓存或加载相关插件?
    【解决方案2】:

    如果我包含 jQuery 1.4.3 而不是 1.5,一切正常。这对我来说是一个足够的解决方案。再次感谢您的支持。

    【讨论】:

    • 使用 JQM 是正确的做法 - 使用其他 jquery 版本进行测试。降级有时也很有帮助。 1.4.3 根本不应该与 alpha3 一起使用 - 它缺乏对一些次要功能的支持。
    • 是的,正如 naugtur 所说,不幸的是,一些 jQuery Mobile 功能似乎只适用于 jQuery 1.5,例如固定导航栏或数据图标。也许有人有解决“?_=TIMESTAMP”问题的方法?
    • 这个加载的东西对于那些无法正确组织应用程序的人来说只是一个技巧。我根本不建议使用它。只需创建一个对pageceratepageshow 做出反应的函数,并验证data-url 是否表示这是您的页面。
    【解决方案3】:

    尝试运行:

    $.ajaxPrefilter("script", function (s) {
        if (s.cache === undefined) {
            s.cache = true;
        }
    });
    

    它会改变这种行为吗?

    【讨论】:

    • 您好,感谢您提供代码 sn-p。我试过了,但行为没有改变。时间戳(以毫秒为单位)仍然附加。
    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多