Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как узнать о появлении элемента на страницы (https://javascript.ru/forum/dom-window/70536-kak-uznat-o-poyavlenii-ehlementa-na-stranicy.html)

DDim1000 13.09.2017 11:49

Как узнать о появлении элемента на страницы
 
Здравствуйте!
Подскажите пожалуйста, как узнать о том, что на страницы появился, например, div c определенным id?
Вот так не работает:

$( "$d" ).on({click: function() {
       alert('Я здесь))');
        }
        });

j0hnik 13.09.2017 11:53

У этого дива наверное есть событие, вот на него и надо обратить внимание.
Рони, недавно постил вот такой способ https://developer.mozilla.org/ru/doc...tationObserver

DDim1000 13.09.2017 12:46

Этот код при любом изменении на страницы должен срабатывать, или нет?
var observer = new MutationObserver(function (mutations) {
	  alert('Я здесь))');
   });

Nexus 13.09.2017 13:35

Цитата:

Сообщение от DDim1000
Этот код при любом изменении на страницы должен срабатывать, или нет?

В описании конструктора все написано.
Цитата:

Сообщение от developer.mozilla.org
Параметры
callback
Вызывается при каждом изменении DOM-элемента. Observer вызывает данную функцию с двумя аргументами. Первым аргументом является массив объектов MutationRecord, Вторым аргументом является экземпляр MutationObserver.

Upd. Там даже пример использования есть. Если оставить ваш код как есть, то ни одного алерта вызвано не будет, так как ваш экземпляр не подписан ни на один DOM-элемент.

Dilettante_Pro 13.09.2017 14:01

DDim1000,
По идее, надо подписывать на body - тогда все изменения проявятся

j0hnik 13.09.2017 14:44

Цитата:

Сообщение от Dilettante_Pro (Сообщение 464430)
DDim1000,
По идее, надо подписывать на body - тогда все изменения проявятся

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

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
var observer = new MutationObserver(function(mutations) {
	if(document.querySelector("#id")){
    alert('Я здесь))');
    observer.disconnect();
  }
});
observer.observe(document.body, {childList: true});
// добавить в body нужный элемент через 3 сек.
setTimeout(()=>document.body.insertAdjacentHTML('beforeend', '<div id="id">Hello</div>'), 3000);
	</script>	
</body>
</html>

DDim1000 14.09.2017 20:36

Спасибо!

DDim1000 15.09.2017 14:19

Цитата:

Сообщение от j0hnik (Сообщение 464436)
или если мы знаем что элемент должен появится в определенном блоке, можно повесить на него.

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
var observer = new MutationObserver(function(mutations) {
	if(document.querySelector("#id")){
    alert('Я здесь))');
    observer.disconnect();
  }
});
observer.observe(document.body, {childList: true});
// добавить в body нужный элемент через 3 сек.
setTimeout(()=>document.body.insertAdjacentHTML('beforeend', '<div id="id">Hello</div>'), 3000);
	</script>	
</body>
</html>

Я не знаю в чем прикол, но, если label создаться с другим текстом, то код не срабатывает.
Вот смотрите, если jquery.validate создает вот такой код:
<label id="reg_phone-error" class="error" for="reg_phone" style="display: inline;">Укажите номер телефона!</label>

Или вот такой код:
<label id="reg_phone-error" class="error" for="reg_phone" style="display: inline;">Неверный формат номера телефона!</label>

То, все отлично работает!
Но, когда генерируется такой же код, только с другим текстом, ни какой реакции нет!
<label id="reg_phone-error" class="error" for="reg_phone" style="display: inline;">Пользователь с таким номером уже <br> зарегистрирован!</label>

j0hnik 15.09.2017 14:52

не нужно создавать два элемента с одинаковым ID отсюда проблемы.
observer.disconnect(); // снимает наблюдение если вам нужно наблюдать дальше, уберите эту строчку

Dilettante_Pro 15.09.2017 14:57

Так работает
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
var observer = new MutationObserver(function(mutations) {
	if(document.querySelector("#reg_phone-error")){
    alert('Я здесь))');
    observer.disconnect();
  }
});
observer.observe(document.body, {childList: true});
// добавить в body нужный элемент через 3 сек.
setTimeout(()=>document.body.insertAdjacentHTML('beforeend', '<label id="reg_phone-error" class="error" for="reg_phone" style="display: inline;">Неверный формат номера телефона!</label>'), 3000);
	</script>	
</body>
</html>

И так работает
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
var observer = new MutationObserver(function(mutations) {
	if(document.querySelector("#reg_phone-error")){
    alert('Я здесь))');
    observer.disconnect();
  }
});
observer.observe(document.body, {childList: true});
// добавить в body нужный элемент через 3 сек.
setTimeout(()=>document.body.insertAdjacentHTML('beforeend', '<label id="reg_phone-error" class="error" for="reg_phone" style="display: inline;">Пользователь с таким номером уже <br> зарегистрирован!</label>'), 3000);
	</script>	
</body>
</html>

Или вы создаете ЕЩЕ один лейбл?
Тогда j0hnik прав

j0hnik 15.09.2017 15:17

если вам нужно выполнять разный код для вновь созданных элементов: предлагаю такой код.

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<script>
var i = 1, j = 1;
var observer = new MutationObserver(function(mutations) {
	if(document.querySelector("#id")&& i) {
		alert('Я здесь))');
		i--;
	}
	if(document.querySelector("#id2")&& j) {
		alert('Я Второй))');
		j--;
	}
});
observer.observe(document.body, {childList: true});
// добавить в body нужный элемент через 3 сек и через 6 сек.
setTimeout(()=>document.body.insertAdjacentHTML('beforeend', '<label id="id">Hello</label>'), 3000);
setTimeout(()=>document.body.insertAdjacentHTML('beforeend', '<label id="id2">Other TEXT</label>'), 6000);
	</script>	
</body>
</html>

DDim1000 15.09.2017 15:40

Цитата:

Сообщение от j0hnik (Сообщение 464583)
не нужно создавать два элемента с одинаковым ID отсюда проблемы.
...

ID не я же создаю, а JQuery.
Как тогда в такой ситуации поступить, если одно и тоже поле нужно проверить на пустоту, проверяется формат телефона, и посмотреть в базе, не зарегистрирован ли уже кто-то с этим номером?:
function clearPhone(val){
	var newVal = val.replace(/[^\d]+/g, '');
	if (newVal == '') {
		return false;
	  }else{
		  return newVal;  
		}
	};
  $.validator.addMethod('reg_phone', function (value) {
 		   var phone = clearPhone(value); console.log(phone);
		   var formatPhone = /79/g;
		   var rezzult = phone.match(formatPhone); 
			if (rezzult == null) {
				return false;
			 }	
     .....
         $('#form_reg').validate({

                //Правила для проверки

                rules: {
                  .....
                  		    "reg_phone":{ 
				    required:true,
					reg_phone: { reg_phone: true },
					remote: {url: "check_phone.php", type:"post" } 									
			    },
             			},
                //Текста предупреждений

                messages: {
                    .....
                				"reg_phone":{ 
				    required: "Укажите номер телефона!",
					reg_phone:"Неверный формат номера телефона!",
					remote: "Пользователь с таким номером уже <br /> зарегистрирован!"
			    },
							 
             },

Вообще у меня задача такая:
Когда выводиться сообщение: "Пользователь с таким номером уже <br /> зарегистрирован!", нужно изменить margin-top, чтоб сообщение выше было.

рони 15.09.2017 15:45

DDim1000,
может css??

j0hnik 15.09.2017 16:00

Цитата:

Сообщение от DDim1000 (Сообщение 464588)
ID не я же создаю, а JQuery.

сайт своей жизнью живет? не слушается вас? НАКАЖИТЕ ЕГО! :D

DDim1000 15.09.2017 16:46

Цитата:

Сообщение от рони (Сообщение 464590)
DDim1000,
может css??

Естественно нужно менять стили..., нужно сделать margin-top: -3, если выводится вот это сообщение: "Пользователь с таким номером уже зарегистрирован!".
А как узнать о том, что вывелось именно это сообщение? Просто нужно узнать длину строки, и если длинна строки больше 31 символа, то изменить margin-top.

рони 15.09.2017 18:26

DDim1000,
1 нормальный способ изучить validate - изменить шаблон для remote
2. ничего не изучать, что уже ненормально, а просто изменить css (консоль в помощь, смотрите html этого remote сообщения, вычисляйте селектор).
всё остальное лучше не рассматривать

DDim1000 16.09.2017 12:38

Цитата:

Сообщение от рони (Сообщение 464601)
DDim1000,
1 нормальный способ изучить validate - изменить шаблон для remote
2. ничего не изучать, что уже ненормально, а просто изменить css (консоль в помощь, смотрите html этого remote сообщения, вычисляйте селектор).
всё остальное лучше не рассматривать

Вы хотите сказать, что у этих трех сообщений будут разные селекторы?:
"reg_phone":{
                    required: "Укажите номер телефона!",
                    reg_phone:"Неверный формат номера телефона!",
                    remote: "Пользователь с таким номером уже <br /> зарегистрирован!"

рони 16.09.2017 14:49

DDim1000,
обернуть сообщение в span.remote не пробовали?

DDim1000 16.09.2017 19:07

Цитата:

Сообщение от рони (Сообщение 464652)
DDim1000,
обернуть сообщение в span.remote не пробовали?

рони, спасибо! Вопрос решен!:
remote: '<p id="number_is_busy">Пользователь с таким номером уже <br /> зарегистрирован!</p>'

#number_is_busy{
	margin-top: -9px;
}

рони 16.09.2017 19:35

DDim1000,
:) :victory:


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