2017-06-19 109 views
3

当在IE11中测试我的网站时,它的某些部分不起作用,我相信问题在于我的'custom.js'文件,因为所有问题链接到JS。但是,该页面在Chrome和Firefox中完美运行。.js文件工作在铬和Firefox但不IE浏览器

我在页面的页脚载入名为“custom.js”的.js文件与其他页specfic插件(jQuery和引导装载在头),像这样一起:

<!-- JS Implementing Plugins --> 
<script type="text/javascript" src="/js/back-to-top.js"></script> 
<script type="text/javascript" src="/js/smoothScroll.js"></script> 
<script type="text/javascript" src="/js/jquery.parallax.js"></script> 
<script type="text/javascript" src="/js/masterslider.min.js"></script> 
<script type="text/javascript" src="/js/jquery.easing.min.js"></script> 
<script type="text/javascript" src="/js/owl.carousel.min.js"></script> 
<script type="text/javascript" src="/js/jquery.cubeportfolio.min.js"></script> 

<!-- JS Customization --> 
<script type="text/javascript" src="/js/custom.js"></script> 

<!-- JS Page Level --> 
<script type="text/javascript" src="/js/app.js"></script> 
<script type="text/javascript" src="/js/owl-carousel.js"></script> 
<script type="text/javascript" src="/js/master-slider-fw.js"></script> 
<script type="text/javascript" src="/js/jquery.owl-filter.js"></script> 
<script type="text/javascript" src="/js/material.min.js"></script> 

<script type="text/javascript"> 
    jQuery(document).ready(function() { 
     App.init(); 
     App.initCounter(); 
     App.initParallaxBg(); 
     FancyBox.initFancybox(); 
     MSfullWidth.initMSfullWidth(); 
     OwlCarousel.initOwlEvent(); 
     OwlCarousel.initOwlSingle(); 
     OwlCarousel.initOwlTwo(); 
     OwlCarousel.initOwlAbout(); 

    }); 
    $(document).ready(function(){ 
     $('.owl-carousel').owlCarousel({ 
      nav:true, 
      loop:true 
     }); 
    }); 

</script> 

<!--[if lt IE 9]> 
<script src="/plugins/respond.js"></script> 
<script src="/plugins/html5shiv.js"></script> 
<script src="/plugins/placeholder-IE-fixes.js"></script> 

内容该custom.js文件是:

$(".helpform-container:not(.displayblock)").hide(); 
    $(".helpform") 
     .on('mouseover focus', function(e) { 
      $(this).addClass("link-div-hover") 
     }) 
     .on('mouseout blur', function(e) { 
      $(this).removeClass("link-div-hover") 
     }) 
     .on('touchstart', function(e) { 
      $(this).addClass("link-div-hover") 
     }) 
     .on('touchend', function(e) { 
      $(this).removeClass("link-div-hover") 
     }) 
     .on('click', function(e) { 
      $(this).toggleClass("active"); 
      e.preventDefault(); 

      if ($(".helpform-container").is(":hidden")) { 
       $(".helpform-container").slideDown(400).addClass("displayed"); 
       analyticsevent('How can we help form', 'open'); 
      } else { 
       $(".helpform-container").slideUp(400).removeClass("displayed"); 
       $("#sticky-wrapper").css("height","auto"); 
       analyticsevent('How can we help form', 'closed'); 
      } 

      if (sitewidth < 1024) { 
       $('html,body').animate({ scrollTop: $("#howcanwehelp").offset().top - 60 }, 250); 
      } else { 
       $('html,body').delay(500).animate({ 
        scrollTop: $("#howcanwehelp").offset().top 
       }, 400); 
      } 
     }) 

    //FORM METRICS 
    if ($('.formsent').length){ 
     analyticsevent('Contact form completed', 'consultation/quote/info/media'); 
    } 

//Homepage news articles 

var divs = $(".owl-news > .news-v2"); 
let array = [ 
    { length: 1, num: 4 }, 
    { length: 2, num: 3 }, 
    { length: 2, num: 3 }, 
    { length: 3, num: 2 } 
]; 

let i = 0; 


for (let item of array) { 
    divs.slice(i, i+item.length).wrapAll(`<div id='news-${item.num}' class='col-md-${item.num}'></div>`); 
    i += item.length; 
} 

$("#news-4").before("<div class='col-md-4'><h3 id='title_featured'>Featured News</h3></div><div class='col-md-8'><h3 id='title_latest'>Latest News</h3></div>"); 
+0

