1(function(){2'use strict';34classCascadingQueries{5// ['example.com'] or null, if null then any domains are targeted.6static targetDomains =null;7// ['foo', 'bar'] or null, if null then any queries are accepted.8static targetQueries =null;910staticmain(){11delegateEvent('a[href]','click',(evt, anchor)=>{12const url = anchor.href;13if(url ==='')return;1415if(this.isTargetUrl(url)){16 anchor.href=this.mergeUrlQueries(url,document.URL);17}18});19}2021staticisTargetUrl(url){22if(!Array.isArray(this.targetDomains))returntrue;23const urlObject =newURL(url);24const hostname = urlObject.hostname;25returnthis.targetDomains.includes(hostname);26}2728staticisTargetQuery(key){29if(!Array.isArray(this.targetQueries))returntrue;30if(this.targetQueries.includes(key))returntrue;31// if targetQuery is `foo` and key is `foo[...]`32if(this.targetQueries.includes(key.replace(/\[[^\]]*\]$/,'')))returntrue;33returnfalse;34}3536staticgetQueryParams(queriesUrl){37let params =null;38try{39 params =newURL(queriesUrl).searchParams;40}41catch(e){42 params =newURLSearchParams(queriesUrl.replace(/^\?/,''));43}44return params;45}4647staticmergeUrlQueries(url,...queries){48const urlObject =newURL(url);49const params = urlObject.searchParams;50for(const query of queries){51for(const[key, value]ofthis.getQueryParams(query)){52if(!this.isTargetQuery(key))continue;53// if key is `foo[]` or `foo[...]`54if(/\[[^\]]*\]$/.test(key)){55if(!params.getAll(key).includes(value)){56 params.append(key, value);57}58}59// if key is `simpleKey`60else{61if(!params.has(key)){62 params.set(key, value);63}64}65}66}67return urlObject.href;68}69}7071functiondelegateEvent(selector, type, listener, options){72if(options ==null) options =false;73document.addEventListener(type,evt=>{74for(let elem = evt.target; elem && elem !==document; elem = elem.parentNode){75if(elem.matches(selector))return listener.call(elem, evt, elem);76}77}, options);78}7980CascadingQueries.main();81}());
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/02/26 03:33