【问题标题】:Prevent jQuery.getScript adding ?_=timestamp防止 jQuery.getScript 添加 ?_=timestamp
【发布时间】:2017-08-01 13:48:28
【问题描述】:

如何防止jQuery.getScript在网址上添加?_=timestamp

源代码:

$.getScript('/js/ace/ace.js',function(res) {
   // do something
}); 

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    这似乎与$.getScript('/js/ace/ace.js',function...) 调用有关。

    您可以考虑将以下sn-p添加到尽可能高的位置:

    $.ajaxSetup({
        cache: true
    });  
    

    将缓存:true 放入您的 $.ajax() 不会影响 $.getScript('/js/ace/ace.js',function...)
    无论如何,这就是该屏幕截图中可见的内容。

    另一种方式,如jQueryByExample所述:

    (1) 在调用$.getScript 方法之前,您可以将ajax 请求的缓存设置为true,并在脚本加载后将其设置为false。

    //Code Starts
    //Set Cache to true.
    $.ajaxSetup({ cache: true });
    $.getScript(urlhere, function(){
        //call the function here....
        //Set cache to false.
        $.ajaxSetup({ cache: false });
    });
    //Code Ends
    

    (2) 你只需要添加一个boolean 参数,它将缓存属性设置为true 或false。这就是jQuery 的美妙之处,您可以按照自己的需要重新定义事物。

    //Code Starts
    $.getScript = function(url, callback, cache){
    $.ajax({
        type: "GET",
        url: url,
        success: callback,
        dataType: "script",
        cache: cache
        });
    };
    

    所以,现在你调用 $.getScript 之类的,(注意第三个参数)

    //Code Starts
    $.getScript('js/jsPlugin.js',function(){
       Demo(); //This function is placed in jsPlugin.js
    }, true);
    //Code Ends
    

    【讨论】:

    • @Kokizzu,检查另外几个解决方案
    • 啊等等,它有效,之前我把$.ajaxSetup误读为$.ajax
    • 抄袭:从jquerybyexample.net/2012/04/…复制,不注明出处
    • @Pekka웃,在不知道正确练习时回答了这个问题。编辑帖子..标记的话,这不是故意的!感谢您的通知。
    【解决方案2】:

    我用promise又做了一次,根据之前的回答,觉得这样更有趣。

    window.loadScripts = (scripts) =>  {
        return scripts.reduce((currentPromise, scriptUrl) => {
            return currentPromise.then(() => {
                return new Promise((resolve, reject) => {
                    var script = document.createElement('script');
                    script.async = true;
                    script.src = scriptUrl;
                    script.onload = () => resolve();
                    document.getElementsByTagName('head')[0].appendChild(script);
                });
            });
        }, Promise.resolve());
    };
    

    来玩吧

    var scripts = [
        "app/resources/scriptDoSomething.js",
        "app/resources/somethingElse.js"
    ];
    
    loadScripts(scripts).then(() => {
      alert('All scripts were loaded!');
    });
    

    【讨论】:

      【解决方案3】:

      没关系,我根据Caolan 的回答制作了自己的getScript

      H = H || {};
      
      // load a script and run a callback
      H.loadScript = function(src, callback) {
          var script = document.createElement('script');
          script.type = 'text/javascript';
          script.src = src;
          script.addEventListener('load', function (e) { H.ExecIfFunction(callback,e); }, false);
          var head = document.getElementsByTagName('head')[0];
          head.appendChild(script);
      };
      
      // sources is array, the load process is serial
      H.loadScripts = function(sources, callback) {
          var len = sources.length;
          var now = 0;
          var loadOne = function() {
              if(now < len) return H.loadScript(sources[now++],loadOne);
              if(now >= len) H.ExecIfFunction(callback);
          };
          loadOne();
      };
      

      使用示例:

      H.loadScripts(['/js/ace/ace.js','/js/ace/mode-json.js','/js/jquery-ace.js'],function(){
        // do something
      });
      

      这些函数不检查是否有任何脚本加载不成功。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多