【问题标题】:Load jQuery script in desktop browser, but not mobile [duplicate]在桌面浏览器中加载 jQuery 脚本,但不是移动 [重复]
【发布时间】:2013-03-21 21:38:48
【问题描述】:

我想在桌面浏览器而不是移动浏览器中加载特定的 jQuery 脚本/函数。目前,该脚本在移动浏览器上运行速度很慢,但在桌面浏览器上运行良好。

有问题的功能是一个平滑滚动插件,当用户点击一个链接时,页面平滑滚动到同一页面上的锚点。它没有必要在移动浏览器上流畅滚动——它太慢了,而且经常不起作用。

我需要在下面的代码中添加什么以确保它在桌面浏览器中仍能正常执行,但不能在移动设备(尤其是 iPad/iPhone/iPod)中执行?

  <script>!window.jQuery && document.write(unescape('%3Cscript src="js/lib/jquery/jquery.js"%3E%3C/script%3E'));</script>    
<script src="js/css_browser_selector.js"></script>
<script src="js/src/jquery.smooth-scroll.js">    
</script>
<script src="js/lib/jquery.ba-bbq.js"></script>
<script>
$(document).ready(function() {
  $('a[href*="#"]').live('click', function() {
    if ( this.hash ) {
      $.bbq.pushState( '#/' + this.hash.slice(1) );
      return false;
    }
  });

  $(window).bind('hashchange', function(event) {
    var tgt = location.hash.replace(/^#\/?/,'');
    if ( document.getElementById(tgt) ) {
      $.smoothScroll({scrollTarget: '#' + tgt});
    }
  });

    $(window).trigger('hashchange');
});
 </script>

【问题讨论】:

标签: jquery


【解决方案1】:

您可以尝试检索用户代理并使用该信息来决定是否要包含平滑滚动脚本。另一种解决方案是检查浏览器宽度,然后决定是否要包含脚本。

<script>
(function ($) {
   if(is_touch_device()) {
      $.when(
         $.getScript( "/mypath/myscript1.js" ),
         $.getScript( "/mypath/myscript2.js" ),
         $.getScript( "/mypath/myscript3.js" ),
         $.Deferred(function( deferred ){
            $( deferred.resolve );
         })
      ).done(function(){
          //place your code here, the scripts are all loaded
      });
   }
})(jQuery);
</script>

使用 when() 需要 jQuery 1.5 或更高版本,getScript() 是在 1.0 中添加的。

EDIT 正如 travis 所说,您还可以查找触摸事件。 在这种情况下,您应该使用:

function is_touch_device() {
  return !!('ontouchstart' in window) // works on most browsers 
      || !!('onmsgesturechange' in window); // works on ie10
};

上面第二个 SO 答案的片段:What's the best way to detect a 'touch screen' device using JavaScript?

【讨论】:

  • 感谢您的回答。这也适用于多个 .js 文件吗?
  • 是的,这也适用于多个 .js 文件。只需在条件(触摸/浏览器宽度/浏览器代理)为 true 后添加您想要包含的那些 JS 文件。
  • 我更新了我的答案,以展示如何添加多个 javascript 文件,如果您需要在加载后执行任何 javascript 文件,只需将其放入 done() 函数即可。
  • 感谢您的帮助。 Travis 的解决方案对我有用,所以我同意了,但我也感谢您的帮助!
【解决方案2】:

jsFiddle Demo

寻找touch的存在,如果它不存在那么你很可能在处理桌面:

编辑:我原来的 try/catch 方法显然已被弃用 (https://stackoverflow.com/a/4819886/1026459)

$(document).ready(function() {
 var isDesktop = (function() {
  return !('ontouchstart' in window) // works on most browsers 
  || !('onmsgesturechange' in window); // works on ie10
 })();
 //edit, if you want to use this variable outside of this closure, or later use this:
 window.isDesktop = isDesktop;
 if( isDesktop ){ /* desktop things */ }
});

【讨论】:

  • 特拉维斯 - 感谢您的回答!我只是有一个进一步的查询。我将代码粘贴在您放置 /* desktop things */ 注释的位置,但不幸的是,它现在无法在桌面上运行。我应该添加/省略什么以使其正常工作吗?
  • @rossautomatica - 它必须是您代码的其他方面。试试看这个 jsfiddle 是否会提醒你:jsfiddle.net/vEdzG。如果确实如此,那么也许您在某个地方更改了范围?不看代码很难知道发生了什么变化。如果您尝试在闭包之外访问它,您可能没有isDesktop 变量的范围。您始终可以将其附加到全局命名空间(参见编辑)。
  • 这一切现在似乎工作正常 - 我没有包含我原始脚本中存在的代码的 $(document).ready(function() 部分。我添加了它,它一切似乎都在桌面和移动设备上按预期工作。再次感谢!
猜你喜欢
  • 2012-04-11
  • 2011-12-28
  • 2021-07-06
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2020-02-22
相关资源
最近更新 更多