Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当外部JavaScript或CSS资源加载失败时检测并记录_Javascript_Jquery_Css_Http_Timeout - Fatal编程技术网

当外部JavaScript或CSS资源加载失败时检测并记录

当外部JavaScript或CSS资源加载失败时检测并记录,javascript,jquery,css,http,timeout,Javascript,Jquery,Css,Http,Timeout,我对外部js和css资源有多个引用。大多数情况下,这些都是用于第三方分析等方面。有时(轶事)这些资源无法加载,通常导致浏览器超时。当外部JavaScript或CSS资源无法加载时,是否可以检测并登录服务器 我正在考虑某种类型的延迟加载机制,当失败时,将调用一个特殊的URL来记录此失败。有什么建议吗 我认为会发生什么: 用户点击我们的页面,服务器端成功处理并提供页面服务 在客户端,HTML头试图连接到我们的第三方集成合作伙伴,通常是通过以“开始”的javascript包含http://www.so

我对外部js和css资源有多个
引用。大多数情况下,这些都是用于第三方分析等方面。有时(轶事)这些资源无法加载,通常导致浏览器超时。当外部JavaScript或CSS资源无法加载时,是否可以检测并登录服务器

我正在考虑某种类型的延迟加载机制,当失败时,将调用一个特殊的URL来记录此失败。有什么建议吗

我认为会发生什么:

  • 用户点击我们的页面,服务器端成功处理并提供页面服务

  • 在客户端,HTML头试图连接到我们的第三方集成合作伙伴,通常是通过以“开始”的javascript包含http://www.someothercompany.com...".

  • 另一家公司无法处理我们的负载或有糟糕的启动时间,因此连接失败

  • 用户看到未找到的通用IE页面,而不是来自我们服务器的页面


  • 因此,即使我的网站已经启动,其他一切都正常运行,仅仅因为这一次调用第三方服务器失败,HTML页面标题中的一次调用失败,我们仍然无法启动。

    您可以在JavaScript中查找对象的存在,例如查看是否加载了jQuery

    if (typeof jQuery !== 'function') {
       // Was not loaded.
    }
    

    您还可以检查是否缺少CSS样式,例如,如果您知道某个CSS文件将背景颜色设置为
    #000

    if ($('body').css('backgroundColor') !== 'rgb(0, 0, 0)') {
       // Was not loaded.
    }
    


    当这些失败时,您可以向服务器发送一个XHR以记录这些失败。

    对js名称和会话cookie进行哈希,并以普通格式发送js名称和哈希。服务器端,进行相同的散列,如果两者都是相同的日志,如果不是,则假定这是滥用。

    如果您的应用程序/页面依赖于JS,您可以使用JS加载内容,我知道这很混乱。当使用JS加载这些内容时,您可以使用回调,这样您就可以只拥有加载内容的功能,而不必担心没有加载的内容

    var script = document.createElement("script");
    script.type = "text/javascript";
    script.src = 'http://domain.com/somefile.js';
    script.onload = CallBackForAfterFileLoaded;
    document.body.appendChild(script);
    function CallBackForAfterFileLoaded (e) {
    //Do your magic here...
    }
    
    我通常会让这变得更复杂一些,因为JS和文件的数组相互依赖,如果它们不加载,那么我就有一个错误状态

    我忘了提到,显然我只是展示如何创建一个JS标记,你必须为你想要加载的其他类型的文件创建你自己的方法


    希望这会有帮助,干杯

    服务人员呢?我们可以使用它拦截所有http请求,并获取响应代码以记录外部资源是否加载失败。

    如果整个页面加载失败,我无法对任何内容进行哈希处理。请看我对这个问题所做的编辑以获得澄清。我的意思是,在你的页面功能正常后,你可以将其与延迟加载第三方js相结合;在js加载失败的情况下,用名称和哈希值ping您的
    js\u failed\u logger.php
    。你的问题意味着你关心的是这个被利用的问题,而不是如何实现它。谢谢。我想我最初对如何实现它感兴趣。如果它能工作,我就可以找到保护它的方法。如果页面加载失败,我就不能做这两件事。请参阅我对问题的编辑以获得澄清。这或多或少是我想要的。我也发现了这种技术:我猜你的意思是
    script.onload=callbackforafterfileload,没有
    ()
    是的,很抱歉@hippietrail,请从该URL中删除#comment10730182_538848。另请参见