【问题标题】:Conditionally load JavaScript file有条件地加载 JavaScript 文件
【发布时间】:2013-03-09 10:00:57
【问题描述】:

我需要一个 JS 语句来确定使用哪个 JavaScript 文件。

我有一个文件:

<script type="text/javascript" src="js/jquery_computer.js"></script>

但是当屏幕宽度小于 500px 时,我想加载另一个文件:

<script type="text/javascript" src="js/mobile_version.js"></script>

我什么都试过了,还是不行。

【问题讨论】:

  • 我无法理解你的问题
  • 他想使用某些js代码,直到屏幕宽度小于500px。
  • 我将它用于 css 我想对js做同样的事情
  • 但这只是css,你用什么“Javascript检查”?

标签: javascript html


【解决方案1】:

您必须自己在 JS 中创建该标记。像这样的:

var head = document.getElementsByTagName('head')[0];
var js = document.createElement("script");

js.type = "text/javascript";

if (screen.width > 500)
{
    js.src = "js/jquery_computer.js";
}
else
{
    js.src = "js/mobile_version.js";
}

head.appendChild(js);

【讨论】:

  • 我喜欢这种方法。有时脚本将无法加载,因此这种轮询概念以查看您的脚本是否有用stackoverflow.com/questions/1130921/…
  • 请注意,在具有缩小浏览器窗口的桌面上使用 screen.width 时,它仍会为您提供设备宽度,而不是实际可用空间。根据场景,您可以使用内置的 window.matchMedia (参见我的回答)或保持 screen.width
【解决方案2】:

如果您希望 异步 加载脚本,这里的其他答案就是这样做的。

如果您希望它与页面加载同步加载,这是document.write 剩下的极少数有效用例之一:

<script>
(function() { // Scoping function to avoid globals
    var src = /*you want the main version*/ ? "jquery_computer.js" : "mobile_version.js";
    document.write('<script src="js/' + src + '"><\/script>');
})();
</script>

(我删除了type,因为 JavaScript 是默认设置,指定它没有用。)

【讨论】:

  • 完美适用于解决 Microsoft 的“兼容性解决方案”所需的 if (typeof Promise === 'function') {/*load a script */} 用例。
【解决方案3】:

也许您可以使用matchMedia.js 并可以使用jQuery.getScript 加载脚本

$(function(){
    if (matchMedia('only screen and (max-width: 500px)').matches) {
        $.getScript(...);
    }
});

【讨论】:

  • 我更喜欢不依赖 jQuery 的解决方案。我目前正在使用 YepNope (yepnopejs.com),但考虑到该库已被作者弃用,我想用另一种解决方案替换它。
【解决方案4】:

最好使用内置的 matchMedia API。

var script = document.createElement('script');
script.type='text/javascript';

if(window.matchMedia("(min-width:500px)").matches) {
  script.src = 'js/jquery.slitslider.js';      
}else{
  script.src = 'js/mobile_version.js';      
}

document.getElementsByTagName('head')[0].appendChild(script);

缺点是IE不支持

【讨论】:

    【解决方案5】:

    你不需要 jQuery,在 DOM 中动态创建 &lt;script&gt; 标签就足够了:

    var head = document.getElementsByTagName('head')[0];
    var script = document.createElement('script');
    
    script.type = 'text/javascript';
    
    if (<screen-width less than 500>)
        script.src = "js/mobile_version.js";
    else
        script.src = "js/jquery_computer.js";
    
    head.appendChild(script);
    

    【讨论】:

      【解决方案6】:
      $(function(){
          var width = $(document).width(),
              mobile = 500;
      
          if (width > mobile) {
              $('head').append('<script class="desktop" type="text/javascript" src="js/jquery_computer.js"></script>');
              $('head').find('.mobile').remove();
          } 
          else
          {
              $('head').append('<script class="mobile" type="text/javascript" src="js/mobile_version.js"></script>');
              $('head').find('.desktop').remove();
          }
      });
      

      仅使用 if else 来检测条件并在脚本元素上使用类 可能有帮助

      【讨论】:

      • 使用&lt;script class="mobile" .... /&gt; 而不是&lt;script class="mobile" ....&gt;&lt;/script&gt; 否则你会得到unterminated string error
      【解决方案7】:

      如果你愿意,可以使用异步 import()

      import(condition ? 'js/desktop_version.js' : 'js/mobile_version.js')
      

      在带有&lt;script type="module"&gt; 的脚本标记中或在从常规&lt;script&gt; 加载的带有import() 的模块中,您也可以在最新(实验性)浏览器中使用顶级等待

      <script type="module">
        await import(condition ? 'js/desktop_version.js' : 'js/mobile_version.js')      
      </script>
      

      但它不适用于每个脚本。

      • 一个常见的原因是那些添加闭包的 UMD 模块捆绑器
        (function(global){...}(this)) 因为 this 在模块中未定义。
      • 第三方脚本需要启用 CORS 才能加载
      • 在 IE 中不起作用,但无论如何它已经死了
      • 见其他known differences

      【讨论】:

        【解决方案8】:

        你可以在 jQuery 中使用$.getScript

        see here 了解详情

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 2018-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        相关资源
        最近更新 更多