Javascript对比JQery 不要过度依赖JQuery

不要过度依赖JQuery Javascript对比JQery


毫无疑问,JQuery是一款非常优秀的JavaScript库,它让我们开发项目变得更加便捷容易。

不过,当你准备在一个项目(特别是移动项目)中使用JQuery时,你真的该好好思考一下,你会用到JQuery的哪些功能,是否真的需要jQuery。因为随着JavaScript的不断改善进化,现在它内置的功能已经非常强大,在很大程度上,已经可以实现以前需要在JQuery中才能实现的技术(如果你的项目需要在IE8之前的浏览器中使用,建议还是使用JQuery,这样可以省却很多兼容性问题)。

1、查找搜索选择器

按ID查找:

$('#test')  =>  document.getElementById('test');

按class类名查找:

$('#test') => document.getElementByClassName('text');

按标签名查找

$('div') => document.getElementByTagName('div');

统一查找

$('#test') => docuemnt.querySelector('#test');

$('$test div') => document.querySelectorAll('#test div');

$('#test').find('span') => document.querySelectorAll('#test span'); 

获取单个元素

$('#test div').eq(0)[0] => document.querySeletorAll('#test div')[0];

获取HTML head body

$('html') => document.documentElement
$('head') => document.head
$('body') => document.body

判断节点是否存在

$('#test').length > 0  =>  document.getElementById('test') !== null
$('div').length > 0  =>  document.querySeletorAll('div').length > 0

遍历节点

$('div').each(function(i,elem){  })

function forEach(elems,callback){
    if([].forEach){
        [].forEach.call(elems,callback)
    }else{
        for( var i=0;i<elems.length;i++ ){
            callback(elems[i],i);
        };
    }
}

var div = document.querySelector('div');
forEach(div,function(elelm,i){  })

清空节点

$('#test').empty() => document.getElementById('test').innerHTML = '';

节点比较

$('div').is($('#test')) => document.querySelector('div') === document.getElementById('test')

1、获取/设置内容(值)

获取/设置元素内的内容

$('div').html()  =>  docuemnt.querySelector('div').innerHTML
$('div').text()  =>  var t = document.querySelector('div');
                      t.textContent || t.innerText;

$('div').html('<span>abc</span>');  =>  document.querySelector('div').innerHTML = '<span>abc</span>';
$('div').text('abc')  =>  document.querySelector('div').textContent = 'abc';

获取包括元素本身的内容

$('div').append( $('#test').clone() ).html() =>  document.getElementById('test').outerHTML;
$('div').prop('outerHTML') //获取元素本身
$('div').append( $('#test').clone() ).html('<span>abc</span>')  => docuemnt.getElementById('test').outerHTML = ‘<span></span>’

获取表单值

$('input').val() => document.querySelector('input').value();
$('input').vau('abc') => document.querySeletor('input').value = 'abc';

3、class类名操作

类名新增

$('#test').addClass('a')

function addClass(elem,className){
    if(elem.classList){
        ele.classList.add(classNmae)
    }else{
        elem.className +=  ' ' + className;
    }
}
addClass(document.getElementById('test'), 'a');

类名删除

$('#test').removeClss('a')
function removeClass(elem,classNmae){
    if(elem.classListh){
        elem.classList.remove(className)
    }else{
        elem.className = elem.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
    }
}
removeClass(document.getElementById('test'), 'a');

类名包含:

$('#test').hasClass('a');
function hasClass(elem,className){
    if(){
        elem.classList.contains(className)      
    }else{
        return new RegExp('(^| )' + className + '( |$)', 'gi').test(elem.className);    }
}
hasClass(document.getElementById('test'), 'a');

节点操作

创建节点

$('div') => document.createElement('div')

复制节点

$('div').clone()  => document.createElement('div').cloneNode(true)

插入节点

$('div').append('<span></span>')
var span = document.createElement('span');
docuemnt.querySelector('div').appendChild(span);

在指定节点之前插入新的子节点

$('<span>').insertBefore('#test'); 

var t = document.getElementById('test');

var span = document.createElement('span');

t.parentNode.insertBefore(span, t);

/*更简单的*/

t.insertAdjacentHTML('beforeBegin', '<span></span>');

在指定节点后插入新的子节点:

$('<span>').insertAfter('#test')



function insertAfter(elem, newNode){

  if(elem.nextElementSibling) {

    elem.parentNode.insertBefore(newNode, elem.nextElementSibling);

  } else {

    elem.parentNode.appendChild(newNode);

  }

}

