Попытка сократить мой код, чтобы заставить работать несколько модалов javascript - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать модальное содержимое для 5 изображений, я несколько часов пытался сократить свой код с помощью циклов for, но у меня все еще есть много строк, которые я не знаю, как сократить. Я только начинаю с javascript. Ниже приведен мой код, работающий, но слишком длинный.

var modal = [];
for (i=0; i<5; i++)
{
    modal[i] = document.getElementById('simplemodal'+i);
}

var modalbtn = [];
for (i=0; i<5; i++) {
    modalbtn[i] = document.getElementById('pics-post'+i);
    modalbtn[i].addEventListener('click', eval('openmodal'+i));
    window.addEventListener('click', eval('clickoutside'+i));
}


var closebtn0 = document.getElementsByClassName('closebtn')[0];
var closebtn1 = document.getElementsByClassName('closebtn')[1];
var closebtn2 = document.getElementsByClassName('closebtn')[2];
var closebtn3 = document.getElementsByClassName('closebtn')[3];
var closebtn4 = document.getElementsByClassName('closebtn')[4];


for (i=0; i<5; i++) {
    eval('closebtn'+i.addEventListener('click', eval('closemodal'+i)));
}


function openmodal0(){
    modal[0].style.display = 'block';
}
function openmodal1(){
    modal[1].style.display = 'block';
}
function openmodal2(){
    modal[2].style.display = 'block';
}
function openmodal3(){
    modal[3].style.display = 'block';
}
function openmodal4(){
    modal[4].style.display = 'block';
}


function closemodal0(){
    modal[0].style.display = 'none';
}
function closemodal1(){
    modal[1].style.display = 'none';
}
function closemodal2(){
    modal[2].style.display = 'none';
}
function closemodal3(){
    modal[3].style.display = 'none';
}
function closemodal4(){
    modal[4].style.display = 'none';
}
function closemodal5(){
    modal[5].style.display = 'none';
}


function clickoutside0(e){
    if(e.target == modal[0])
        modal[0].style.display = 'none';
}
function clickoutside1(e){
    if(e.target == modal[1])
        modal[1].style.display = 'none';
}
function clickoutside2(e){
    if(e.target == modal[2])
        modal[2].style.display = 'none';
}
function clickoutside3(e){
    if(e.target == modal[3])
        modal[3].style.display = 'none';
}
function clickoutside4(e){
    if(e.target == modal[4])
        modal[4].style.display = 'none';
}

Я пытался использовать eval для увеличения имени переменной, но не смог найти правильный способ заставить его работать.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Вы можете использовать общую функцию для открытия модели и закрытия модели, например:

function openmodel (i) {
  model[i].style.display = 'block'
}

function clickoutside(e, i){
    if(e.target == modal[i])
        modal[i].style.display = 'none';
}

И изменить слушателя событий, например:

modalbtn[i].addEventListener('click', function () {
  openmodel(i)
})
window.addEventListener('click', function (e) {
   clickoutside(e, i)
})

И вместо этого

eval('closebtn'+i.addEventListener('click', eval('closemodal'+i)))

Вы можете использовать:

var closebtn = document.getElementsByClassName('closebtn')
for (let i = 0; i < closebtn.length; i++) {
  closebtn[i].addEventListener('click', function () {
    closeModel(i)
  })
}

и изменять функцию closeModel, например:

function closemodal(i){
    modal[i].style.display = 'none';
}
0 голосов
/ 16 января 2020

Вы можете поместить все в один l oop и использовать анонимные функции.

var modal = [];
var modalbtn = [];
var closebtn = [];
for (i=0; i<5; i++) {

    modal[i] = document.getElementById('simplemodal'+i);

    modalbtn[i] = document.getElementById('pics-post'+i);
    modalbtn[i].addEventListener('click', () => {
        modal[i].style.display = 'block';
    });
    window.addEventListener('click', eval('clickoutside'+i));

    closebtn[i] = document.getElementsByClassName('closebtn')[i];
    closebtn[i].addEventListener('click', () => {
        modal[i].style.display = 'none';
    });
}
...