Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Почему не работает функция в атрибуте onclick? (https://javascript.ru/forum/events/48943-pochemu-ne-rabotaet-funkciya-v-atribute-onclick.html)

Dimaz 22.07.2014 19:25

Почему не работает функция в атрибуте onclick?
 
Почему не работает функция в атрибуте onclick?
<p onclick='say()'>bla bla bla</p>

function say(){
    alert("ok");
}

http://jsfiddle.net/8jkNJ/

Sweet 22.07.2014 19:41

Потому что то, что ты пишешь, оборачивается в функцию и вешается событием load. В левой панеле поменяй во втором селекте с "onLoad" на "No wrap".

Dimaz 22.07.2014 21:11

Цитата:

Сообщение от Sweet (Сообщение 322266)
Потому что то, что ты пишешь, оборачивается в функцию и вешается событием load. В левой панеле поменяй во втором селекте с "onLoad" на "No wrap".

Теперь работает, но только в jsfiddle. Я занимаюсь приложением для браузера. Мой скрипт интегрируется на сторонний сайт. Почему я не могу вызвать эту функцию?
Я вставляю элемент с атрибутом onclick на страницу с помощью innerHTML. Может в этом проблема?

Sweet 23.07.2014 02:52

Всё работает:
<div id="test"></div>

<script>
test.innerHTML = "<p onclick='say()'>bla bla bla</p>";

function say(){
    alert("ok");
}
</script>
Хз, что у вас за проблема.

Aetae 23.07.2014 03:42

Цитата:

Сообщение от Dimaz (Сообщение 322273)
Я вставляю элемент с атрибутом onclick на страницу с помощью innerHTML. Может в этом проблема?

Да, именно в этом. Для безопасности ваши функции недоступны для вызова с самого сайта.(причина думаю очевидна)
Соответственно обрабочики надо добавлять вручную:
elem.onclick=say; //или
elem.addEventListener('click',say,false)
В geasemonkey есть ещё unsafeWindow и можно сделать так:
unsafeWindow.say=function(){/*...*/}
но это дырa в безопасности.

kostyanet 23.07.2014 15:40

Все так нормально работает с addEventListener() и не надо никаких онкликов.

kostyanet 23.07.2014 15:43

Вообще-то и в обычном скрипте если тупо добавить текст, в innerHTML, то не факт что онклик будет работать. Надо делать элемент, вешать на него объект - функцию, и аттачить в дом как таковой.

Для внедренных скриптов аналогично, но там принцип другой. Если это ваш элемент - то программируете его addEventListener;ом, а если чужой и надо по нему клацнуть, то тупо elem,click() или типа того.

Dimaz 23.07.2014 20:52

Понял. Всем спасибо за помощь.


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