Wątek przeniesiony 2020-10-21 10:22 z C# i .NET przez Ktos.

Jak wywołać funkcję z Listenerem w Listenerze?

0

Cześć,
mam problem polegający na tym, że wywołuję funkcję z Listenerem w Listenerze i nie rozpoznaje mi jego rodzica. Próbuję na wszystkie sposoby odnieść się do rodzica ale nie działa to poprawnie. Dlaczego jak wykonuję funkcję z Listenerem na Listenerze głównym (czyli na option:1) to nie odwołuje mi się automatycznie do miejsca w HTML-u w którym akurat teraz jestem klikając na listę rozwijaną? Poza tym przekazuję do funkcji parametry z 1-go Listenera więc chyba to powinno zadziałać w drugim a nie działa:

VIEW (w pierwszej kolumnie czyli @html.Display... mam około 150 wierszy, w pozostałych tak samo):

       <tr>
            <td class="payment">
                @Html.DisplayFor(modelItem => item.PaymentDate)
            </td>
            <td>
                <select id="decisionList">
                    <option value="0" selected>Data manualna</option>
                    <option value="1">Data platnosci</option>
                </select>
            </td>

            <td class="choice"></td>

       </tr>

JS - główny Listener:

document.querySelectorAll("#decisionList").forEach(elem => elem.addEventListener("change", function () {

    var selectedOptionIndex = this.options[this.selectedIndex].index;
    var invoiceDateText = this.closest('tr').querySelector('.payment').textContent.trim();
    var finalChoice = this.closest('tr').querySelector('.choice');


    switch (selectedOptionIndex) {

        case 0:
            finalChoice.innerHTML = '<input type="date">'
            break;

        case 1:
            finalChoice.innerHTML = '<input id="finalDate" type="date">'
            finalDateListener(selectedOptionIndex, invoiceDateText); // tu do drugiego Listenera przekazuję parametry z pierwszego

        default:

            finalChoice.innerHTML = ''

    }}));

JS - drugi Listener:

function finalDateListener(selectedOptionIndex, invoiceDateText){

const finalDate = document.getElementById("finalDate"); // tu odwołanie do ID z pierwszego listenera

    finalDate.addEventListener("change", function () {
        alert(invoiceDateText + ' ' + selectedOptionIndex); //alert wyskakuje tylko dla pierwszego wywołania tej funkcji, przy drugim i następnym juz nie
 });
}

w Console Log po wywołaniu Listenera mam taki błąd:

Uncaught TypeError: Cannot read property 'addEventListener' of null
    at finalDateListener (Site.js:78)
    at HTMLSelectElement.<anonymous> (Site.js:61)
1

Pod case 1 zgubiłeś break;.
Tutaj działa: https://jsfiddle.net/cd7q504x/.
Może jeśli tworzyłbyś input przy użyciu document.createElement, to by działało.

0
overcq napisał(a):

Pod case 1 zgubiłeś break;.

Tutaj działa: https://jsfiddle.net/cd7q504x/.
Może jeśli tworzyłbyś input przy użyciu document.createElement, to by działało.

dzięki, w koncu doszedlem do rozwiązania ale trochę czasu mi zeszło

1 użytkowników online, w tym zalogowanych: 0, gości: 1