当前位置: 首页 > news >正文

学习 easyui 之二:jQuery 的 ready 函数和 easyloader 的加载回调函数

Ready 事件不一定 ready

使用 easyloader 的时候,必须要注意到脚本的加载时机问题,easyloader 会异步加载模块,所以,你使用的模块不一定已经加载了。比如下面的代码。

<script type="text/javascript">

    easyloader.locale = "zh_CN";
    using("messager", function () {
        alert("加载成功!");
    });

    $(function () {
        $.messager.alert('Warning', 'The warning message');
    });

</script>

看起来非常简单,还使用了 jQuery 的 ready 函数。不幸的是,执行一下,就会发现如下的错误。

TypeError: $.messager is undefined
[在此错误处中断]     

$.messager.alert('Warning', 'The warning message');

明明已经在前面使用 using 加载了,为什么还会出现这个错误呢?这不是已经在 ready 函数中使用了吗?

如果把前面的代码修改一下,使用 console.info 输入日志信息,就会很清楚了。

<script type="text/javascript">

    easyloader.locale = "zh_CN";
    using("messager", function () {
        console.info("加载 messager 成功。");
    });

    $(function () {
        console.info("Ready");
        $.messager.alert('Warning', 'The warning message');
    });

</script>

在 Firebug 中可以看到输出的信息。

很清楚,Ready 函数先于 using 函数执行了。

也就是说,你不能认为在 jQuery 的 Ready 函数中,已经加载了需要的模块。原因很简单,异步加载导致。

用 JavaScript 创建一个 script 元素,然后插入到 DOM 中,这样就实现了非阻塞的加载 javascript 脚本。此方法被称为 "Script DOM Element" 法。easyui的 easyloader 就是使用这种方式实现异步加载的。

那么,我们什么时候才能调用延迟加载的模块呢?答案是在加载模块的回调函数中,你可以将前面的代码修改为如下所示:

<script type="text/javascript">

    easyloader.locale = "zh_CN";
    using("messager", function () {
        console.info("加载 messager 成功。");
        $.messager.alert('Warning', 'The warning message');
    });

    $(function () {
        console.info("Ready");
    });

</script>

结论就是,如果你需要使用 easyui 的模块,就必须将使用代码放在模块的加载完成回调函数中,来保证模块正确完成加载工作。如果不涉及到 easyui ,那么就可以直接使用 jQuery 的 ready 函数。

不能使用 ready 函数了吗?

如果是在某个按钮的点击事件中调用 easyui 的模块呢?比如说,在点击某个按钮之后,使用 messager 的 alert 弹出一个提示框,也必须写在这个回调函数中吗?

这倒不必,按钮的点击事件注册还可以与原来一样写在 jQuery 的 Ready 函数中,因为在注册的时候,并没有真正调用 easyui 的方法,而点击是在以后的事情,这个时间间隔已经足以加载完成了。

加载多个模块怎么办?

如果是需要加载多个模块之后,又应该怎么办呢?别忘了,using 加载模块还可以使用字符串数组的方式直接指定多个模块,在多个模块加载完成之后,调用我们的回调函数,比如,我们使用了 linkbutton ,同时还希望使用 messager,可以传递一个字符串的数组,将主要使用的模块表示为 ["linkbutton","messager"],那么就可以如下完成。

<script type="text/javascript">

    easyloader.locale = "zh_CN";
    using(["linkbutton","messager"], function () {
        console.info("加载 messager 成功。");
        $("#btnAlert").linkbutton();
        $.messager.alert('Warning', 'The warning message');
    });

    $(function () {
        console.info("Ready");
    });

</script>

这样就保证了我们脚本的正确执行。

在网上看到有朋友 放弃使用easyloader,因为使用的时候出现加载错误,可能就是因为上面分析的原因。

延伸阅读:

世纪之光:jQuery Easyui Easyloader使用注意点总结

转载于:https://www.cnblogs.com/haogj/archive/2013/04/23/3039001.html

相关文章:

  • AS3应用程序模块化开发与ApplicationDomain
  • Access restriction: The type BASE64Encoder is not accessible due to restrict
  • 什么是x-window
  • Unity3D 关于yield在collider中的使用
  • ultraWinGrid绑定下拉框
  • 双向循环链表运用(2)
  • Qt ui的动态加载
  • Oracle11gR2 静默建库,删库和配置
  • Qt ui在程序中的使用
  • grub2编译安装
  • 项目中用到的架构模式(持续更新)
  • 校园招聘笔试题(A卷)
  • javadoc 命令
  • 校园招聘笔试题(B卷)
  • 进程与线程的一个简单解释
  • .pyc 想到的一些问题
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • CentOS7简单部署NFS
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • IDEA常用插件整理
  • leetcode-27. Remove Element
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • sublime配置文件
  • 多线程 start 和 run 方法到底有什么区别?
  • 关于extract.autodesk.io的一些说明
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 力扣(LeetCode)965
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Linux·i2c驱动架构​
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转) ns2/nam与nam实现相关的文件
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET MVC第三章、三种传值方式
  • .net MySql
  • .Net 代码性能 - (1)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @RequestMapping 的作用是什么?
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 第一章] JavaScript 简史
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [Android Pro] AndroidX重构和映射
  • [C/C++]关于C++11中的std::move和std::forward