var t = document.getElementById('test');   

var span = document.createElement('span');   

insertAfter(t, span);

/*更简单的*/

t.insertAdjacentHTML('afterEnd', '<span></span>');

获取父节点

$('#test').parent() => document.getElementById('test').parentNode

删除节点

$('#test').remove()
var t = document.getElementById('test');
t.parentNode.removeChild(t)

获取Element子节点

$('#test').children();
function children(elem){
    if(ele.children){
        retrun elem.children
    }else {
        var childen = [];
        for( var i=elem.children.length;i-- ){
            if( elem.children[i].nodeType != 8 ){
                children.unshift(elem.children[i])
            }
        }
        return children         
    }       
}
children(document.getElementById('test'));

获取下一个兄弟节点

$('#test').next()

function nextElementSibling(elem) {

  if(elem.nextElementSibling) {

    return elem.nextElementSibling;

  } else {

    do { 

       elem = elem.nextSibling; 

    } while ( elem && elem.nodeType !== 1 );   

    return elem;

  }

}

获取上一个兄弟节点

$('#test').prev()     

function previousElementSibling(elem) {    

  if(elem.previousElementSibling) {    

    return elem.previousElementSibling;    

  } else {    

    do {     

      elem = elem.previousSibling;     

    } while ( elem && elem.nodeType !== 1 );       

    return elem;    

  }   

}     

previousElementSibling(document.getElementById('test')); 

属性操作

获取属性

 $('#test').attr('class') => document.getElementById('test').getAttribute('class');

删除属性

$('#test').removeAttr('class') => document.getElementById('test').removeAttribute('class')

设置属性

$('#test').attr('class','abc') => document.getElementById('test').setAttribute('class','abc')

css样式操作

设置样式

$('#test').css('height','10px') => documengt.getElementById('test').style.height = '10px'

获取样式

$('#test').css('height')
var getStyle = function(dom,attr){
    reurn dom.currentStyle ? dom.cuurentStyle[attr] : getComputerStyle(dom,false)[attr]
}
getStyle(document.getElementById)('test'),'height');

获取伪类的CSS样式

window.getComputerStyle(el,':after')[attrName];

注:IE是不支持获取伪类的

7、字符串操作

去除空格

$.trim(' abc');
function trim(str){
    if( str.trim ){
        return str.trim();
    }else{
        return str.replace(/^\s+|\s+$/g,'')
    }
}

8、JSON操作

JSON序列化

$.stringify({name:'TG'}) => JSON.stringify({name:'TG'})

JSON反序列化

$.parseJSON('{"name":"TG"}') => JSON.parse('{"name":"TG"}')

不要过度依赖JQuery(二) Javascript对比JQery


1、位置

获取相对于文档位置

$('#test').offset() 

function offset(elem){
    var rect = elem.getBoundindClientReact();
    return {
        top: rect.top + document.body.scrollTop,
        left: rect.left + document.body.scrollLeft
    }
}

获取相对于具有定位(非static)的父元素(祖先元素)的位置:著作权归作者所有。

$('#test').position();
var t = document.getElementById('test');
var position = { top:t.offsetTop,left:t.offsetLeft }

获取相对于可视区左上角的位置

var offset = $('#test').offset();
var position = {
    top:offset.top - document.body.scrollTop,
    left:offset.left - document.body.scrollLeft
}

尺寸

获取包含内边距(padding)和边框(border)的元素高宽著作权归作者所有。

var width = $('#test').outerWidth();
var height = $('#test').outerHeight();

var t = doucment.getElementById('test');
var width = t.offsetWidth;
var height = t.offsetHeight;

获取元素内容的总高度

var t = document.getElementById('test');
//在没有滚动条的情况下,元素内容的总高度
t.scrollHeight;
t.scrollWidth

视口大小

var pageWidth = window.innerWidth || document.documentElement.clientWidth;
var pageHieght = window.innerHeight || document.documentElement.clientHeight;

绑定自定义数据

//绑定
$('#test').data('name','TG');
//读取
$('#test').data('name');
//移除
$('#test')。removeDate('name');

var t = document.getElementById('test');
//绑定
t.dataset.name = 'TG'
//读取
t.dataset.name
//移除
delete t.dataset.name

事件

绑定事件

$('#test').on('click',function(){})

var addEvent = function( dom,type,handle,capture ){
    if(dom.addEventListener){
        dom.addEventListener(type,handle,capture)
    }else if(dom.attachEvent){
        dom.attachEvent('on'type,handle)
    }
}
var t = document.getElementById('test');

