介绍 jQuery 是当今网络上使用最多的库,虽然 jQuery 相对较小且运行速度相当快,但它仍然代表应用程序中的一定量的开销。jQuery 提供的大部分功能现在都可以通过原生 DOM API 实现,并且在当今的 Web 应用程序中可能是不必要的。一些开发者认为,jQuery 可以保护我们不受浏览器兼容的影响,而事实上,在 IE8 之后,浏览器自己就很容易处理兼容问题了,而在 IE 时代之后,浏览器在兼容方面会做得更多。
fetch 替代 AJAX 方法 $(selector).load 1 2 3 4 5 $('#selector' ).load ('/path/to/template.html' ); const response = await fetch ('/path/to/template.html' );const body = await response.text ();document .querySelector ('#selector' ).innerHTML = body;
$.get 1 2 3 4 5 6 7 8 $.get('/my/url', function(data){ // 处理 data 数据 }); // 等价替换 const response = await fetch('/my/url'); if (!response.ok) { } const data = await response.text();
$.getJSON 1 2 3 4 5 6 $.getJSON ('/my/url' , function (data ){ }); const response = await fetch ('/my/url' );const data = await response.json ();
$.ajax 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $.ajax ({ type : 'POST' , url : '/my/url' , data : data, success : function (res ) {}, error : function ( ) {} }); const res = await fetch ('/my/url' , { method : 'POST' , headers : { 'Content-Type' : 'application/json' }, body : JSON .stringify (data) });
元素操作 $(el).toggle 1 2 3 $(el).toggle (); el.classList .toggle ('hide' );
1 2 3 .hide { display : none; }
$(el).addClass 1 2 3 $(el).addClass (className); el.classList .add (className);
$(el).removeClass 1 2 3 $(el).removeClass (className); el.classList .remove (className);
$(el).hasClass 1 2 3 $(el).hasClass (className); el.classList .contains (className);
$(el).css 1 2 3 4 5 6 7 $(el).css (ruleName); getComputedStyle (el)[ruleName];$(el).css (prop, val); el.style .cssText = `${prop} : ${val} ` ;
$(target).after 1 2 3 $(target).after (element); target.after (element);
$(target).before 1 2 3 $(target).before (element); target.before (el);
$(parent).append 1 2 3 $(parent).append (el); parent.append (el);
$(el).appendTo 1 2 3 $(el).appendTo (parent); parent.append (el);
$(el).clone 1 2 3 $(el).clone (); el.cloneNode (true );
$(el).closest 1 2 3 $(el).closest (selector); el.closest (selector);
$.contains 1 2 3 $.contains (el, childNode); el.contains (childNode);
:contains 1 2 3 4 5 $("div:contains('my text')" ); [...document .querySelectorAll ('div' )].filter ((el ) => el.textContent .includes ('my text' ) );
Create Elements 1 2 3 4 5 6 7 8 $('<div>Hello World!</div>' ); function generateElements (html ) { const template = document .createElement ('template' ); template.innerHTML = html.trim (); return template.content .children ; } generateElements ('<div>Hello World!</div>' );
$(selector).each 1 2 3 $(selector).each (function (i, el ) {}); document .querySelectorAll (selector).forEach ((el, i ) => {});
$(el).empty 1 2 3 $(el).empty (); el.replaceChildren ();
$(selector).filter 1 2 3 $(selector).filter (filterFn); [...document .querySelectorAll (selector)].filter (filterFn);
$(el).find 1 2 3 $(el).find (selector); el.querySelectorAll (`:scope ${selector} ` );
$(el).height|width 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $(el).height (); $(el).width (); el.getBoundingClientRect ().height ; el.getBoundingClientRect ().width ; $(el).height (val); $(el).width (val); function setHeight (el, val ) { if (typeof val === 'function' ) val = val (); else if (typeof val === 'string' ) el.style .height = val; else el.style .height = val + 'px' ; } function setWidth (el, val ) { if (typeof val === 'function' ) val = val (); else if (typeof val === 'string' ) el.style .width = val; else el.style .width = val + 'px' ; }
$(el).index 1 2 3 $(el).index (); [...el.parentNode .children ].indexOf (el);
$(el).innerHeight|innerWidth 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 $(el).innerHeight (); $(el).innerHeight (150 ); $(el).innerWidth (); $(el).innerWidth (150 ); function innerHeight (el, value ) { if (value === undefined ) { return el.clientHeight ; } else { el.style .height = value; } } function innerWidth (el, value ) { if (value === undefined ) { return el.clientWidth ; } else { el.style .width = value; } } innerHeight (el);innerHeight (el, 150 );innerWidth (el);innerWidth (el, 150 );
$(selector).last 1 2 3 $(selector).last (); document .querySelectorAll (selector).at (-1 );
$(el).is 1 2 3 $(el).is ('.my-class' ); el.matches ('.my-class' );
$(el).offset 1 2 3 4 5 6 7 8 9 10 $(el).offset (); function offset (el ) { const box = el.getBoundingClientRect (); const docElem = document .documentElement ; return { top : box.top + window .pageYOffset - docElem.clientTop , left : box.left + window .pageXOffset - docElem.clientLeft }; }
相对视口的位置 1 2 3 4 5 6 7 8 9 function offset (el ) { const offset = $(el).offset (); return { top : offset.top - document .body .scrollTop , left : offset.left - document .body .scrollLeft }; } el.getBoundingClientRect ();
$(el).offsetParent 1 2 3 $(el).offsetParent (); el.offsetParent || el;
$(el).outerHeight|outerWidth 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 $(el).outerHeight (); $(el).outerWidth (); el.offsetHeight ; el.offsetWidth ; $(el).outerHeight (true ); $(el).outerWidth (true ); function outerHeight (el ) { const style = getComputedStyle (el); return ( el.getBoundingClientRect ().height + parseFloat (style.getPropertyValue ('marginTop' )) + parseFloat (style.getPropertyValue ('marginBottom' )) ); } function outerWidth (el ) { const style = getComputedStyle (el); return ( el.getBoundingClientRect ().width + parseFloat (style.getPropertyValue ('marginLeft' )) + parseFloat (style.getPropertyValue ('marginRight' )) ); } outerHeight (el);outerWidth (el);
$(el).parents 1 2 3 4 5 6 7 8 9 $(el).parents (selector); function parents (el, selector ) { const parents = []; while ((el = el.parentNode ) && el !== document ) { if (!selector || el.matches (selector)) parents.unshift (el); } return parents; }
$(el).position 1 2 3 4 5 6 7 8 9 10 $(el).position (); function position (el ) { const {top, left} = el.getBoundingClientRect (); const {marginTop, marginLeft} = getComputedStyle (el); return { top : top - parseInt (marginTop), left : left - parseInt (marginLeft) }; }
$(el).next|prev 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 $(el).next (); $(el).prev (); el.nextElementSibling ; el.previousElementSibling ; $(el).next (selector); $(el).prev (selector); function next (el, selector ) { if (selector) { let next = el.nextElementSibling ; while (next && !next.matches (selector)) { next = next.nextElementSibling ; } return next; } } function prev (el, selector ) { if (selector) { let previous = el.previousElementSibling ; while (previous && !previous.matches (selector)) { previous = previous.previousElementSibling ; } return previous; } }
$(el|selector).remove 1 2 3 4 5 6 7 8 9 $(el).remove (); el.remove (); $(selector).remove (); for (const el of [...document .querySelectorAll (selector)]) { el.remove (); }
$(el).replaceWith 1 2 3 $(el).replaceWith (string); el.outerHTML = string;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $(el).scrollLeft (); $(el).scrollLeft (value); function scrollLeft (el, value ) { if (value === undefined ) { return el.pageXOffset ; } else { if (el === window || el.nodeType === 9 ) { el.scrollTo (value, el.pageXOffset ); } else { el.pageXOffset = value; } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 $(el).scrollTop (); $(el).scrollTop (value); function scrollTop (el, value ) { if (value === undefined ) { return el.pageYOffset ; } else { if (el === window || el.nodeType === 9 ) { el.scrollTo (value, el.pageYOffset ); } else { el.pageYOffset = value; } } }
1 2 3 $(formElement).serialize (); new URLSearchParams (new FormData (formElement)).toString ();
$(el).siblings 1 2 3 $(el).siblings (); [...el.parentNode .children ].filter ((child ) => child !== el);
$(el).wrap 1 2 3 4 5 6 7 el.wrap ('<div></div>' ); function wrap (el ) { const wrappingElement = document .createElement ('div' ); el.replaceWith (wrappingElement); wrappingElement.appendChild (el); }
$(el).unwrap 1 2 3 $(el).unwrap (); el.replaceWith (...el.childNodes );
$(el).val 1 2 3 4 5 6 7 8 9 10 11 $(el).val (); function val (el ) { if (el.options && el.multiple ) { return el.options .filter ((option ) => option.selected ) .map ((option ) => option.value ); } else { return el.value ; } }
事件操作 $(document).ready 1 2 3 4 5 6 7 8 9 $(document ).ready (function ( ) {}); function ready (fn ) { if (document .readyState !== 'loading' ) { fn (); } else { document .addEventListener ('DOMContentLoaded' , fn); } }
$(document).on 1 2 3 4 5 6 7 $(document ).on (eventName, elementSelector, handler); document .addEventListener (eventName, (event ) => { if (event.target .closest (elementSelector)) { handler.call (event.target , event); } });
$(el).click 1 2 3 $(el).click (function ( ) {}); el.addEventListener ('click' , () => {});
$(el).on 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $(el).on (eventName, eventHandler); $(el).on (eventName, selector, eventHandler); function addEventListener (el, eventName, eventHandler, selector ) { if (selector) { const wrappedHandler = (e ) => { if (e.target && e.target .matches (selector)) { eventHandler (e); } }; el.addEventListener (eventName, wrappedHandler); return wrappedHandler; } else { el.addEventListener (eventName, eventHandler); return eventHandler; } } addEventListener (el, eventName, eventHandler);addEventListener (el, eventName, eventHandler, selector);
$(el).off 1 2 3 $(el).off (eventName, eventHandler); el.removeEventListener (eventName, eventHandler);
$(el).trigger 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 $(el).trigger ('my-event' , {some : 'data' }); const event = new CustomEvent ('my-event' , {detail : {some : 'data' }});el.dispatchEvent (event); $(el).trigger ('focus' ); $(el).trigger (new PointerEvent ('pointerover' )); function trigger (el, eventType ) { if (typeof eventType === 'string' && typeof el[eventType] === 'function' ) { el[eventType](); } else { const event = eventType === 'string' ? new Event (eventType, {bubbles : true }) : eventType; el.dispatchEvent (event); } } trigger (el, 'focus' );trigger (el, new PointerEvent ('pointerover' ));
内置操作 $.inArray|isArray 1 2 3 4 5 $.inArray (item, array); $.isArray (arr); array.indexOf (item); Array .isArray (arr);
$.each|map 1 2 3 4 5 6 7 8 9 $.each (array, fn); $.map (array, fn); array.forEach (fn); array.map (fn); $.each (obj, function (key, value ) {}); for (const [key, value] of Object .entries (obj)) {}
$.proxy 1 2 3 $.proxy (fn, context); fn.bind (context);
$.extend 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 $.extend ({}, objA, objB); const result = {...objA, ...objB};$.extend (true , {}, objA, objB); function deepExtend (out, ...arguments_ ) { if (!out) { return {}; } for (const obj of arguments_) { if (!obj) { continue ; } for (const [key, value] of Object .entries (obj)) { switch (Object .prototype .toString .call (value)) { case '[object Object]' : out[key] = deepExtend (out[key], value); break ; case '[object Array]' : out[key] = deepExtend (new Array (value.length ), value); break ; default : out[key] = value; } } } return out; } deepExtend ({}, objA, objB);
$.isNumeric 1 2 3 4 5 6 7 8 9 $.isNumeric (val); function isNumeric (num ) { if (typeof num === 'number' ) return num - num === 0 ; if (typeof num === 'string' && num.trim () !== '' ) return Number .isFinite (+num); return false ; } isNumeric (val);
$.parseHTML 1 2 3 4 5 6 7 8 $.parseHTML (htmlString); function parseHTML (str ) { const tmp = document .implementation .createHTMLDocument ('' ); tmp.body .innerHTML = str; return [...tmp.body .childNodes ]; } parseHTML (htmlString);
$.type 1 2 3 4 5 6 $.type (obj); Object .prototype .toString .call (obj) .replace (/^\[object (.+)\]$/ , '$1' ) .toLowerCase ();
原文链接