Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Помогите выявить проблему скрипта (https://javascript.ru/forum/jquery/4620-pomogite-vyyavit-problemu-skripta.html)

Beck 08.08.2009 20:11

Помогите выявить проблему скрипта
 
Написал тут скрипт для выбора категорий, работает в Firefox и Опере, но отказывается работать в IE6,7 и в Google Chrome.

Firebug ошибок не показывает.

Данные вытаскиваются из многомерных массивов.
Прогонял переменные по console.log(); , всё выводит.

Заранее огромное спасибо! Я только новичек, так что сильно не пинайте. :D


var current_cat1 = 'null1';
var current_cat2 = 'null2';
var current_cat3 = 'null3';





function call_cats() {

	fill_cat1();
	fill_cat2();
	fill_cat3();

}







function fill_cat1() {

	$('#cat1').html('');
	var selected = '';

	var cat1 = $('#cat1');
	
	cat1.prepend('<option id="null1" value="null1"></option>');

		var i = 0;

		while(i <= main_cats['main_cat_rows'] - 1) {
			if(current_cat1 == 'null1') {
			$('#null1', cat1).remove();
			cat1.prepend('<option id="null1" value="null1" selected></option>');
			current_cat2 = 'null2';current_cat3 = 'null3';
			}
			if(current_cat1 == i){var selected = 'selected';
			cat1.append('<option ' + selected + ' value="' + i + '">' + main_cats['main_cat'][i] + '</option>');
			i++;
			}
			
			cat1.append('<option value="' + i + '">' + main_cats['main_cat'][i] + '</option>');
			i++;
		}
	$('#cat1 option').bind("click", function(){current_cat1 = $(this).attr('value'); call_cats();});	
}








function fill_cat2() {

	$('#cat2').html('');
	var selected = '';
	
	var cat2 = $('#cat2');
	
	cat2.prepend('<option id="null2" value="null2"></option>');
	
		var i = 0;
		
		while(i <= sub_cats['list_rows'][current_cat1] - 1) {
			if(current_cat2 == 'null2') {
			$('#null2', cat2).remove();
			cat2.prepend('<option id="null2" value="null2" selected></option>');
			current_cat3 = 'null3';			
			}
			if(current_cat2 == i){var selected = 'selected';
			cat2.append('<option ' + selected + ' value="' + i + '">' + sub_cats['list_all'][current_cat1][i] + '</option>');
			i++;
			}
			cat2.append('<option value="' + i + '">' + sub_cats['list_all'][current_cat1][i] + '</option>');
		i++;
		}
	$('#cat2 option').bind("click", function(){current_cat2 = $(this).attr('value'); call_cats();});
}








function fill_cat3() {

	$('#cat3').html('');
	var selected = '';
	
	var cat3 = $('#cat3');
	
	cat3.prepend('<option id="null3" value="null3"></option>');
	
		var i = 0;
		while(i <= sub_cats['list_sub_rows'][current_cat2] - 1) {
			if(current_cat3 == 'null3') {$('#null3', cat3).remove();cat3.prepend('<option id="null3" value="null3" selected></option>');}
			if(current_cat3 == i){var selected = 'selected';
			cat3.append('<option ' + selected + ' value="' + i + '">' + sub_cats['sub_list'][current_cat1][current_cat2][i] + '</option>');
			i++;
			}
			cat3.append('<option value="' + i + '">' + sub_cats['sub_list'][current_cat1][current_cat2][i] + '</option>');
		i++;
		}
	$('#cat3 option').bind("click", function(){current_cat3 = $(this).attr('value'); call_cats();});
}

Beck 08.08.2009 23:08

Спасибо, не знал, что такая опция у вас есть.

Скажите хотябы, если проблема не в многомерных массивах.

Вроде синтаксис правильный, раз Firebug не ругается.

Может порядок действий где-то нарушен?

Андрей Параничев 08.08.2009 23:10

Попробуйте сначала генерировать html код в строковую переменную, а потом уже вставлять её в документ.
Причина может быть в этом.

Beck 09.08.2009 00:02

Не помогло. Я проверил, выводы опций идут нормально, только не работают две вещи почему-то.

1 - реакции на эти строки в IE6 & IE7 и Chrome полный ноль:

$('#cat1 option').bind("click", function(){current_cat1 = $(this).attr('value'); call_cats();});

$('#cat2 option').bind("click", function(){current_cat2 = $(this).attr('value'); call_cats();});

$('#cat3 option').bind("click", function(){current_cat3 = $(this).attr('value'); call_cats();});


2 - на эти строки IE6 & IE7 и Chrome почему-то тоже никак не реагируют:

$('#cat2').html('');

$('#cat3').html('');

x-yuri 10.08.2009 00:24

а если внутри function () { ... } вставить alert(1); окно не появляется в ie?

а ie ошибки показывает (иконка в строке состояния, возможно нужно отладчик для этого включить в настройках)?

вообще-то должно работать, дай ссылку на страницу или прикрепи ее к сообщению

Beck 10.08.2009 01:28

Решил проблему через hover, не знаю почему, но в IE и Хроме какой-то баг, если прикрепить к select опциям click эвент.

x-yuri 10.08.2009 01:35

а что требуется? отреагировать на изменение состояния select? Тогда лучше на select повесить onchange

Beck 10.08.2009 01:35

И еще одна вещь. Как сделать так, чтобы определенная переменная перепроверяла себя, допустим каждую секунду, на изменения внесенные в DOM?


Да я весь код переписал заного. Уже не знаю, если честно. :)


Могу выложить, если интересно, но у меня еще одна вещь не до конца работает.

Там третья категория не становится пустой, если во второй выбрали пустую ячейку.



Насчет переменной:

У меня там переменная содержит селектор cat1.find('option:selected').attr('value');

Так вот его очень часто надо обновлять, что не очень удобно.

Есть какие советы?

Заранее спасибо.

Beck 10.08.2009 02:02

О господи, истина была рядом. Как только вы мне напомнили про onchange.
Я сразу вспомнил об change(fn)

Мда....

Надо получше ознакомится с документацией... :|

Но вопрос об var current_cat1 = cat1.find('option:selected').attr('value'); всё еще остается открытым. :)

x-yuri 10.08.2009 05:35

Цитата:

Сообщение от Beck
И еще одна вещь. Как сделать так, чтобы определенная переменная перепроверяла себя, допустим каждую секунду, на изменения внесенные в DOM?

зачем?

Цитата:

Сообщение от Beck
Могу выложить, если интересно, но у меня еще одна вещь не до конца работает.

если честно, то неинтересно, но могу помочь

Цитата:

Сообщение от Beck
Там третья категория не становится пустой, если во второй выбрали пустую ячейку

дай ссылку или прикрепи страничку к сообщению

Цитата:

Сообщение от Beck
У меня там переменная содержит селектор cat1.find('option:selected').attr('value');

Так вот его очень часто надо обновлять, что не очень удобно.

Есть какие советы?

есть, не обновлять: получать значение только тогда, когда нужно


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