-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathslideToggle.js
More file actions
99 lines (80 loc) · 3.05 KB
/
Copy pathslideToggle.js
File metadata and controls
99 lines (80 loc) · 3.05 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*-------------------------------------------------
jQuery's slideToggle in pure JS
[#] Author: HT (@ht-devx)
[#] Version: 1.0.0
[#] Last updated: 2024-06-13 8:14PM [GMT-7]
github.com/ht-devx/slideToggle
-------------------------------------------------*/
window.slideToggle = function(params){
let slideToggleInit = (params) => {
let trigger = params.trigger;
let content = params.content;
let vs = [trigger, content];
let vs_present = vs.every(v => typeof v !== "undefined");
if(vs_present){
let triggerType = ({}).toString.call(trigger).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
let contentType = ({}).toString.call(content).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
if(!(triggerType == "null" || contentType == "null")){
/*----- TRIGGER -----*/
let idTrigger;
if(triggerType !== "string" && triggerType.slice(0,4) == "html" && triggerType.slice(-7) == "element"){
idTrigger = trigger;
} else {
let tdknr = document.querySelector(trigger);
idTrigger = tdknr ? tdknr : null
}
/*----- CONTENT -----*/
let idContent;
if(triggerType !== "string" && triggerType.slice(0,4) == "html" && triggerType.slice(-7) == "element"){
idContent = content;
} else {
let dkrzo = document.querySelector(content);
idContent = dkrzo ? dkrzo : null
}
/*----- DO THE THING -----*/
if(idContent){
Array.from(idContent.childNodes)?.forEach(node => {
if(node.nodeType === 3 && node.data.trim().length && (node.parentNode && !node.parentNode.matches("span"))){
let span = document.createElement("span");
node.before(span);
span.appendChild(node);
}
})
idContent.classList.add("slidetoggle-content");
if(!idContent.querySelector(".slidetoggle-outer")){
let outer = document.createElement("div");
outer.classList.add("slidetoggle-outer");
idContent.prepend(outer);
let inner = document.createElement("div");
inner.classList.add("slidetoggle-inner");
outer.append(inner);
idContent.querySelectorAll(":scope > *:not(.slidetoggle-outer)")?.forEach(e => {
inner.append(e)
})
}
/*----- CLICK THE THING -----*/
if(idTrigger){
idTrigger.addEventListener("click", () => {
!idTrigger.matches(".active") ? idTrigger.classList.add("active") : idTrigger.classList.remove("active");
if(idContent){
!idContent.matches(".active") ? idContent.classList.add("active") : idContent.classList.remove("active");
}
});
}
}
}//end: sels do exist
else {
if(triggerType == "null"){
console.warn(`[trigger] selector does not exist.`)
}
if(contentType == "null"){
console.warn(`[content] selector does not exist.`)
}
}//end: if sels don't exist
//console.log(contentType)
}//end: all params present
}//end slideToggleInit
document.readyState == "loading" ?
document.addEventListener("DOMContentLoaded", () => slideToggleInit(params)) :
slideToggleInit(params);
}