Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.03.2012, 22:04
Аспирант
Отправить личное сообщение для SkaN Посмотреть профиль Найти все сообщения от SkaN
 
Регистрация: 27.08.2011
Сообщений: 50

В одном месте функция работает нормально, в другом не работает вообще
Чтобы не быть голословным, сразу все листинги:
<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();
	}

Однако элемент не отображается. Даже текст в него не вставляется, хотя с сервера загружается. Причем первый обработчик прекрасно справляется со своей задачей. Я пробовал копировать нужный фрагмент и вставить его в это условие - бесполезно.
Что очень примечательно, когда я делал эту штуку, я не загружал текст с сервера, а хранил его в элементе сразу. Все работало нормально. Здесь же, если я вставлю текст сразу в код и закомментирую фрагмент, который заменяет текст в элементе, то результат все равно нулевой.
Вобщем, очень надеюсь на вашу помощь, я уже третий день голову ломаю...
Ответить с цитированием
  #2 (permalink)  
Старый 20.03.2012, 23:31
Профессор
Отправить личное сообщение для zebra Посмотреть профиль Найти все сообщения от zebra
 
Регистрация: 14.09.2011
Сообщений: 523

trigger('click') ?
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2012, 23:32
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

С учётом этого, я слепил тест-кейз. по-умолчанию блок скрыт (style="display:none"), и функция ajax-запроса настроена на jsfiddle.
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2012, 23:54
Аспирант
Отправить личное сообщение для SkaN Посмотреть профиль Найти все сообщения от SkaN
 
Регистрация: 27.08.2011
Сообщений: 50

Сообщение от melky
Вы неправильно проверяете видимость элемента - Вы проверяете, не установлено ли его CSS-свойство display в none, а по загрузке страницы к нему не применено стилей (если судить по тому, что Вы выложили), следовательно, условие вначале вернёт false. Проверить, виден ли элемент, можно так : $element.is(":visible")
по умолчанию элемент скрыт, но я не увидел необходимости сюда это писать, потому что вроде написал, что первый обработчик срабатывает на ура
Сообщение от melky
Вам присылается ответ с сервера ? Это можно посмотерть во вкладке "Сеть", в консоли разработчика в Вашем браузере.
точно присылается, проверял
Ответить с цитированием
  #5 (permalink)  
Старый 20.03.2012, 23:57
Аспирант
Отправить личное сообщение для SkaN Посмотреть профиль Найти все сообщения от SkaN
 
Регистрация: 27.08.2011
Сообщений: 50

Сообщение от zebra
trigger('click') ?
одно и то же получается
Ответить с цитированием
  #6 (permalink)  
Старый 21.03.2012, 00:05
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

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

Последний раз редактировалось melky, 21.03.2012 в 00:07.
Ответить с цитированием
  #7 (permalink)  
Старый 21.03.2012, 00:24
Аспирант
Отправить личное сообщение для SkaN Посмотреть профиль Найти все сообщения от SkaN
 
Регистрация: 27.08.2011
Сообщений: 50

Вот, пожалуйста
Только, почему-то, там не тянется текст через аякс...
Ответить с цитированием
  #8 (permalink)  
Старый 21.03.2012, 10:11
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

работает...
Ответить с цитированием
  #9 (permalink)  
Старый 21.03.2012, 12:47
Аспирант
Отправить личное сообщение для SkaN Посмотреть профиль Найти все сообщения от SkaN
 
Регистрация: 27.08.2011
Сообщений: 50

Ну да, теперь все работает ровно так, как у меня на компе. Если вы закроете текст и нажмете на "Редактировать", то текстовым полем сделается только имя, текст даже не откроется.
Ответить с цитированием
  #10 (permalink)  
Старый 21.03.2012, 12:54
Аспирант
Отправить личное сообщение для SkaN Посмотреть профиль Найти все сообщения от SkaN
 
Регистрация: 27.08.2011
Сообщений: 50

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 назначается то, что успевает (то есть пустота) и все сбивается. Как сделать так, чтобы строчки выполнялись последовательно?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция которая работает на OnLoad не хочет работать на OnClick libinstyle Элементы интерфейса 6 23.03.2010 01:42