Додайте подію onclick до нещодавно доданого елемента в JavaScript


78

Я намагався додати подію onclick до нових елементів, які я додав за допомогою JavaScript.

Проблема полягає в тому, що коли я перевіряю document.body.innerHTML, я фактично бачу, як до нового елемента додано onclick = alert ('blah').

Але коли я натискаю цей елемент, я не бачу, щоб поле сповіщення працювало. Насправді все, що пов'язано з JavaScript, не працює ..

ось що я використовую для додавання нового елемента:

function add_img() { 
  var elemm = document.createElement('rvml:image'); 
  elemm.src = 'blah.png';
  elemm.className = 'rvml';
  elemm.onclick = "alert('blah')";
  document.body.appendChild(elemm);
  elemm.id = "gogo";
  elemm.style.position='absolute';
  elemm.style.width=55;
  elemm.style.height=55;
  elemm.style.top=200;
  elemm.style.left=300;
  elemm.style.rotation=200; 
}

Ось як я називаю цю функцію:

<button onclick=add_img()>add image</button>

Тепер зображення чудово малюється всередині браузера. Але коли я натискаю зображення, я не отримую цього сповіщення.


1
О, краса jQuery. Можливо, це буде корисним у майбутньому :) $ ('. Rvml'). Live ('click', function () {alert (1);});
Даніель Слоф

Відповіді:


162

.onclickмає бути встановлена ​​функція замість рядка. Спробуйте

elemm.onclick = function() { alert('blah'); };

замість цього.


24

Не впевнений, але спробуйте:

elemm.addEventListener('click', function(){ alert('blah');}, false);

Навіть з .addEventListener2-м аргументом все одно повинна бути функція, а не рядок.
kennytm

За допомогою jQuery я цього не запам'ятав;) Дякую
Борис Делормас


6

ви не можете призначити подію за допомогою рядка. Використовуйте це:

elemm.onclick = function(){ alert('blah'); };

4

Коротка відповідь: ви хочете встановити обробник на функцію:

elemm.onclick = function() { alert('blah'); };

Відповідь трохи довша: вам доведеться написати ще кілька рядків коду, щоб це працювало послідовно в браузерах.

Справа в тому, що навіть довгий-довгий код, який може вирішити цю конкретну проблему в наборі звичайних браузерів, все одно матиме власні проблеми. Тож якщо вам не байдужа підтримка між браузерами, скористайтеся абсолютно короткою. Якщо ви дбаєте про це і абсолютно хочете, щоб ця одна річ спрацювала, скористайтеся комбінацією addEventListenerі attachEvent. Якщо ви хочете мати змогу широко створювати об’єкти та додавати та видаляти прослуховувачі подій у коді, і хочете, щоб це працювало у браузерах, ви обов’язково хочете делегувати цю відповідальність бібліотеці, такій як jQuery.


1
Мені це потрібно лише для Internet Explorer .. короткий працює як шарм. дякую за детальне рішення, хоча
SolidSnake

2

Я не думаю, що ви можете зробити це таким чином. Ви повинні використовувати:

void addEventListener( 
  in DOMString type, 
  in EventListener listener, 
  in boolean useCapture 
); 

Документація тут .


0

У вас є три різні проблеми. Перш за все, значення в тегах HTML слід цитувати! Якщо цього не зробити, це може заплутати браузер і може спричинити певні проблеми (хоча це, ймовірно, тут не так). По-друге, ви насправді повинні призначити функцію змінній onclick, як хтось інший згадував. Це не тільки правильний спосіб зробити це вперед, але це значно спрощує ситуацію, якщо ви намагаєтесь використовувати локальні змінні у функції onclick. Нарешті, ви можете спробувати addEventListener або jQuery, перевага jQuery в більш приємному інтерфейсі.

О, і переконайтеся, що ваш HTML перевіряється! Це може бути проблемою.


Я використовую це локально. так що це не буде для мене проблемою .. про jQuery мені не сподобалось, тому що я не можу взяти під свій контроль усе, і це просто безладно з безліччю кодів, і це впливає на інші бібліотеки javascript. Я волів би побудувати власну бібліотеку, а не витрачати свій час, щоб зрозуміти, як використовувати jQuery. дякую за допомогу :)
SolidSnake

0

JQuery:

elemm.attr("onclick", "yourFunction(this)");

або:

elemm.attr("onclick", "alert('Hi!')");

Цей код повинен надсилати вам гучні попередження. Крім того, чи можете ви додати до нього якесь пояснення, щоб інші могли навчитися з цього? Що elemмістить?
Ніко Хаасе,

І якщо ви прочитали найголоснішу відповідь, ви б також написали код, використовуючи анонімну функцію, щоб уникнути саме цієї проблеми
Ніко Хаасе,

0

не можу сказати чому, але синтаксис es5 / 6 не працює

elem.onclick = (ev) => {console.log(this);} не працює

elem.onclick = function(ev) {console.log(this);} робочий


-3

У випадку, якщо ви не хочете писати весь код, який ви колись написали у функції, яку ви викликали. Будь ласка, використовуйте такий код, використовуючи jQuery:

$ (елемент) .on ('клацніть', функція () {add_img ();});

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.