Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проверка элемента на существование в цикле (https://javascript.ru/forum/dom-window/69124-proverka-ehlementa-na-sushhestvovanie-v-cikle.html)

rodiony4 31.05.2017 16:04

Проверка элемента на существование в цикле
 
Здравствуйте
так я проверяю существование элемента на странице:
<script type="text/javascript">
$(".zzz").live('click', function(){
	if($(".ymaps-2-1-47-button__text").length>0) {
		alert('есть');
	
	};
});
</script>

<div class="zzz">проверка на существование</div>

но проверяемый элемент загружается динамически, через какое-то неопределенное время
помогите пожалуйста, сделать проверку элемента в цикле - проверять до тех пор, пока проверяемый элемент (.ymaps-2-1-47-button__text) не загрузится на страницу, после чего показать алерт

j0hnik 31.05.2017 16:09

Либо отложить проверку до загрузки всех элементов,
либо если вам надо вызывать функцию после загрузки элемента
используйте такую конструкцию
$(элем).ready(function() {

если элемент грузится аяксом используйте колбек!
А то что вы хотите сделать это плохо!

ksa 31.05.2017 16:13

Цитата:

Сообщение от rodiony4
сделать проверку элемента в цикле - проверять до тех пор, пока проверяемый элемент (.ymaps-2-1-47-button__text) не загрузится на страницу

Это нужно делать не в цикле... :no:
Это делается с использованием setTimeout() ;)

laimas 31.05.2017 16:20

Цитата:

Сообщение от ksa
Это делается с использованием setTimeout()

Лучше для этого использовать либо MutationObserver, либо для стареньких DOMNodeInserted.

rodiony4 31.05.2017 16:37

j0hnik, ksa, laimas, подробнее - по клику на ссылку, на страницу загружается яндекс карта. Когда карта полностью загрузится, загрузится и элемент (кнопка на карте) с классом .ymaps-2-1-47-button__text Вот этот момент нужно отследить и показать алерт после загрузки .ymaps-2-1-47-button__text
Как в этом случае использовать setTimeout() я не понял

Diphenyl Oxalate 31.05.2017 16:50

rodiony4,

document.addEventListener("DOMNodeInserted", function (e) {
	if ( e.target.classList.contains("ymaps-2-1-47-button__text") ) {
		// ваш код
	}
});

rodiony4 31.05.2017 17:19

Diphenyl Oxalate, я наверное сделал что-то не так, ваша функция не выполняется. посмотрите? http://www.specglass.ru/Untitled-2.html

Diphenyl Oxalate 31.05.2017 18:49

rodiony4,
мой недосмотр - не учёл, что элемент с нужным классом может быть вложенным.

document.addEventListener("DOMNodeInserted", function (e) {
	if ( e.target.nodeType != 1 ) return;
	if ( e.target.classList.contains("ymaps-2-1-47-button__text") || e.target.getElementsByClassName("ymaps-2-1-47-button__text").length ) {
		alert("Ура!");
	}
});

rodiony4 31.05.2017 20:51

Diphenyl Oxalate, спасибо, вместо алерта добавляю уже на загруженную карту див:
document.addEventListener("DOMNodeInserted", function (e) {
	if ( e.target.nodeType != 1 ) return;
	if ( e.target.classList.contains("ymaps-2-1-47-button__text") || e.target.getElementsByClassName("ymaps-2-1-47-button__text").length ) {
		$(".cap_site_map").append("<div class='close_map_x'>Закрыть</div>");
	}
});

все выполняется, но только один раз (проверял в опера, мозила, хром, ie)
например, кликаю по кнопке map (.cap_contact_1) - загружается карта, после того как карта загрузилась - добавляется мой див Закрыть карту (.close_map_x)
кликаю на див .close_map_x - карта закрывается, все ОК
но в дальнейшем при клике по кнопке map (.cap_contact_1) - файербаг показывает TypeError: can't access dead object

вот пример http://www.specglass.ru/Untitled-2.html

rodiony4 31.05.2017 23:04

Diphenyl Oxalate, ваш код js выполняется, это у меня небольшой косяк, в функции, где кнопка закрытия карты:
$(".close_map_x").live('click', function(){
	$(".cap_site_map").fadeOut(600);
});

если заменить
$(".cap_site_map").fadeOut(600);

на
$(".cap_site_map").html("");

то все работает корректно
буду благодарен, если объясните, почему возникала ошибка с fadeOut
Вам большое спасибо за помощь!
обновленный пример http://www.specglass.ru/Untitled-2.html


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