将IE垫片移动到脚本标签的顶部和您定位的IE版本时会发生什么? – Severin

+0

我把它移到页脚的js上面,但它似乎没有任何区别。这是IE11 – user3005003

+0

而不是如预期的那样。你写了一些部分工作,有些不工作。您可以添加哪些零件可以做,哪些不可以或您的问题发生在哪个区域?我发现的一件事是ES6的模板语法:\'

' - 这需要在IE11中工作,但在Chrome中工作(foo $ {bar}'也会传递'foo'+ bar)。也让IE11不能在没有转译的情况下工作(应该是var)... – Severin

回答

4

您使用的JavaScript let关键字,这是只有在IE11提供。更多信息here ...

如果问题仍然存在,你一定代码编译,那么你应该启动浏览器的调试器来弄清楚发生了什么事情......只要将关键字debugger;某处你的代码,浏览器将在该站暂停执行允许你检查变量...

事情是这样的:

debugger; 
$(".helpform-container:not(.displayblock)").hide(); 
... 
$("#news-4").before("<div class='col-md-4'><h3 id='title_featured'>Featured News</h3></div><div class='col-md-8'><h3 id='title_latest'>Latest News</h3></div>"); 
+0

它仍然不能在IE11中工作,只有在IE11它不会给我任何JS错误,它只是不工作在IE11 – user3005003

+0

我再次得到相同的错误'for(让项目的数组){' – user3005003

+0

这是因为... for ...的语法只在边缘12有效...... –

18

问题:Internet Explorer的11,在2013年发布的,不运行的ECMAScript 2015年(很明显原因)。

肮脏的方式:Babel(独立)

的最快,但也是最有效的方式。 请勿在生产中使用。

<!-- Load the in-browser babel compiler. Make sure page encoding is UTF-8. --> 
<script src="https://unpkg.com/[email protected]/babel.min.js"></script> 
<!-- Set script type to text/babel for on-the-fly conversion and execution --> 
<script type="text/babel" src="custom.js"></script> 
<!-- Babel need to read the script through ajax, same origin policy applies. --> 

痛苦的样子:改写ES5

简单地改写ES5的custom.js最后几行,要格外小心,不要使用在未来的任何ES6/7/8 +功能:

var divs = $(".owl-news > .news-v2"), 
    array = [ 
     { length: 1, num: 4 }, 
     { length: 2, num: 3 }, 
     { length: 2, num: 3 }, 
     { length: 3, num: 2 } 
    ], 
    i = 0; 

array.forEach(function(item) { 
    divs.slice(i, i+item.length).wrapAll("<div id='news-"+item.num+"' class='col-md-"+item.num+"'></div>"); 
    i += item.length; 
}); 

系统方式:构建脚本

合适的构建系统可以帮助您管理项目,如自动测试和部署到测试和生产系统。 他们可以做的一件事就是在部署时将ES6代码转换为ES5,并可能对它们进行缩小/混淆处理,例如使用Babel,TraceurClosure

“构建系统”可以像批处理文件一样简单。 如果你告诉你的老板它会保护宝贵的公司知识产权,他可能会给你正确的学习时间。


保存Web:不支持IE 11

我知道,我知道。 你不会问是否是一个选项。

但是,您的老板可能并不知道IE支持会花费更多的开发时间,这意味着成本更高,交付更慢,利润更少。 (8%),“火狐”(6%),“三星互联网”(3.6%)或“歌剧”的人数不多(3.2%)在现实世界中使用IE 11。 (3.4%)。 (Statcounter May 2017 global stat。) 如果用户或客户端问你为什么不支持Samsung browser,说没有人使用它不是一个很好的借口,因为IE 11的用户更少。

大多数IE用户已经了解到,如果它在IE中不起作用,请尝试Chrome。 鼓励他们先使用Chrome,最后使用IE会很好。 他们更安全,网络更加明亮,每个人都很开心。

+1

作为编译babel中所有内容的替代方法,您可以使用polyfill.io检测浏览器功能并为特定功能提供填充。 – david25272

+0

@ david25272我们可以使用polyfill方法,但是我们无法使用'let','for ... of'和模板字符串来填充语言特征。需要这些人的翻译。确实,代码可以在动态注入代码(和babel)之前进行浏览器检测,但我想保持简单的答案。 – Sheepy

+0

我喜欢你的结论,很好的回答! –

相关问题