UNPKG

html-traits-on

Version:

A trait to listen to events and perform an action or submit a form.

2 lines (1 loc) 1.49 kB
(()=>{function a(i){return i?new Function(`return {${i}}`)():null}function n(i,t){for(let e in i)if(i.hasOwnProperty(e)){if(typeof i[e]=="object"&&i[e]!==null&&t[e]){if(!n(i[e],t[e]))return!1}else if(i[e]!==t[e])return!1}return!0}let o=i=>document.querySelector(i),l=i=>document.querySelectorAll(i);class h{constructor(t){this.el=t,this.action=t.dataset.action,this.form=t instanceof HTMLFormElement?t:t.form,this.form&&(this.submitter=t instanceof HTMLFormElement?null:t instanceof HTMLButtonElement?t:t.closest('[type="submit"]')),this._lastCalled=0,this._interval=+(t.dataset.debounce||0),this._match=a(t.dataset.match),this._notMatch=a(t.dataset.matchNot);let e=t.dataset.targetEl;e&&(this.targetEl=document.querySelector(e));let s=t.dataset.events?.split(" ");if(s?.length)for(let r of s)r==="load"?this.action!=null?this.runAction():this.form?.requestSubmit(this.submitter):(this.targetEl??document).addEventListener(r,this)}handleEvent(t){if(t&&(this._match&&!n(this._match,t)||this._notMatch&&n(this._notMatch,t)))return;let e=this._interval;if(e&&this._lastCalled+e>Date.now()){this._lastCalled=Date.now(),this._id&&clearTimeout(this._id),this._id=setTimeout(()=>this.handleEvent(t),e);return}this._lastCalled=Date.now(),this.action!=null?this.runAction(t):this.form?.requestSubmit(this.submitter)}runAction(t){if(!this._action){let e=this.action;if(!e)return;this._action=new Function("event","$","$$",e).bind(this.el)}this._action(t,o,l)}}window.defineTrait?.("on",h);})();