为什么jQuery仍然不确定,但脚本标签已加载很小



我以这种方式加载jQuery:

  function require(url, cb = new Function) {
    var s = document.createElement('script');
    s.src = url;
    // s.async=true; 
    // ^^^^^^^^^^^^ This is already removed, but the problem still existed.
    s.onload = cb;
    document.head.appendChild(s);
  }
  require(jquery_cdn_url, function(){
    try {
      alert($);
    } catch (e) {
      ga('send', 'pageview', e);
    }
  });

catch块中的错误并非始终发生。但是对于某些访问者(机会很小),因为我通过将信息发送到Google Analytics(

)来跟踪此信息。

在此问题的先前版本中,脚本具有async属性。但是在真实的项目中,我将其删除,并且错误仍然出现。

为什么会发生这种情况?有什么办法避免这种情况吗?

一些进一步的想法:

  • Google Analytics(分析)代码也已加载,因此,如果onload函数在某些用户代理上不起作用,则ga()也应该向Google发送任何内容。
  • 我想到了一种避免这种情况的方法:在try ... catch块中,用" xxx.html?load = sync"等查询重新加载失败的情况。然后,如果有load=sync查询,我在服务器端进行一些检测,然后我输出一个带有同步JavaScript标签的代码。这听起来像是可能的解决方法,但并不完美,因为它需要重新加载(更多浪费的网络请求)和一些服务器端编程工作量。

您并不是说要浏览问题出现在哪个浏览问题中,但是在浏览器中对onload标签的CC_7属性的支持似乎很斑点。

可能会导致您看到的问题 - 检查用户代理字符串以查看浏览器版本是否匹配。

显然,旧IE版本中正确的方法是使用onreadystatechange。这是一篇文章,证明了它是如何完成的。

要牢记的另一个细节是,在之后,应将src属性设置为 onload属性,以确保实际触发了Onload处理程序。不过,看起来这可能是您问题的原因:如果这是错误的,那么处理程序就不会被触发。

我做了一个小提琴,似乎可以正常工作。我认为解决方案是将代码放入Onload事件中。另外,您可能是一个缓存的清除问题,也请参阅此问题。

window.onload = function() {
  function require(url, cb = new Function) {
    var s = document.createElement('script');
    s.src = url;
    s.async = true;
    s.onload = cb;
    document.head.appendChild(s);
  }
  require('https://code.jquery.com/jquery-2.2.4.min.js', function(){
    alert($); //ReferenceError: $ is not defined
  });
};

将CDN URL加载到由require函数添加的脚本标签中,但是CDN URL将花费一些时间来从网络加载JS文件。它将首先提出一个提取请求,然后将响应收回包含文件内容的响应,只有这样,jQuery已满载,您可以访问$。尽管这也取决于您的互联网速度。有时您会尽快获得CDN JS内容,有时可能需要很长时间。

最新更新