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 相关文章推荐
Javascript 代码也可以变得优美的实现方法
Jun 22 Javascript
jQuery实现简单的文件上传进度条效果
Mar 26 Javascript
基于JavaScript创建动态Dom
Dec 08 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
JavaScript prototype属性详解
Oct 25 Javascript
jquery插件bootstrapValidator数据验证详解
Nov 09 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
Mar 27 Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
基于vue、react实现倒计时效果
Aug 26 Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 Javascript
解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题
Aug 14 Javascript
多个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内存使用情况如何获取
2015/10/10 PHP
JQuery 写的个性导航菜单
2009/12/24 Javascript
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
vue.js项目打包上线的图文教程
2017/11/16 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
layui table单元格事件修改值的方法
2019/09/24 Javascript
JS三级联动代码格式实例详解
2019/12/30 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
python原始套接字编程示例分享
2014/02/21 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
Python判断变量名是否合法的方法示例
2019/01/28 Python
python+selenium实现简历自动刷新的示例代码
2019/05/20 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
python实现按首字母分类查找功能
2019/10/31 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
比较基础的php面试题及答案-编程题
2012/10/14 面试题
体育专业个人求职信范文
2013/12/27 职场文书
大学运动会入场词
2014/02/22 职场文书
学生未请假就回家检讨书
2014/09/22 职场文书
领导班子对照检查材料
2014/09/22 职场文书
2016年清明节寄语
2015/12/04 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技