Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   НЕ работает onclick из внешнего .js (https://javascript.ru/forum/misc/51775-ne-rabotaet-onclick-iz-vneshnego-js.html)

Siend 19.11.2014 12:37

НЕ работает onclick из внешнего .js
 
Помогите плиз решить проблему. Раньше у меня был этот же код который находился в основном файле html в тегах <script></script> и все замечательно работало. Потом я решил что нужно этот код оформить отдельным файлом и он перестал корректно работать.

внешний.js:
window.onload = function () {
...
    function CreatMenu() {
        ...
        for (var i = 0; i < ceMenu; i++)
            $('<div id="M' + i + '" class="arc"         onclick="testfunct()"            >' + (menuList[curMenu][1 + i]) + '</div>').appendTo('#menu').css({ 'top': (yMenu - 25) + 'px', 'left': (xMenu - 25) + 'px' });
        ...

    }

    function testfunct() {
        alert();
    }
...
}

Выдает ошибку
Uncaught ReferenceError: testfunct is not defined
onclick

Пытался сделать через EventHAndler - стало только хуже, поэтому решил пытаться допилить onclick.

jsnb 19.11.2014 12:41

Ну если уж говнокодить, то допиши там
window.testfunct = testfunct;

Ну или к той стремной jQuery цепочке добавь click(testfunct)

Siend 19.11.2014 12:45

Помогло, но хотелось бы узнать про решение не говнокодом)

Siend 19.11.2014 12:48

Помогло, да не очень(

мне нужно вызывать функцию с параметром, в итоге имею:
for (var i = 0; i < ceMenu; i++)
            $('<div id="M' + i + '" class="arc" >' + (menuList[curMenu][1 + i]) + '</div>').appendTo('#menu').css({ 'top': (yMenu - 25) + 'px', 'left': (xMenu - 25) + 'px' })         .click(testfunct(      menuList[curMenu][1 + i])      );


Но выполняется скрипт не правильно. Должен alert возникать по нажатию на div, а он его вызывает при создании элемента сразу столько раз сколько было создано элементов(

jsnb 19.11.2014 12:51

А не говнокодом - это забыть про событийные атрибуты и использовать хотя бы делегирование, а не вешать обработчик на каждый элемент. И нафига window.onload, если используется jQuery, в котором есть ready.

Siend 19.11.2014 12:51

P.S.:

window.testfunct = testfunct;

помог как надо, но хотелось бы узнать про решение через eventHander

Siend 19.11.2014 12:53

Цитата:

Сообщение от jsnb (Сообщение 341728)
А не говнокодом - это забыть про событийные атрибуты и использовать хотя бы делегирование, а не вешать обработчик на каждый элемент. И нафига window.onload, если используется jQuery, в котором есть ready.

Я плохо знаю jquery, поэтому частично что не знаю пишу на javascript, а без window.onload во внешнем скрипте он вообще отказывался работать(

jsnb 19.11.2014 12:53

Цитата:

Сообщение от Siend (Сообщение 341726)
Но выполняется скрипт не правильно. Должен alert возникать по нажатию на div, а он его вызывает при создании элемента сразу столько раз сколько было создано элементов(

Ну так естественно, если ты вызываешь обработчик сразу. Ну пиши тогда так, раз уж всё равно терять нечего:
click(function(){ testfunct(params) })

jsnb 19.11.2014 12:55

Цитата:

Сообщение от Siend (Сообщение 341730)
без window.onload во внешнем скрипте он вообще отказывался работать(

Т.е. оставшуюся часть предложения ты не дочитал и по ссылке не ходил?

Siend 19.11.2014 12:56

Не, просто по суте же это одно и тоже? Или я путаю?


Часовой пояс GMT +3, время: 22:50.