原生js仿jquery一些常用方法
原生js仿jquery一些常用方法
下面小编就为大家带来一篇原生js仿jquery一些常用方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
最近迷上了原生js,能不用jquery等框架的情况都会手写一些js方法,记得刚接触前端的时候为了选择器而使用jquery。。。现在利用扩展原型的方法实现一些jquery函数:
1.显示/隐藏
//hide()
Object.prototype.hide = function(){
this.style.display="none";
return this;
}
//show()
Object.prototype.show = function(){
this.style.display="block";
return this;
}
return this的好处在于链式调用。
2.滑动 省略speed和callback的传入,因为要加一串判断和处理回调,代码量大
//slideDown()
Object.prototype.slideDown = function(){
this.style.display = 'block';
if(this.clientHeight<this.scrollHeight){
this.style.height=10+this.clientHeight+"px";
var _this = this;
setTimeout(function(){_this.slideDown()},10)
}else{
this.style.height=this.scrollHeight+"px";
}
}
//slideUp()
Object.prototype.slideUp = function(){
if(this.clientHeight>0){
this.style.height=this.clientHeight-10+"px";
var _this = this;
setTimeout(function(){_this.slideUp()},10)
}else{
this.style.height=0;
this.style.display = 'none';
}
}
3.捕获/设置
//attr()
Object.prototype.attr = function(){
if(arguments.length==1){
return eval("this."+arguments[0]);
}else if(arguments.length==2){
eval("this."+arguments[0]+"="+arguments[1]);
return this;
}
}
//val()
Object.prototype.val = function(){
if(arguments.length==0){
return this.value;
}else if(arguments.length==1){
this.value = arguments[0];
return this;
}
}
//html()
Object.prototype.html = function(){
if(arguments.length==0){
return this.innerHTML;
}else if(arguments.length==1){
this.innerHTML = arguments[0];
return this;
}
}
//text()需要在html()结果基础上排除标签,会很长,省略
4.CSS方法
//css()
Object.prototype.css = function(){
if(arguments.length==1){
return eval("this.style."+arguments[0]);
}else if(arguments.length==2){
eval("this.style."+arguments[0]+"='"+arguments[1]+"'");
return this;
}
}
5.添加元素
//append()
Object.prototype.append = function(newElem){
this.innerHTML += newElem;
return this;
}
//prepend()
Object.prototype.prepend = function(newElem){
this.innerHTML = arguments[0] + this.innerHTML;
return this;
}
//after()
Object.prototype.after = function(newElem){
this.outerHTML += arguments[0];
return this;
}
//before()
Object.prototype.before = function(newElem){
this.outerHTML = arguments[0] + this.outerHTML;
return this;
}
6.删除/替换元素
//empty()
Object.prototype.empty = function(){
this.innerHTML = "";
return this;
}
//replaceWith()
Object.prototype.replaceWith = function(newElem){
this.outerHTML = arguments[0];
return this;
}
//remove() js自带,省略。
7.设置css类
//hasClass()
Object.prototype.hasClass = function(cName){
return !!this.className.match( new RegExp( "(\\s|^)" + cName + "(\\s|$)") );
}
//addClass()
Object.prototype.addClass = function(cName){
if( !this.hasClass( cName ) ){
this.className += " " + cName;
}
return this;
}
//removeClass()
Object.prototype.removeClass = function(cName){
if( this.hasClass( cName ) ){
this.className = this.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" )," " );
}
return this;
}
上面的设置CSS类也可以利用html5新API classList及contains实现 但不兼容IE8以下及部分火狐浏览器
Object.prototype.hasClass = function(cName){
return this.classList.contains(cName)
}
Object.prototype.addClass = function(cName){
if( !this.hasClass( cName ) ){
this.classList.add(cName);
}
return this;
}
Object.prototype.removeClass = function(cName){
if( this.hasClass( cName ) ){
this.classList.remove(cName);
}
return this;
}
9.选择器
//id或class选择器$("elem")
function $(strExpr){
var idExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;
var classExpr = /^(?:\s*(<[\w\W]+>)[^>]*|.([\w-]*))$/;
if(idExpr.test(strExpr)){
var idMatch = idExpr.exec(strExpr);
return document.getElementById(idMatch[2]);
}else if(classExpr.test(strExpr)){
var classMatch = classExpr.exec(strExpr);
var allElement = document.getElementsByTagName("*");
var ClassMatch = [];
for(var i=0,l=allElement.length; i<l; i++){
if(allElement[i].className.match( new RegExp( "(\\s|^)" + classMatch[2] + "(\\s|$)") )){
ClassMatch.push(allElement[i]);
}
}
return ClassMatch;
}
}
需要强调的是,选择器返回的结果或结果集包含的是htmlDOM,并非jquery的对象。大多数人都知道,document.getElementById("id")等价于jquery$("#id")[0],另外上面class选择器选择的结果如需使用,需要利用forEach遍历:
$(".cls").forEach(function(e){
e.css("background","#f6f6f6")
})
10.遍历 siblings()和children()获取的结果也需要结合forEach使用
//siblings()
Object.prototype.siblings = function(){
var chid=this.parentNode.children;
var eleMatch = [];
for(var i=0,l=chid.length;i<l;i++){
if(chid[i]!=this){
eleMatch.push(chid[i]);
}
}
return eleMatch;
}
//children() 原生js已含有该方法,故命名为userChildren。
Object.prototype.userChildren = function(){
var chid=this.childNodes;
var eleMatch = [];
for(var i=0,l=chid.length;i<l;i++){
eleMatch.push(chid[i]);
}
return eleMatch;
}
//parent()
Object.prototype.parent = function(){
return this.parentNode;
}
//next()
Object.prototype.next = function(){
return this.nextElementSibling;
}
//prev()
Object.prototype.prev = function(){
return this.previousElementSibling;
}
jquery事件函数原生js已有,另外,原生js实现jquery的一个常用函数 ajax 将会在下一篇写道。
原生js仿jquery一些常用方法的更多相关文章
- 【转】原生js仿jquery一些常用方法
现在利用扩展原型的方法实现一些jquery函数: 1.显示/隐藏 ? 1 2 3 4 5 6 7 8 9 10 //hide() Object.prototype.hide = function(){ ...
- [js插件开发教程]原生js仿jquery架构扩展开发选项卡插件
jquery插件一般是这么干的: $.fn.插件名称 = function(){}, 把插件的名称加在.fn上,在源码里面实际上是扩展到构造函数的原型对象上,如果你没看过jquery的源代码,或者你曾 ...
- 用原生js模仿jquery
阅读声明:本文档仅供学习,由于个人能力有限,文档中有错漏的地方还请指出,大家共同学习. 目前在学习怎么样写jquery,模仿阶段,有兴趣的同学可以和我一起学习,共同交流,在学习的路上希望有你做伴. 在 ...
- 【前端性能】必须要掌握的原生JS实现JQuery
很多时候,我们经常听见有人说jquery有多快多快.在这个各种类库满天飞的时候,不得不说的是,能有原生JS快吗? 是的,明显原生JS要更快,因为诸如JQuery这样的库必须要兼容各种浏览器和低版本和许 ...
- 原生js和jquery实现图片轮播特效
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- 原生js和jquery实现图片轮播特效(转)
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- 原生JS和JQuery的区别
1.原生js和jQuery的入口函数加载模式不同 原生js等页面dom加载完成并且图片等资源也加载完成之后才会执行: jQuery则是等页面dom加载完成执行,不会等图片等资源也加载完成: (也就是说 ...
- onload事件与ready事件的区别,原生js与jquery的区别
onload事件与ready事件分别是原生js与jquery的入口函数 原生js入口函数写法: window.onload=function(){ } jquery入口函数写法: $(document ...
- JavaScript中函数和类(以及this的使用<重点>,以及js和jquery讲解,原生js实现jquery)
1.javascript中以函数来表示类: 一般函数是小写开头:function foo() 类开头是大写:function Foo() 实例化类: obj = new Foo() 其他属性就同类是一 ...
随机推荐
- Linux 操作系统镜像下载
http://mirror.centos.orghttp://mirrors.163.comhttp://mirrors.suhu.com 例如:下载centos http://mirrors.163 ...
- 转:"为自动填充列调整大小期间不能执行此操作"解决办法 .
转载自:http://blog.csdn.net/zhxingway/article/details/5384690 今天在测试的时候,打开一个窗口突然发现出现以下错误,就算我在打开窗口那个按钮里面和 ...
- bzoj2049 [Sdoi2008]Cave 洞穴勘测 link cut tree入门
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isro ...
- 一起学习在 Ubuntu 上授予和移除 sudo 权限
如你所知,用户可以在 Ubuntu 系统上使用 sudo 权限执行任何管理任务.在 Linux 机器上创建新用户时,他们无法执行任何管理任务,直到你将其加入 sudo 组的成员.在这个简短的教程中,我 ...
- mysql命令(三)
创建一个名字为Student库: create database Student; 用以下地命令来查看创建的数据库是否成功: show databases; 进入数据库: use Student; 用 ...
- Java 线程类的一些常用方法
线程类的一些常用方法: sleep(): 强迫一个线程睡眠N毫秒. isAlive(): 判断一个线程是否存活. join(): 等待线程终止. activeCount(): 程序中活跃的线程数 ...
- 计算概论(A)/基础编程练习2(8题)/7:整数的个数
#include<stdio.h> int main() { ] = {}; // 输入k个正整数 scanf("%d",&k); // 循环读入和进行算术 w ...
- Prometheus监控学习笔记之初识PromQL
0x00 概述 Prometheus 提供了一种功能表达式语言 PromQL,允许用户实时选择和汇聚时间序列数据.表达式的结果可以在浏览器中显示为图形,也可以显示为表格数据,或者由外部系统通过 HTT ...
- php使用phpexcel导出文件
php使用phpexcel导出文件 首先需要去官网https://github.com/PHPOffice/PHPExcel/下载PHPExcel 代码如下: <?php date_defaul ...
- js条件判断if-else和switch、循环for和while
条件判断和循环都使用{ }将代码块括起来,如果代码块只有一行,则可省略{ }. 在循环中,continue表示跳过当前循环继续进行下一次循环,break表示跳出整个循环. 1.条件判断if-else, ...