AddEventListener срабатывает автоматически при назначении
<style>
#mspop {
display:none;
}
</style>
<div>
<ul>
<li class="check">tem</li>
</ul>
</div>
<div id="mspop" style="background-color:brown;">
<div id="mspopinner"><p id="close">close</p><textarea style="margin: 0px; height: 125px; width: 500px;"></textarea>
<button>submit</button>
</div>
</div>
<script type="text/javascript">
(function() {
var dec_butt = document.getElementsByClassName("check");
dec_butt[0].addEventListener("click",box);
})();
function box(e){
var pop = document.getElementById("mspop");
pop.style.display = "block";
document.addEventListener("click",clik);
}
function clik(){
var pop = document.getElementById("mspop");
if(event.target != pop){
alert("hi");
pop.style.display = "none";
};
};
</script>
Первая функция самопроизвольного вызова добавляет прослушиватель событий click к элементу ' li 'с классом 'check', который запускает функцию box при нажатии.
Щелчок на этом ' li 'теперь запускает функцию box, функция box устанавливает прослушиватель событий click на объект 'document', ссылающийся на функцию clik, а также изменяет отображение идентификатора 'mspop' на block.
Однако при нажатии кнопки " li " назначение addEventlistner clik также запускает clik, несмотря на то, что у меня есть опущены скобки вызова clik () функции.
2 ответа:
Добавьте
e.stopPropagation()
в конце вашей функцииbox
:function box(e) { var pop = document.getElementById("mspop"); pop.style.display = "block"; document.addEventListener("click", clik); e.stopPropagation(); }
Смотрите эту скрипку: http://jsfiddle.net/vfyzgv1t/
Происходит то, что когда вы нажимаете на свой элемент
li
, щелчок затем передается в контейнер и так далее до окна (так называемое событие пузырящееся), и поскольку вы добавили прослушиватель событий в документ (который находится между вашимli
и окном), он запускается.Решение, предложенное здесь,
e.stopPropagation
останавливает распространение, так что щелчок по документу не срабатывает.UPDATE: другой способ - отложить в ближайшее время добавление нового eventListener: http://jsfiddle.net/vfyzgv1t/1/ :
function box(e) { var pop = document.getElementById("mspop"); pop.style.display = "block"; setTimeout(function() { document.addEventListener("click", clik); }, 10); }
Проблема заключается в том, что вы прикрепляете событие
click
ко всему событиюdocument
внутри события click.Когда метод button click возвращается, событие всплывает и находит только что прикрепленное событие document click. Вам нужно прекратить пузыриться, используя
e.stopPropagation()
:<style> #mspop { display:none; } </style> <div> <ul> <li class="check">tem</li> </ul> </div> <div id="mspop" style="background-color:brown;"> <div id="mspopinner"><p id="close">close</p><textarea style="margin: 0px; height: 125px; width: 500px;"></textarea> <button>submit</button> </div> </div> <script type="text/javascript"> (function() { var dec_butt = tab_id.getElementsByClassName("check"); dec_butt[0].addEventListener("click",box); })(); function box(e){ var pop = document.getElementById("mspop"); pop.style.display = "block"; document.addEventListener("click",clik); e.stopPropagation(); } function clik(){ var pop = document.getElementById("mspop"); if(event.target != pop){ alert("hi"); pop.style.display = "none"; }; }; </script>