Оператор If, возвращающий неопределенное, но все еще передающий правильное возвращаемое значение на? Javascript

#javascript #if-statement #return

#javascript #if-statement #Возврат

Вопрос:

Этот скрипт работает… Но это не имеет смысла.

Контекст Я очень новичок в js… Этот скрипт изменяет непрозрачность элемента один за другим, при попытке реализовать «переопределение» наведения, мне пришлось найти способ преобразовать идентификатор наведенных элементов в индекс, используемый скриптом, который выполняет поворот. Таким образом, поток сбрасывается / возобновляется с зависшего элемента.

Проблема Моя проблема заключается в том, что оператор if преобразует идентификаторы в index #s в функции «idConvertNum». Все значения оператора if возвращают неопределенное, даже если идентификаторы совпадают со строковыми значениями!? Проходит только else (4). Странная часть заключается в том, что «i», получающий преобразованный индекс, получает правильное значение?? … Я так запутался.

Большое спасибо, если у вас есть какие-либо советы, мы их очень ценим!

HTML

 <!--main content start-->
<div id="main-container">
<div id="iconGrid">
    <div id="arrowText1" class="arrow">→</div>
    <div id="arrowText2" class="arrow">→</div>
    <div id="arrowText3" class="arrow">→</div>
    <div id="arrowText4" class="arrow">→</div>
    <i id="suppDirIcon"><img onmouseover="onHover(id)" onmouseleave="offHover(id)" id="icon1" class="iconFlow" src="/assets/supplier directory icon.png" alt="supplier directory"></i>
    <i id="videoMeetIcon"><img onmouseover="onHover(id)" onmouseleave="offHover(id)" id="icon2" class="iconFlow" src="/assets/video meeting icon.png" alt="video meetings"></i>
    <i id="factInspIcon"><img onmouseover="onHover(id)" onmouseleave="offHover(id)" id="icon3" class="iconFlow" src="/assets/inspection icon.png" alt="factory inspections"></i>
    <i id="orderSupIcon"><img onmouseover="onHover(id)" onmouseleave="offHover(id)" id="icon4" class="iconFlow" src="/assets/supervision icon.png" alt="order supervision"></i>
    <i id="payProtIcon"><img onmouseover="onHover(id)" onmouseleave="offHover(id)" id="icon5" class="iconFlow" src="/assets/pay icon.png" alt="payment protection"></i>
    <div id="suppDirText" class="iconFlowText">Supplier directory</div>
    <div id="videoMeetText" class="iconFlowText">Video meetings</div>
    <div id="factInspText" class="iconFlowText">Factory inspections</div>
    <div id="orderSupText" class="iconFlowText">Order supervision</div>
    <div id="payProtText" class="iconFlowText">Payment Protection</div>
</div>
<hr class="dividerLine">
  

Javascript

 var iconText = [];
var iconImg = [];
var time = 5000;

// icon subtext
iconText[0] = document.getElementById("suppDirText");
iconText[1] = document.getElementById("videoMeetText");
iconText[2] = document.getElementById("factInspText");
iconText[3] = document.getElementById("orderSupText");
iconText[4] = document.getElementById("payProtText");
// icons
iconImg[0] = document.getElementById("icon1");
iconImg[1] = document.getElementById("icon2");
iconImg[2] = document.getElementById("icon3");
iconImg[3] = document.getElementById("icon4");
iconImg[4] = document.getElementById("icon5");
// starting indexes
var i = 0;
var j = iconImg.length - 1;
// converts id of hovered element to associated index
function idConvertNum(id){
    if (id == "icon1"){ return 0;}
    else if (id == "icon2"){ return 1;}
    else if (id == "icon3"){ return 2;}
    else if (id == "icon4"){ return 3;} // all undefined ??? the ids are == to the strings? why?
    else { return 4;} // always returns 4, no matter which element is hovered ???
}
// resets flow to hovered element
function onHover(id){ // passes element id through html "onmouseenter"
    clearInterval(iconTimer); // stops interval
    changeIconBack(j); // resets all to default
    i = idConvertNum(id); // sets i to index value converted from id

                console.log(idConvertNum()) // always returns 4 but script works as intended?

    if (i==0){ // pairs j to new i
        j = iconImg.length - 1;
    } else {
        j = i - 1;
    };
    iconFlow(); // calls update func
}
// continues flow from last hovered element
function offHover(id){ // passes element id through html "onmouseleave"
    i = idConvertNum(id); // sets i to index value converted from id
    if (i==0){ // pairs j to new i
        j = iconImg.length - 1;
    } else {
        j = i - 1;
    };
    iconFlow(); // calls update func
    iconTimer = setInterval(iconFlow, time); // starts interval flow
}

function changeIcon(i){ // if making changes, remember to match .css file styles
    iconText[i].style.opacity = "1";
    iconImg[i].style.opacity = "1";
    iconImg[i].style.width="90px";
}
function changeIconBack(j){ // if making changes, remember to match .css file styles
    iconText[j].style.opacity = "0.4";
    iconImg[j].style.opacity = "0.4";
    iconImg[j].style.width="70px";
}

function iconFlow(){
    changeIconBack(j)
    changeIcon(i);
    j = i;
    i = (i   1) % iconImg.length; // used modular arithmetic
}

var iconTimer = setInterval(iconFlow, time);
window.onload=iconFlow;
  

Комментарии:

1. Я начал просматривать ваш код, но, честно говоря, его нужно полностью переработать, вам не нужна одна функция для установки стилей, а другая для возврата их к исходным значениям, и одна функция для обработки наведения курсора, а другая для не наведения курсора, которые оба выполняют в основном одно и то же. Если вы замените весь этот дополнительный беспорядок и не будете полагаться на id ‘s в первую очередь, код будет намного проще и его легче поддерживать.

2. @ScottMarcus Я потратил много времени на поиск примеров кода, дающих похожие результаты, так что это своего рода то, что я смешал с моим мыслительным процессом и доступной мне информацией. Есть ли у вас какие-либо более конкретные рекомендации по более эффективному выполнению этого? Тем временем я постараюсь упростить это, ура!

Ответ №1:

Вы должны регистрировать i или idConvertNum(id) вместо результата вызова idConvertNum без аргументов, поскольку это всегда будет возвращать значение по умолчанию 4 .

 function onHover(id){ // passes element id through html "onmouseenter"
    clearInterval(iconTimer); // stops interval
    changeIconBack(j); // resets all to default
    i = idConvertNum(id); // sets i to index value converted from id

    console.log(i)

    if (i==0){ // pairs j to new i
        j = iconImg.length - 1;
    } else {
        j = i - 1;
    };
    iconFlow(); // calls update func
}
  

Комментарии:

1. вау… Я не знаю, как я это пропустил. Спасибо, вы, вероятно, сэкономили мне 5 часов на ломании головы.

2. @Ostnic Нет проблем.