addEvent(t, 'click', function(){});

移除事件

$('#test').off('click', fn);



var deleteEvent = function(dom, type, handle) {   

  if(dom.removeEventListener) {    

    dom.removeEventListener(type, handle);   

  } else if(dom.detachEvent) {   

    dom.detachEvent('on' + type, handle);   

  } };

var t = document.getElementById('test');

deleteEvent(t, 'click', fn);

事件代理

$(document).on('click','test',fn)

function eventBorder(e,className,fn){
    var target = e.target;
    while(target){
        if( target && target.nodeName == '#doucment' ){
            break;
        }else if(target.classList.contains(className)){
            fn();
            breadk;
        };
        target = target.parentNode;     
    }
}
addEvent(document,'click',function(e){
    eventBroker(e,'test',function(){})
})

获取Event对象

$('#test', 'click', function(event){

  event = event.originalEvent;

});



var t = document.getElementById('test');

addEvent(t, 'click', function(event){

  event = event || window.event;

});

DOM加载完毕

$(doucment).ready(function(){})

functon ready(fn){
    if( doucment.readyState != 'loading' ){
        // ie9+   

    document.addEventListener('DOMContentLoaded', fn);   

  } else {   

    // ie8   

    document.attachEvent('onreadystatechange', function() {   

      if (document.readyState != 'loading'){   

        fn();   

      }   

    });   

  }
}

指定事件触发

$('#test').trigger('click');



function trigger(elem, type) {

  if (document.createEvent) {   

    var event = document.createEvent('HTMLEvents');   

    event.initEvent(type, true, false);   

    elem.dispatchEvent(event);  

  } else {   

    elem.fireEvent('on' + type);  

  }

}




var t = document.getElementById('test');

trigger(t, 'click');

5.AJAX

GET

$.get("test.php", { name: "TG"},   

  function(data){   

    console.log(data);   

});



var xhr= new XMLHttpRequest();  

xhr.open('GET', 'test.php?name=TG', true); // false(同步)  

xhr.onreadystatechange = function() {   

  if (xhr.readyState === 4) {   

    if (xhr.status >= 200 && xhr.status < 400) {   

      // 成功   

      var data = JSON.parse(xhr.responseText);   

    } else {   

     // 错误   

    }   

  }  

};

xhr.send(null);

POST

$.post("test.php", { name: "TG"},   

  function(data){   

    console.log(data);   

});



var xhr= new XMLHttpRequest();   

xhr.open('POST', 'test.php', true); // false(同步)  

xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");  // 必需

xhr.onreadystatechange = function() {       

  if (xhr.readyState === 4) {       

    if (xhr.status >= 200 && xhr.status < 400) {       

      // 成功       

      var data = JSON.parse(xhr.responseText);       

    } else {       

      // 错误       

    }       

  }     

};

var data = {name: "t"};  

xhr.send(data);

Fetch请求

fetch(url).then(function (response) {      

  return response.json();    

}).then(function (jsonData) {      

  console.log(jsonData);    

}).catch(function () {      

  console.log('出错了');    

});

POST

fetch(url,{   

  method: 'POST',   

  headers: {   

    'Content-Type': 'application/x-www-form-urlencoded'   

  },   

  body: 'name=TG&love=1'

}).then(function(response){})

6.数组

判断元素是否在数组内

$.inArray(item,array)

array.indexOf(item)

判断是否在数组

$.isArray(arr)

Array.isArray(arr)

7、特效

隐藏显示

$('#test').hide();



var t = document.getElementById('test');

t.style.display = 'none';



$('#test').show();



t.style.display = 'block';

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 一、样式篇 第1章 初识jQuery (1)环境搭建 进入官方网站获取最新的版本 http://jquery.co...
    凛0_0阅读 3,376评论 0 44
  • 原文链接 http://blog.poetries.top/2016/10/20/review-jQuery 关注...
    程序员poetry阅读 16,643评论 18 503
  • 第一章 jQuery简介 1-1 jQuery简介 1.简介 2.优势 3.特性与工具方法 1-2 环境搭建 进入...
    mo默22阅读 1,581评论 0 11
  • jQuery基础(一)——样式篇 1-2环境搭建 1-3 jQuery HelloWorld体验 $(docume...
    croyance0601阅读 1,080评论 0 8
  • 今天是周末,妈妈同意我去了。家住几天,我高兴极了,就叫上我,姐姐一起出发了,我们是坐公交车去的所以行程很慢等...
    limaolin阅读 179评论 0 0