jQuery下实现等待指定元素加载完毕(可改成纯js版)


Posted in Javascript onJuly 11, 2013

先声明下这个方法的使用场合,以免误导大家。
比如在博客园,我们没法修改他的源代码,
那么只能想办法监视元素的出现了。
所以下面方法是在修改不了源码的情况下使用,而非写自己的项目。

今天在改博客几个样式的时候,以为很自然的加上js就可以实现了,
没想到那个是ajax加载的数据,而非页面首次加载的,
比如下面的 “提交评论” 按钮,右侧的 搜索按钮 等。
我很自然的写了

1 $("#btn_comment_submit").removeClass("comment_btn").addClass("btn"); //提交按钮 
2 $(".div_my_zzk").addClass("input-append"); //搜索框 
3 $(".btn_my_zzk").removeClass("btn_my_zzk").addClass("btn"); //搜索按钮

可是刷新页面后发现有点不对,看了 network 后发现是 ajax 过来的,
无奈,除了自己写模版之外,只能自己想办法修改代码了。

那么下面就是我想到的等待元素出现方法。
虽然是基于 jQuery 的,但是代码很简洁,可以修改成纯js版的。

jQuery.fn.wait = function (func, times, interval) { 
var _times = times || -1, //100次 
_interval = interval || 20, //20毫秒每次 
_self = this, 
_selector = this.selector, //选择器 
_iIntervalID; //定时器id 
if( this.length ){ //如果已经获取到了,就直接执行函数 
func && func.call(this); 
} else { 
_iIntervalID = setInterval(function() { 
if(!_times) { //是0就退出 
clearInterval(_iIntervalID); 
} 
_times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 
if( _self.length ) { //判断是否取到 
func && func.call(_self); 
clearInterval(_iIntervalID); 
} 
}, _interval); 
} 
return this; 
}

使用方法当然也很简单,只有3个参数。
func 是回调函数,就是当指定元素出现后就执行的函数。
times 是检测次数,默认是-1,一直检测直到出现为止。
interval 是检测间隔,默认 20 毫秒一次。

我们修改下之前的代码

$("#btn_comment_submit").wait(function() { //等待#btn_comment_submit元素的加载 
this.removeClass("comment_btn").addClass("btn"); //提交按钮 
//这里的 this 就是 $("#btn_comment_submit") 
}); $("#widget_my_zzk").wait(function() { //等待#widget_my_zzk元素的加载 
$(".div_my_zzk").addClass("input-append"); //搜索框 
$(".btn_my_zzk").removeClass("btn_my_zzk").addClass("btn"); //搜索按钮 
});

是不是很简单、、

当然,依然不破坏jQuery的链式结构,你依然可以 $("#id").wait(function(){}).hide();
但是后来想想,元素都没加载,继续链下去也没意义,不过算了,不改了,就这样吧。呵呵 :-)

最后说点,,我经验尚浅,如果那里写的不对,还请各位大侠指点。

Javascript 相关文章推荐
提高 DHTML 页面性能
Dec 25 Javascript
Javascript操作URL函数修改版
Nov 07 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
Mar 24 Javascript
javascript制作幻灯片(360度全景图片)
Jul 28 Javascript
Bootstrap基本样式学习笔记之标签(5)
Dec 07 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
Dec 14 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
Dec 26 Javascript
用原生JS实现简单的多选框功能
Jun 12 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 Javascript
Vuex的实战使用详解
Oct 31 Javascript
node.js使用stream模块实现自定义流示例
Feb 13 Javascript
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
多个datatable共存造成多个表格的checkbox都被选中
Jul 11 #Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 #Javascript
在js文件中如何获取basePath处理js路径问题
Jul 10 #Javascript
使用闭包对setTimeout进行简单封装避免出错
Jul 10 #Javascript
js Map List 遍历使用示例
Jul 10 #Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
Jul 10 #Javascript
JS下拉框内容左右移动效果的具体实现
Jul 10 #Javascript
You might like
php导入导出excel实例
2013/10/25 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
jQuery 使用手册(七)
2009/09/23 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
浅谈JavaScript for循环 闭包
2016/06/22 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
JavaScript中ES6规范中let和const的用法和区别
2020/08/06 Javascript
vue3.0 上手体验
2020/09/21 Javascript
Python base64编码解码实例
2015/06/21 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
2017/04/24 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
什么是Python中的匿名函数
2020/06/02 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
一款纯css3实现的tab选项卡的实列教程
2014/12/11 HTML / CSS
Myprotein加拿大官网:欧洲第一的运动营养品牌
2018/01/06 全球购物
自荐书模板
2013/12/19 职场文书
工程质量月活动方案
2014/02/19 职场文书
小学清明节活动方案
2014/03/08 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
个人贷款收入证明
2014/10/26 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
教师节祝酒词
2015/08/11 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android