Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Слетает обработчик после AJAX (https://javascript.ru/forum/dom-window/57210-sletaet-obrabotchik-posle-ajax.html)

S.E.K.T.O.R. 24.07.2015 13:56

Слетает обработчик после AJAX
 
Доброго времени суток!
В теле HTML страницы есть такая конструкция
<div id="ajax_response">
	...
	<span id="myid">bla-bla</span>
	...
</div>

В скрипте на тег <span> повешен обработчик
(function() {	
	document.getElementById("myid").style.display = "none";
})();


После того, как AJAX обновит весь <div>, обработчик со <span> слетает. Подскажите пожалуйста, как правильно в этой ситуации повесить обработчик?

Спасибо

Deff 24.07.2015 14:19

S.E.K.T.O.R.,
Ну дык при удалении элемента нет события привязанного к нему и свойств стиля привязанных к данному элементу DOM.
Новозагруженные элементы(с теми же селекторами) не имеют отношения к объекту старых установок
Проще менять добавлять класс элементу с селектором и прописать скрытие в стиле
==============
Для переемственности текущего состояния нун перед загрузкой считывать в массив старые установки и возвращать на подгруженные идентичные элементы, или грузить избирательно лишь обновляемое содержимое
==============
Мон вешать событийную обработку на элемент через атрибуты (onclick и т.д.)

S.E.K.T.O.R. 24.07.2015 15:14

Цитата:

Сообщение от Deff
Проще менять добавлять класс элементу с селектором и прописать скрытие в стиле

Я понимаю, что проще, но скрывать нужно именно через JS. В скрипт, который обновляет весь <div>, я вмешиватся так же не могу.

Цитата:

Сообщение от Deff
Мон вешать событийную обработку на элемент через атрибуты (onclick и т.д.)

Это да, но ведь нет события, что бы прописать спану "display: none" по умолчанию?

devote 24.07.2015 16:28

S.E.K.T.O.R.,
используйте делегирование

S.E.K.T.O.R. 24.07.2015 16:36

Цитата:

Сообщение от devote
используйте делегирование

Я тоже об этом думал, но получилось корректно написать. Можно простенький пример?

devote 24.07.2015 16:48

S.E.K.T.O.R.,
document.body.onclick = function(e) {
  if (e.target.id === "myid") {
    e.target.style.display = "none";
  }
};
Смотря что тебе надо, ты ведь не удосужился нормальный код привести в пример. Привел какие-то огрызки, в которых ничего не понять.

S.E.K.T.O.R. 24.07.2015 23:37

Цитата:

Сообщение от devote
Смотря что тебе надо, ты ведь не удосужился нормальный код привести в пример. Привел какие-то огрызки, в которых ничего не понять.

Да вроде как описал все что нужно. В кратце:
Есть на странице <span>. Нужно через JS сделать ему style.display = "none" при загрузке страницы и что бы этот style не слетал после AJAX, так как сам нужный <span> находится внутри контейнера, который обновляется AJAX'ом.
В вашем примере, стиль присваиватся при клике на <span>, мне же нужно то же самое, но при загрузке страницы.

Deff 24.07.2015 23:41

S.E.K.T.O.R.,
:) Поставить скрипт сразу после контейнера на странице, Вызвать програмный клик.
А почему просто не поставить строку document.getElementById("myid").style.display = "none"; ?

Deff 24.07.2015 23:43

Цитата:

Сообщение от S.E.K.T.O.R. (Сообщение 381410)
Да вроде как описал все что нужно. В кратце:
Есть на странице <span>. Нужно через JS сделать ему style.display = "none" при загрузке страницы и что бы этот style не слетал после AJAX, так как сам нужный <span> находится внутри контейнера, который обновляется AJAX'ом.
В вашем примере, стиль присваиватся при клике на <span>, мне же нужно то же самое, но при загрузке страницы.

====================
Опять жа без выложенного минимального кода - это обсуждения в "курилке"

devote 25.07.2015 00:01

S.E.K.T.O.R.,
еще раз говорю, мы не ясновидящие... приведи часть кода который у тебя не работает, а гадать что и как у тебя там сделано никто не будет.

S.E.K.T.O.R. 25.07.2015 00:57

devote
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Title Here</title>
</head>

<body>
	
<table width="100%" cellspacing="0" cellpadding="0" align="center">
<tr>
	<td>
		<div id="AjaxResponse">
			Bla-Bla
			<span id="myid">
				<input type="text" name="input1">
			</span>
			<input type="button" name="button1" value="Send" onclick="SendAjax()">
		</div>
		
		<script type="text/javascript">
		<!--
		(function() {
			document.getElementById("myid").style.display = "none";
		})();
		
		function SendAjax() {
			document.getElementById("AjaxResponse").innerHTML = 'Bla-Bla <span id="myid"><input type="text" name="input1"></span><input type="button" name="button1" value="Send" onclick="SendAjax()">';
			return false;
		}
		// -->
		</script>
	</td>
</tr>
</table>

</body>
</html>

Упрощенно, но смысл тот же. После того, как данные полученные аяксом обновят все, что внутри дива, спан становится видимым, а нужно что бы оставался display = "none". В скрипт аякса я не могу вмешиваться, это часть движка.

devote 25.07.2015 01:20

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Title Here</title>
<style>
  #AjaxResponse.span-hide #myid {
    display: none;
  }
</style>
</head>
 
<body>
     
<table width="100%" cellspacing="0" cellpadding="0" align="center">
<tr>
    <td>
        <div id="AjaxResponse">
            Bla-Bla
            <span id="myid">
                <input type="text" name="input1">
            </span>
            <input type="button" name="button1" value="Send" onclick="SendAjax()">
        </div>
         
        <script type="text/javascript">
        (function() {
            document.getElementById("AjaxResponse").className = "span-hide";
        })();
         
        function SendAjax() {
            document.getElementById("AjaxResponse").innerHTML = 'Bla-Bla2 <span id="myid"><input type="text" name="input1"></span><input type="button" name="button1" value="Send" onclick="SendAjax()">';
            return false;
        }
        </script>
    </td>
</tr>
</table>
 
</body>
</html>

S.E.K.T.O.R. 25.07.2015 02:57

devote, огромное спасибо, то, что нужно :thanks:


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