Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   В одном месте функция работает нормально, в другом не работает вообще (https://javascript.ru/forum/jquery/26753-v-odnom-meste-funkciya-rabotaet-normalno-v-drugom-ne-rabotaet-voobshhe.html)

SkaN 20.03.2012 22:04

В одном месте функция работает нормально, в другом не работает вообще
 
Чтобы не быть голословным, сразу все листинги:
<div class="block" id="0" name="0">
	<div class="block_header">
		<div class="block_name">Main</div>
		<div class="block_acts">
			<button class="reduct">Редактировать</button><br />
			<button class="remove">Удалить</button>
		</div>
	</div>
	<div class="block_text"></div>
</div>

$("div.block_name").click(function() {
/* Даю this постоянную переменную, чтобы обращаться из других мест, где он переназначается */
	var elem = this;
/* Если элемент еще не отображается, то загружается его текст и он показывается на странице */
	if ($(this).parent("div.block_header").next("div.block_text").css("display") == "none") {
		$.ajax({
			url: "?id=block&block="+$(this).parents("div.block").attr("id")+"&action=get_text",
			dataType: "html",
			success: function(html) {
				$(elem).parent("div.block_header").next("div.block_text").text(html).slideDown("slow");
			},
		});
	}
/* В противном случае элемент наоборот, убирается со страницы и из него удаляется текст */
	else {
		$(this).parent("div.block_header").next().slideUp("slow").empty();
	}
});

$("button.reduct").click(function() {
	var elem = this;
	if 
/* Если элемент, которым манипулировали в прошлой функции, не показан на странице, то имитируется событие из прошлой функции, для того, чтобы элемент отобразился */($(this).parents("div.block_header").next("div.block_text").css("display") == "none") {
		$(elem).parents("div.block_header").children("div.block_name").click();
	}

Однако элемент не отображается. Даже текст в него не вставляется, хотя с сервера загружается. Причем первый обработчик прекрасно справляется со своей задачей. Я пробовал копировать нужный фрагмент и вставить его в это условие - бесполезно.
Что очень примечательно, когда я делал эту штуку, я не загружал текст с сервера, а хранил его в элементе сразу. Все работало нормально. Здесь же, если я вставлю текст сразу в код и закомментирую фрагмент, который заменяет текст в элементе, то результат все равно нулевой.
Вобщем, очень надеюсь на вашу помощь, я уже третий день голову ломаю...

zebra 20.03.2012 23:31

trigger('click') ?

melky 20.03.2012 23:32

  1. Вы неправильно проверяете видимость элемента - Вы проверяете, не установлено ли его CSS-свойство display в none, а по загрузке страницы к нему не применено стилей (если судить по тому, что Вы выложили), следовательно, условие вначале вернёт false. Проверить, виден ли элемент, можно так : $element.is(":visible")
  2. Вам присылается ответ с сервера ? Это можно посмотерть во вкладке "Сеть", в консоли разработчика в Вашем браузере.

С учётом этого, я слепил тест-кейз. по-умолчанию блок скрыт (style="display:none"), и функция ajax-запроса настроена на jsfiddle.

SkaN 20.03.2012 23:54

Цитата:

Сообщение от melky
Вы неправильно проверяете видимость элемента - Вы проверяете, не установлено ли его CSS-свойство display в none, а по загрузке страницы к нему не применено стилей (если судить по тому, что Вы выложили), следовательно, условие вначале вернёт false. Проверить, виден ли элемент, можно так : $element.is(":visible")

по умолчанию элемент скрыт, но я не увидел необходимости сюда это писать, потому что вроде написал, что первый обработчик срабатывает на ура
Цитата:

Сообщение от melky
Вам присылается ответ с сервера ? Это можно посмотерть во вкладке "Сеть", в консоли разработчика в Вашем браузере.

точно присылается, проверял

SkaN 20.03.2012 23:57

Цитата:

Сообщение от zebra
trigger('click') ?

одно и то же получается

melky 21.03.2012 00:05

Вы же написали код в обработчике завершения события загрузки DOM-дерева, или перед закрывающим тегом </body>, я надеюсь?

PS Выкладывайте код на jsfiddle, со стилями.

SkaN 21.03.2012 00:24

Вот, пожалуйста
Только, почему-то, там не тянется текст через аякс...

melky 21.03.2012 10:11

http://jsfiddle.net/fqUJq/1/

работает...

SkaN 21.03.2012 12:47

Ну да, теперь все работает ровно так, как у меня на компе. Если вы закроете текст и нажмете на "Редактировать", то текстовым полем сделается только имя, текст даже не откроется.

SkaN 21.03.2012 12:54

if ($(this).parents("div.block_header").next("div.block_text").is(":visible") == false) {
	$(this).parents("div.block_header").children("div.block_name").trigger("click");
}
var name = $(this).parents("div.block_header").children("div.block_name").text();
var text = $(this).parents("div.block_header").next("div.block_text").text();
alert(text);

Дальше я все закомментировал. В итоге в алерте выводится ничего, но текст открывается. Я сделал вывод, что, начиная выполнять код из условия, браузер идет дальше. Из-за этого переменной text назначается то, что успевает (то есть пустота) и все сбивается. Как сделать так, чтобы строчки выполнялись последовательно?


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