2016-09-13 4 views
4

Любые идеи, почему это не работает.прослушиватель событий не работает

Кнопка Да, когда нажимали работает один раз - кнопку Нет не работает

function $(x) { 
 
    return document.getElementById(x); 
 
} 
 

 
var glob = 0; 
 

 
function new_index() { 
 
    glob += 1; 
 
    return "d" + glob; 
 
} 
 

 
function play() { 
 
    say("Hello is JS Fun?"); 
 
    response("No", 
 
     function() { 
 
      say("Oh dear") 
 
     }); 
 
    response("Yes", 
 
     function() { 
 
      say("Great:"); 
 
     }); 
 
} 
 

 
function say(x) { 
 
    $("txt").innerHTML += x; 
 
} 
 

 
function response(Txt, Fun) { 
 
    var n = new_index(); 
 
    var s = "<button id='" + n + "'>" + Txt + "</button>"; 
 
    say(s); 
 
    var xx = $(n); 
 
    // xx.onclick=Fun; 
 
    xx.addEventListener("click", Fun); 
 
} 
 

 
play();
<div id="txt"></div>

+0

Этот вопрос не работает. Не могли бы вы объяснить, что вы ожидаете от своего кода, и что он делает? – Teemu

ответ

8

Это потому, что каждый раз, когда вы установите innerHTML не просто добавить, как вы могли бы подумать, он устанавливает innerHTML в новое значение и тем самым удаляет старые элементы с прикрепленными старыми прослушивателями событий.

+3

Goodness inerHTML + = x НЕ является чистой операцией добавления, но имеет побочные эффекты !!! Ничего себе следующего –

+0

Это потому, что innerHTML является сериализацией DOM. Таким образом, он превращает DOM в строку, создает новую длинную строку, затем десериализует строку в новую DOM – JoshRagem

1

Обработчики событий теряются на $("txt").innerHTML += x;.

2

Как уже упоминалось, основная проблема в вашем коде заключается в том, что вы теряете привязки событий при последующих вызовах innerHTML. Нет прекращения работы, поскольку они возникают после Да. Когда Да добавляет текст, он ломается.

При работе с DOM лучше создавать элементы, чем изменять текст HTML (с innerHTML). В случае ваших кнопок это означает, что вам не нужно (1) создать кнопку с идентификатором, а затем (2) найти кнопку. С createElement у вас есть ссылка на него.

function $(x) { 
 
    return document.getElementById(x); 
 
} 
 

 
var glob = 0; 
 

 
function new_index() { 
 
    glob += 1; 
 
    return "d" + glob; 
 
} 
 

 
function play() { 
 
    say(text("Hello is JS Fun?")); 
 
    response("No", 
 
     function() { 
 
      say(text("Oh dear")); 
 
     }); 
 
    response("Yes", 
 
     function() { 
 
      say(text("Great:")); 
 
     }); 
 
} 
 

 
function text(String) { 
 
    var node = document.createElement("span"); 
 
    node.innerHTML = String; 
 
    return node; 
 
} 
 

 
function say(x) { 
 
    $("content").appendChild(x); 
 
} 
 

 
function response(Txt, Fun) { 
 
    var button = document.createElement("button"); 
 
    button.innerHTML = Txt; 
 
    button.addEventListener("click", Fun); 
 
    say(button); 
 
} 
 

 
play();
<div id="content"></div>

Смежные вопросы