【问题标题】:Call external JS file based on "media screen" value根据“媒体屏幕”值调用外部 JS 文件
【发布时间】:2013-03-27 05:33:27
【问题描述】:

我正在尝试,但它不起作用:

<html>
<head>
<script src="js/menu-collapser.js" type="text/javascript" media="media screen and (max-width: 599px)"></script>
</head>
...
</html>

//menu-collapser.js :

jQuery(document).ready(function($){
    $('.main-navigation li ul').hide();
    $('.main-navigation li').has('ul').click(function() {
        $(this).children().toggle();
    });
});

您知道如何以正确的方式做到这一点吗?如果直接在带有标签的标题中使用该脚本,则该脚本可以工作。

【问题讨论】:

    标签: jquery html external media-queries


    【解决方案1】:

    您不能直接使用 Javascript &lt;script&gt; 标记来执行此操作。媒体查询用于链接的 CSS 文件或内联 CSS 样式。一个基本的例子:

    <link rel="stylesheet" media="screen and (min-width: 900px)" href="desktop.css"/>
    <link rel="stylesheet" media="screen and (min-width: 571px)" href="tablet.css"/>
    <link rel="stylesheet" media="screen and (max-width: 570px)" href="mobile.css"/>
    

    或直接在您的样式表中:

    @media screen and (max-width: 599px) {
      #mobile {
         display: block;
      }
    }
    

    但是,您可以使用外部资产加载器/媒体查询库来执行此操作(require.jsmodernizr.jsenquire.js 等),在这种情况下,我使用enquire.js 设置示例,因为我认为它非常有效并且默认不需要jQuery:

    完整示例

    1) 包含 enquire.js(可用here):

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

    2)创建加载函数——加载JS文件:

    <script type="text/javascript">
    
    // This loads JS files in the head element
        function loadJS(url)
        {
            // adding the script tag to the head
           var head = document.getElementsByTagName('head')[0];
           var script = document.createElement('script');
           script.type = 'text/javascript';
           script.src = url;
    
           // fire the loading
           head.appendChild(script);
        }
    
    </script>
    

    3) 触发 enquire.js 并监听媒体查询更改(加载和调整大小):

    <script type="text/javascript">
    
        enquire.register("screen and (max-width: 599px)", {
            match : function() {
                // Load a mobile JS file
                loadJS('mobile.js');
            }
        }).listen();
    
    
        enquire.register("screen and (min-width: 600px) and (max-width: 899px)", {
            match : function() {
                // Load a tablet JS file
                loadJS('tablet.js');
                //console.log('tablet loaded');
            }
        }).listen();
    
    
        enquire.register("screen and (min-width: 900px)", {
            match : function() {
                // Load a desktop JS file
                loadJS('desktop.js');
                //console.log('desktop loaded');
            }
        }).listen();
    </script>
    


    把它们放在一起

    使用从外部文件加载 enquire.js 的简单 HTML 页面:

    <html>
    <head>
    
    <script type="text/javascript" src="/enquire.js"></script>
    
    <script type="text/javascript">
    
    // This loads JS files in the head element
        function loadJS(url)
        {
            // adding the script tag to the head
           var head = document.getElementsByTagName('head')[0];
           var script = document.createElement('script');
           script.type = 'text/javascript';
           script.src = url;
    
           // fire the loading
           head.appendChild(script);
        }
    
    </script>
    
    <style>
    
        body {
          font-family: arial;
        }
        h1 {
          font-size: 50pt;
        }
    
        #mobile {
          display: none;
        }
        #tablet {
          display: none;
        }
        #desktop {
          display: none;
        }
    
        @media screen and (max-width: 599px) {
            #mobile {
                display: block;
            }
        }
    
        @media screen and (min-width: 600px) and (max-width: 899px) {
            #tablet {
                display: block;
            }
        }
    
        @media screen and (min-width: 900px) {
            #desktop {
                display: block;
            }
        }   
    
    </style>
    
    </head>
    <body>
    
        <div id="desktop">
            <h1>Desktop</h1>
        </div>
    
        <div id="tablet">
            <h1>Tablet</h1>
        </div>
    
        <div id="mobile">
            <h1>Mobile</h1>
        </div>
    
        <script type="text/javascript">
    
            enquire.register("screen and (max-width: 599px)", {
                match : function() {
                    // Load a JS file
                    loadJS('mobile.js');
                }
            }).listen();
    
    
            enquire.register("screen and (min-width: 600px) and (max-width: 899px)", {
                match : function() {
                    loadJS('tablet.js');
                    //console.log('tablet loaded');
                }
            }).listen();
    
    
            enquire.register("screen and (min-width: 900px)", {
                match : function() {
                    loadJS('desktop.js');
                    //console.log('desktop loaded');
                }
            }).listen();
    
        </script>
    </body>
    </html>
    

    除了加载 JS 文件之外,您还可以创建一个 CSS 加载器,它会以相同的方式(有条件地)工作,但这违背了在 CSS 中使用 @media 的目的。 enquire.js 的用法说明值得一读,因为它可以做的比我在这里说明的要多得多。

    警告: 上面没有使用 jQuery,但您可以利用它提供的一些功能;例如加载脚本 - 或执行您需要的其他功能。

    【讨论】:

    • 您好,感谢您的完整解释。我正在尝试遵循您的建议,但这对我来说并不容易。我是否必须下载 require.js/modernizr.js,将它们包含在头部,然后在正文中使用您的第二个代码?因为它似乎不起作用......
    • 你太棒了,谢谢你的帮助。不幸的是我无法让它工作! :( 如果您愿意看一下我的代码,我已将其简化并粘贴在此处:pastebin.com/HkviLP9H
    • @l736k 您的代码似乎没有任何问题 - 它可以在 Chrome/Safari 中运行,但是menu-collapser.js 做了什么!?
    • menù collapser 包含我在最初的问题中发布的 jQuery 脚本......它应该折叠主题移动版本中menù 的子页面。可能还有其他一些问题,因为我使用的 jQuery 代码如果直接输入到正文中可以工作,但现在不再工作了......我不明白为什么!如果你想有更好的想法,你可以在这个 URL 上看到实时站点(尝试调整浏览器的大小,你会看到在 599px 下发生变化的菜单):is.gd/6ju6a1
    • 实际上,我让它恢复工作,但它忽略了屏幕尺寸......如果浏览器>599px,脚本也可以工作......所以在全宽版本中,菜单有问题......
    【解决方案2】:

    media 不是&lt;script&gt; 的有效属性,请检查here

    因此,您应该手动检测媒体类型,而不是动态加载脚本。

    There is a plug-in for css media detection in javascript,你可以用。

    <script type="text/javascript" src="js/mediatypechecker.js"></script>
    
    $(function() {
        if(IsMediaType('screen') > 0 && parseInt(screen.width) < 599) {
            $.getSscript("js/menu-collapser.js");
        }
    });
    

    【讨论】:

      【解决方案3】:

      为什么不只是有条件地加载脚本呢?

      (function() {
          if( window.innerWidth > 600 ) {
              var theScript = document.createElement('script');
                  theScript.type = 'text/javascript';
                  theScript.src = 'js/menu-collapser.js';
      
              var s = document.getElementsByTagName('script')[0];
                  s.parentNode.insertBefore(theScript, s);
          }
      })();
      

      或者更好的是,只在 window.innerWidth > 600 时执行代码?无论如何,您可以使用很多解决方案。

      【讨论】:

        猜你喜欢
        • 2012-09-14
        • 2021-11-09
        • 1970-01-01
        • 2014-04-28
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        相关资源
        最近更新 更多