jQuery 2.1 |延迟功能直到手动加载外部脚本

Posted

技术标签:

【中文标题】jQuery 2.1 |延迟功能直到手动加载外部脚本【英文标题】:jQuery 2.1 | Defering function until external scripts are manually loaded 【发布时间】:2015-03-30 03:04:14 【问题描述】:

这是我的困境:浏览器硬刷新会清空浏览器缓存,而当互联网连接丢失时发生这种情况,当互联网连接恢复时我无法使用我的应用程序。因此,我想通过一个按钮手动(无缝)重新加载 Google 的 client.js 脚本和相关的 Youtube APIv3。

是否有适当的方法来推迟函数(获取 Youtube 数据),直到成功手动加载所有必需的 Youtube 脚本?在轮询所需的外部资源之前,该函数首先必须检查浏览器缓存中是否有所需的 Youtube 资源。

我有这段代码,但不知道如何设置connection() 和延迟 正确。帮助将不胜感激:

function connection() 
// How to verify if needed resources are in browser cache, if not,
// fetch them externally?
// apis.google.com/js/client.js?onload=googleApiClientReady


function googleApiClientReady() gapi.client.setApiKey('API key');
gapi.client.load('youtube', 'v3', function()
appdefaults();
);


function lostconnection() 
alert('Connection lost.');


function verifynetwork() // Check connection status
var i = new Image();
i.onload = connection;
i.onerror = lostconnection;
i.src = '//img.youtube.com/vi/4xmckWVPRaI/1.jpg?d=' + escape(Date());
// escape(Date()) is necessary to override possibility of image
// coming from cache.


$(function()
$('#YTdata').on('click', function()
verifynetwork();
ytdata(); // Defer this function until verifynetwork() has completed?


<button id="YTdata">Get data</button>

【问题讨论】:

除非我遗漏了一些明显的东西,否则问题的整个基础似乎是错误的。 “浏览器硬刷新清空浏览器缓存......” - 你确定吗?它不应该。 “......当互联网连接丢失时发生这种情况时,当互联网连接恢复时我无法使用我的应用程序” - 什么,即使在另一次硬刷新之后也不行?如果场景是真实的,那么应用程序将如何启动?数以千计的其他应用如何从连接失败中恢复? @Roamer-1888 硬刷新 (Ctrl-F5)。如果这样做时网络连接失败(全局或来自特定服务器)并且我的 Youtube 资源没有成功加载,那么我的应用程序将能够在本地工作,但即使在 Youtube 服务器恢复后也无法获取外部 Youtube 数据由于缺少加载的资源(API、脚本等)。因此,首选手动下载缺少的 Youtube 脚本的按钮,而不是另一个硬刷新(这将丢失我的本地数据)。 【参考方案1】:

当网络不可用时,我没有完全按照你的想法去做,但这里有一个 verifyNetwork() 的版本,它会告诉你网络是否可用,使用 jQuery 承诺:

function verifyNetwork() 
    var d = $.Deferred();
    var img = new Image();
    img.onload = d.resolve;
    img.onerror = d.reject;
    img.src = '//img.youtube.com/vi/4xmckWVPRaI/1.jpg?d=' + new Date().getTime();
    return d.promise();


$(function() 
    $('#YTdata').on('click', function() 
        verifyNetwork().then(function() 
            // network is available
        , function() 
            // network is not available
        )
    );
);

如果您有多个要等待的异步事情,那么您可以让每个事情都返回一个承诺,该承诺将在资源准备好时得到解决,然后您可以使用 jQuery 的 $.when() 在所有承诺完成时得到通知解决了。​​


检测网络连接的其他参考资料:

Check if Internet Connection Exists with javascript?

Detect that the Internet connection is offline?

How to detect online/offline event cross-browser?

Check If Internet Connection Exists in JavaScript

【讨论】:

正是我所需要的,每个事件都有自定义函数来启动!我会花时间访问这些参考资料,谢谢您的大力帮助!

以上是关于jQuery 2.1 |延迟功能直到手动加载外部脚本的主要内容,如果未能解决你的问题,请参考以下文章

延迟 jquery 脚本,直到其他所有内容都已加载

Lazy Load, 延迟加载图片的 jQuery 插件

Slick Slider (Ken Wheeler) - 隐藏滑块直到加载

结构-行为-样式-Jquery实现延迟加载特效(数据缓冲特效)

jQuery延迟加载(懒加载)插件 jquery.lazyload.js

jQuery延迟加载(懒加载)插件 – jquery.lazyload.js