jQuery and its cousins are great, and by all means use them if it makes it easier to develop your application.
If you're developing a library on the other hand, please take a moment to consider if you actually need jQuery as a dependency. Maybe you can include a few lines of utility code, and forgo the requirement. If you're only targeting more modern browsers, you might not need anything more than what the browser ships with.
At the very least, make sure you know what jQuery is doing for you, and what it's not. Some developers believe that jQuery is protecting us from a great demon of browser incompatibility when, in truth, post-IE8, browsers are pretty easy to deal with on their own; and after the Internet Explorer era, the browsers do even more.
var request =newXMLHttpRequest(); request.open('GET','/my/url',true); request.onreadystatechange=function(){if(this.readyState ===4){if(this.status >=200&&this.status <400){// Success!var data =JSON.parse(this.responseText);}else{// Error :(}}}; request.send(); request =null;
ie9+
var request =newXMLHttpRequest(); request.open('GET','/my/url',true); request.onload=function(){if(request.status >=200&& request.status <400){// Success!var data =JSON.parse(request.responseText);}else{// We reached our target server, but it returned an error}}; request.onerror=function(){// There was a connection error of some sort}; request.send();
ie10+
var request =newXMLHttpRequest(); request.open('GET','/my/url',true); request.onload=function(){if(this.status >=200&&this.status <400){// Success!var data =JSON.parse(this.response);}else{// We reached our target server, but it returned an error}}; request.onerror=function(){// There was a connection error of some sort}; request.send();
modern
const response =awaitfetch('/my/url');const data =await response.json();
functionrequest(success, error){var request =newXMLHttpRequest(); request.open('GET','/my/url',true); request.onreadystatechange=function(){if(this.readyState ===4){if(this.status >=200&&this.status <400){// Success! If you expect this to be JSON, use JSON.parse!success(this.responseText,this.status);}else{error();}}}; request.send();}
ie9+
functionrequest(success, error){var request =newXMLHttpRequest(); request.open('GET','/my/url',true); request.onload=function(){if(this.status >=200&&this.status <400){// Success! If you expect this to be JSON, use JSON.parse!success(this.responseText,this.status);}else{// We reached our target server, but it returned an errorerror();}}; request.onerror=function(){error();}; request.send();}
modern
const response =awaitfetch('/my/url');if(!response.ok){}const body =await response.text();
if(el.classList){ el.classList.add(className);}else{var current = el.className, found =false;var all = current.split(' ');for(var i =0; i < all.length,!found; i++) found = all[i]=== className;if(!found){if(current ==='') el.className = className;else el.className +=' '+ className;}}
functionforEachElement(selector, fn){var elements = document.querySelectorAll(selector);for(var i =0; i < elements.length; i++)fn(elements[i], i);}forEachElement(selector,function(el, i){});
ie9+
var elements = document.querySelectorAll(selector);Array.prototype.forEach.call(elements,function(el, i){});
functionfilter(selector, filterFn){var elements = document.querySelectorAll(selector);var out =[];for(var i = elements.length; i--;){if(filterFn(elements[i])) out.unshift(elements[i]);}return out;}filter(selector, filterFn);
// For direct descendants only, see https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelectorAll#user_notes el.querySelectorAll(`:scope ${selector}`);
functiongetHeight(el){var d =/^\d+(px)?$/i;if(window.getComputedStyle) el =parseFloat(getComputedStyle(el,null).height.replace('px',''));else{var c = el.currentStyle.height;if(d.test(c)) el =parseInt(c);else{ d = el.style.left;var e = el.runtimeStyle.left; el.runtimeStyle.left = el.currentStyle.left; el.style.left = c ||0; c = el.style.pixelLeft; el.style.left = d; el.runtimeStyle.left = e; el = c;}}return el;}getHeight(el);
// Varies based on the properties being retrieved, some can be retrieved from el.currentStyle// https://github.com/jonathantneal/Polyfills-for-IE8/blob/master/getComputedStyle.js
functiongetWidth(el){var d =/^\d+(px)?$/i;if(window.getComputedStyle) el =parseFloat(getComputedStyle(el,null).width.replace('px',''));else{var c = el.currentStyle.width;if(d.test(c)) el =parseInt(c);else{ d = el.style.left;var e = el.runtimeStyle.left; el.runtimeStyle.left = el.currentStyle.left; el.style.left = c ||0; c = el.style.pixelLeft; el.style.left = d; el.runtimeStyle.left = e; el = c;}}return el;}getWidth(el);
// nextSibling can include text nodesfunctionnextElementSibling(el){do{ el = el.nextSibling;}while(el && el.nodeType !==1);return el;} el.nextElementSibling ||nextElementSibling(el);
ie9+
el.nextElementSibling;
modern
functionnext(el, selector){const nextEl = el.nextElementSibling;if(!selector ||(nextEl && nextEl.matches(selector))){return nextEl;}returnnull;}next(el);// Or, with an optional selectornext(el,'.my-selector');
functionposition(el){const{top, left}= el.getBoundingClientRect();const{marginTop, marginLeft}=getComputedStyle(el);return{top: top -parseInt(marginTop,10),left: left -parseInt(marginLeft,10)};}
$(el).prev();// Or, with an optional selector$(el).prev('.my-selector');
ie8+
// prevSibling can include text nodesfunctionpreviousElementSibling(el){do{ el = el.previousSibling;}while(el && el.nodeType !==1);return el;} el.previousElementSibling ||previousElementSibling(el);
ie9+
el.previousElementSibling;
modern
functionprev(el, selector){const prevEl = el.previousElementSibling;if(!selector ||(prevEl && prevEl.matches(selector))){return prevEl;}returnnull;}prev(el);// Or, with an optional selectorprev(el,'.my-selector');
functionsetHeight(el, val){if(typeof val ==='function') val =val();if(typeof val ==='string') el.style.height = val;else el.style.height = val +'px';}setHeight(el, val);
functionsetWidth(el, val){if(typeof val ==='function') val =val();if(typeof val ==='string') el.style.width = val;else el.style.width = val +'px';}setWidth(el, val);
$(el).on(eventName, eventHandler);// Or when you want to delegate event handling$(el).on(eventName, selector, eventHandler);
ie8+
functionaddEventListener(el, eventName, handler){if(el.addEventListener){ el.addEventListener(eventName, handler);return handler;}else{varwrappedHandler=function(event){handler.call(el, event);}; el.attachEvent('on'+ eventName, wrappedHandler);return wrappedHandler;}}// Use the return value to remove that event listener, see #offvar handlerToRemove =addEventListener(el, eventName, handler);
ie9+
functionaddEventListener(el, eventName, eventHandler, selector){if(selector){varwrappedHandler=function(e){if(e.target && e.target.matches(selector)){eventHandler(e);}}; el.addEventListener(eventName, wrappedHandler);return wrappedHandler;}else{ el.addEventListener(eventName, eventHandler);return eventHandler;}}// Use the return value to remove that event listener, see #offaddEventListener(el, eventName, eventHandler);// Or when you want to delegate event handlingaddEventListener(el, eventName, eventHandler, selector);
modern
functionaddEventListener(el, eventName, eventHandler, selector){if(selector){constwrappedHandler=(e)=>{if(!e.target)return;const el = e.target.closest(selector);if(el){eventHandler.call(el, e);}}; el.addEventListener(eventName, wrappedHandler);return wrappedHandler;}else{constwrappedHandler=(e)=>{eventHandler.call(el, e);}; el.addEventListener(eventName, wrappedHandler);return wrappedHandler;}}// Use the return value to remove that event listener, see #offaddEventListener(el, eventName, eventHandler);// Or when you want to delegate event handlingaddEventListener(el, eventName, eventHandler, selector);
functiontrigger(el, eventType){if(typeof eventType ==='string'&&typeof el[eventType]==='function'){ el[eventType]();}elseif(eventType ==='string'){if(document.createEvent){var event = document.createEvent('HTMLEvents'); event.initEvent(eventType,true,false); el.dispatchEvent(event);}else{ el.fireEvent('on'+ eventType);}}else{ el.dispatchEvent(eventType);}}// For a full list of event types: https://developer.mozilla.org/en-US/docs/Web/API/document.createEventtrigger(el,'focus');
ie9+
functiontrigger(el, eventType){if(typeof eventType ==='string'&&typeof el[eventType]==='function'){ el[eventType]();}else{var event;if(eventType ==='string'){ event = document.createEvent('HTMLEvents'); event.initEvent(eventType,true,false);}else{ event = eventType;} el.dispatchEvent(event);}}// For a full list of event types: https://developer.mozilla.org/en-US/docs/Web/API/document.createEventtrigger(el,'focus');
modern
functiontrigger(el, eventType){if(typeof eventType ==='string'&&typeof el[eventType]==='function'){ el[eventType]();}else{const event =typeof eventType ==='string'?newEvent(eventType,{bubbles:true}): eventType; el.dispatchEvent(event);}}trigger(el,'focus');// For a full list of event types: https://developer.mozilla.org/en-US/docs/Web/API/Eventtrigger(el,newPointerEvent('pointerover'));
varextend=function(out){ out = out ||{};for(var i =1; i < arguments.length; i++){if(!arguments[i])continue;for(var key in arguments[i]){if(arguments[i].hasOwnProperty(key)) out[key]= arguments[i][key];}}return out;};extend({}, objA, objB);
functionisNumeric(num){if(typeof num ==='number')return num - num ===0;if(typeof num ==='string'&& num.trim()!=='')return Number.isFinite ? Number.isFinite(+num):isFinite(+num);returnfalse;}isNumeric(val);
modern
functionisNumeric(num){if(typeof num ==='number')return num - num ===0;if(typeof num ==='string'&& num.trim()!=='')return Number.isFinite(+num);returnfalse;}isNumeric(val);
functionslice(els, start, end){var f =Array.prototype.slice;try{f.call(document.documentElement);}catch(h){Array.prototype.slice=function(g, b){ b ='undefined'!==typeof b ? b :this.length;if('[object Array]'===Object.prototype.toString.call(this))returnf.call(this, g, b);var e =[];var a =this.length;var c = g ||0; c =0<= c ? c : Math.max(0, a + c);var d ='number'==typeof b ? Math.min(b, a): a;0> b &&(d = a + b); d -= c;if(0< d)if(((e =Array(d)),this.charAt))for(a =0; a < d; a++) e[a]=this.charAt(c + a);elsefor(a =0; a < d; a++) e[a]=this[c + a];return e;};}return els.slice(start, end);}slice(els, start, end);
functiontoArray(selector){var array =[];var elements = document.querySelectorAll(selector);for(var i =0; i < elements.length; i++) array.push(elements[i]);return array;}