class Elems {
constructor() {
this.listeners = new Map();// коллекция элементов и обрабочиков
this.options = { triggers: ['click'] }
this.el=document.documentElement;
}
toggle(){}
show(){}
hide(){}
clickOutsideHandler(){}
addEvenetsListeners() {
/**
* Функция обновления коллекции обработчиков на элементе
*
* @author teknik2008
* @param {HTMLElements} el - элемент для которого устанавливаетсся обработчик
* @param {string} event - событие которое на которое устанавливаетсся обработчик
* @param {function} handler - обработчик события
* @returns {void}
*/
let listeners = this.listeners;
function addListenersCollections(el, event, handler) {
if (!listeners.has(el)) {
let model = {};
model[event] = [];
model[event].push(handler);
listeners.set(el, model);
return;
}
let model = listeners.get(el);
model[event] = event in model ? model[event] : [];
model[event].push(handler);
listeners.set(el, model);
}
this.options.triggers.forEach((event) => {
switch (event) {
case 'click': {
let elHandler = this.toggle.bind(this);
this.el.addEventListener('click', elHandler, false);
addListenersCollections(this.el, 'click', elHandler);
let documentHandler = this.clickOutsideHandler;
document.addEventListener('click', documentHandler, false);
addListenersCollections(document, 'click', documentHandler);
break;
}
case 'hover': {
this.el.addEventListener('mouseenter', this.show.bind(this), false);
this.el.addEventListener('mouseleave', this.hide.bind(this), true);
break;
}
case 'focus': {
this.el.addEventListener('focus', this.show.bind(this), false);
this.el.addEventListener('blur', this.hide.bind(this), true);
break;
}
default:
throw new Error(`This ${event} is not defined.`);
}
});
}
removeEventListener() {
let listeners = this.listeners;
let elems = [this.el, document];
this.options.triggers.forEach((event) => {// тут я понял что можно было коллекцию сделать через события, но я думаю мысель понятна
elems.forEach(el => {
if (!listeners.has(el)) {
return;
}
let model = listeners.get(el);
if(!(event in model)){
return;
}
let handlers=model[event];
handlers.forEach(handler=>{
console.log(el,event,handler)
el.removeEventListener(event,handler);
})
})
})
}
}
var setBlur = document.getElementsByTagName("img");
function setListenerForImage(){
for(var i = 0; i < setBlur.length; i++){
setBlur[i].addEventListener("click", blurStyle);
}
}
function blurStyle(e){
var img=this;
var state=img.getAttribute('blur');
if(e.mousedown) return;
if(state == 1){
img.style.filter = "";
img.setAttribute('blur',0);
}else{
img.setAttribute('blur',1);
img.style.filter = "blur(5px)";
}
}
setListenerForImage();
async function requestTo(options, callback) {
let resul;
try {
resul = await axios(options)//я использую axios, можно заюзать request-promise
return resul;// тут результат запроса
} catch (e) {
//Тут ошибка, но пойдет в результат, можно сделать thow
return e
}
}
requestTo(options), then((r) => {
console.log(r)// тут результат
}).catch(err => {
console.log(err)// тут ошибки
})
hash
вместо hashSync
const crypto = require('crypto');
const util = require('util');
const cryptoPbkdf2 = util.promisify(crypto.pbkdf2);
let hashLength = 16;
let iterations = 10;
async function createSaltHash(email) {
let salt = crypto.randomBytes(hashLength).toString('base64');
let hash = (await cryptoPbkdf2(email, salt, iterations, hashLength, 'sha512')).toString();
return { salt, hash }
};
async function checkSaltHash(email, salt, hash) {
if (!email || !hash || !salt) return false;
let userHash = (await cryptoPbkdf2(email, salt, iterations, hashLength, 'sha512')).toString();
let check = userHash == hash;
return check;
};