Dorzucenie wywołania metody przy setInterval

0

Witam,

mam taki kawałek kodu

<div id="someDiv">
    <script type="text/javascript">
        setInterval("$('#someDiv').load(someMethod())", 5000);
    </script>
</div>

teraz przy załadowaniu diva co 5 sekund wywołuje się jakaś metoda, ale pierwsze wywołanie jest dopiero po 5 sekundach. Jak zgrabnie mogę dodatkowo dodać wywołanie takiej metody od razu po załadowaniu tego diva?

3
executeEveryXSeconds(var seconds) {
  someMethod();
  setInterval(() => $('#someDiv').load(someMethod()), seconds * 1000);

}

i w kodzie (html) uzywasz funkcji executeEveryXSeconds

0

@fasadin: Mam jeszcze jeden problem z wywołaniem tej metody. Przeniosłem tą linijkę do metody w pliku js i próbuję ją wywołać tak o:

<div id="someDiv">
    <script type="text/javascript">
        executeEveryXSeconds(5000);
    </script>
</div>

i w konsoli wyrzuca mi błąd executeEveryXSeconds is not defined

W pliku js wygląda to tak:

function executeEveryXSeconds(seconds) {
    someMethod();
    setInterval("$('#someDiv').load(someMethod())", seconds);
}
0
<script type="text/javascript">
        executeEveryXSeconds(5000);
    </script>

tutaj definiujesz nowy skrypt wiec nic dziwnego ze Ci nie znajdujego tej funkcji, poczytaj o src

https://www.w3schools.com/tags/att_script_src.asp

2

Wykonywanie stringa??? 🤮

  setInterval(() => $('#someDiv').load(someMethod()), milliseconds);
0

@fasadin: @ŁF Panowie orientujecie się dlaczego nawet mi to tej metody w skrypcie nie wchodzi? Jak wspomniałem wyżej dopisałem src, już nie mam błędu w konsoli, ale nawet mi do tej metody nie wchodzi

0

Albo skrypt się nie ładuje (404? sprawdź w zakładce network), albo masz zbuforowaną starą wersję (Ctrl+F5), albo źle sprawdzasz, że się nie wykonuje. setInterval nie wykonuje kodu natychmiast, tylko po zadanym interwale. U Ciebie po pięciu sekundach.
Znasz argumenty funkcji load() (https://api.jquery.com/load/)? Pierwszym jest url, zatem jeśli someMethod() zwraca cokolwiek innego, to żądanie się nie wykona, ewentualnie pójdzie request do jakiegoś śmieciowego urla.

0

@ŁF: w konsoli nie mam żadnego błędu, wyczyściłem cache i spróbowałem na innej przeglądarce - to samo, do skryptu nie wchodzi bo mam breakpoint ustawiony na wejściu i nic.
Kod na początku wyglądał tak o:

<div id="someDiv">
    <script type="text/javascript">
        setInterval("$('#someDiv').load(someMethod())", 5000);
    </script>
</div>

I działało wszystko, ale chciałem żeby wykonał się też na początku i po radach @fasadin przerobiłem go tak o:

<div id="someDiv">
    <script type="text/javascript" src="~/js/site.js">
        someMethodEveryXSeconds(2);
    </script>
</div>

site.js:

function someMethodEveryXSeconds(seconds) {
    someMethod();
    setInterval(() => $('#someDiv').load(someMethod()), seconds * 1000);
    //setInterval("$('#someDiv').load(someMethod())", seconds * 1000);
}

I nie wchodzi mi do metody someMethodEveryXSeconds.

Dorzucę jeszczę someMethod:

function someMethod() {

    $.ajax({
        url: '/SomePage/Index?handler=GetSomething',
        type: 'get',
        success: function (obj) {
            $('#SomeDiv').empty();
            $('#SomeDiv').html(obj);
        }
    });
};

Ogólnie w pliku site.js widać zakomentowaną linijkę, chciałem zapytać jaka jest w ogóle różnica użycia setInterval z funkcją anonimową a bez niej?
Problemem jest to, że nie mogę wywołać tych funkcji z pliku html. Próbowałem wywołać inne metody, które się wywołują w innych przypadkach i też lipa.

3

Albo wóz:

<script type="text/javascript" src="~/js/site.js"></script>

albo przewóz:

<script type="text/javascript">
        someMethodEveryXSeconds(2);
</script>

Nie możesz w jednym tagu script i ładować skryptu z url, i definiować własnego kodu.

BTW znaczniki script zwykle daje się na końcu kodu html, tuż przed zamknięciem body, żeby drzewo DOM było chociaż w miarę kompletne w momencie wykonywania kodu js. Idealnie jest wykonywać js po załądowaniu calego DOM: $(() => { ... }) (tożsame z $(document).ready(() => { ... }) - vide https://api.jquery.com/ready/).

someMethod tak nie działa, bo load tak nie działa. Już Ci to pisałem. $("#my-div").load("/url/to/my-html-conent.html").

jaka jest w ogóle różnica użycia setInterval z funkcją anonimową a bez niej?

Czy użyjesz lambdy (aka arrow function), funkcji anonimowej, czy zwykłej funkcji/metody - w tym przypadku nie ma żadnej różnicy. Olbrzymią różnicę stanowi podawanie kodu do wykonania w postaci stringa, bo uchyla to drzwi do potencjalnego wstrzykiwania kodu js. Do tego statyczna analiza kodu może przegapić wywołanie funkcji z poziomu eval stringa i IDE wyświetli Ci, że dana funkcja nie jest używana.

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