Наверное, массивы
Всем здравствуйте.
Пытаюсь писать на jQuery, но вопрос не по библиотеке, собственно. Есть элемент кода: $('#[*id*] .sort a#' + размер1).click(function(e) { $('#[*id*] .all').quicksand( $('#[*id*] .format' + размер1 + 'li')); e.preventDefault(); $("#[*id*] a#style" + стиль1).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль1 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль2).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль2 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль3).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль3 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль4).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль4 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль5).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль5 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль6).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль6 + 'li')); e.preventDefault();}); }); Внимание стоит обратить на кириллические части кода. Есть 3 размера (размер1, размер2, размер3) и 6 стилей (стиль1, стиль2...). Тут приведен код по размеру номер 1. Такой же точно код только с размером2 и размером3 я не запостил - он такой же. По каждому размеру перебираются 6 стилей. Вопрос: как упростить код? (Наверное, с помощью массивов - я несилён) Потому что сейчас он занимает какое-то нереальное кол-во строк. Подскажите, пожалуйста. Заранее спасибо. |
На всякий случай, весь код целиком
$('#[*id*] .sort a#' + размер1).click(function(e) { $('#[*id*] .all').quicksand( $('#[*id*] .format' + размер1 + 'li')); e.preventDefault(); $("#[*id*] a#style" + стиль1).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль1 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль2).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль2 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль3).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль3 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль4).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль4 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль5).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль5 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль6).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер1 + стиль6 + 'li')); e.preventDefault();}); }); $('#[*id*] .sort a#' + размер2).click(function(e) { $('#[*id*] .all').quicksand( $('#[*id*] .format' + размер2 + 'li')); e.preventDefault(); $("#[*id*] a#style" + стиль1).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер2 + стиль1 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль2).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер2 + стиль2 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль3).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер2 + стиль3 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль4).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер2 + стиль4 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль5).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер2 + стиль5 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль6).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер2 + стиль6 + 'li')); e.preventDefault();}); }); $('#[*id*] .sort a#' + размер3).click(function(e) { $('#[*id*] .all').quicksand( $('#[*id*] .format' + размер3 + 'li')); e.preventDefault(); $("#[*id*] a#style" + стиль1).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер3 + стиль1 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль2).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер3 + стиль2 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль3).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер3 + стиль3 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль4).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер3 + стиль4 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль5).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер3 + стиль5 + 'li')); e.preventDefault();}); $("#[*id*] a#style" + стиль6).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + размер3 + стиль6 + 'li')); e.preventDefault();}); }); |
что должен делать код?
|
http://razorjack.net/quicksand/demos/attribute.html
Вот такое происходит с превьюшками корпоративных праздников (больших, маленьких, средних) в разных стилях: ковбои, 19 век, цыгане... То есть можно отсортировать все большие программы в стиле вестерн, все большие в стиле 19 века, все средние в цыганском стиле - в общем, любые комбинации. При этом есть готовые списки, уже рассортированные. Скрипт просто выполняет прикольную анимацию перехода от одного списка к другому. |
Без шансов? :cray:
|
Конечно массивы...
$("#[*id*] a#style" + st[j]).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + size[i] + st[j] + 'li')); e.preventDefault(); }); И два цикла. По i и по j... |
То есть вот так? И это заменит полностью весь длиннющий скрипт?
P.S. С синтаксисом всё так? var size = new Array(); size[0] = "small"; size[1] = "medium"; size[2] = "large"; var st = new Array(); st[0] = "west"; st[1] = "gypsy"; st[2] = "xix"; st[3] = "horse"; st[4] = "extreme"; st[5] = "moscow"; for (var i=0; i<size.length; i++) { for (var j=0; j<st.length; j++) { $("#[*id*] a#style" + st[j]).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + size[i] + st[j] + 'li')); e.preventDefault(); }); } } UPD: сейчас заметил: там же конструкция "функция(размер1){функция(ст иль1-6)}, функция(размер2){функция(ст ль1-6)}, функция(размер3){функция(ст ль1-6)}. А если вышеприведенная как раз только для внутренних функций "функция(стиль1-6)". То есть надо так? var size = new Array(); size[0] = "small"; size[1] = "medium"; size[2] = "large"; var st = new Array(); st[0] = "west"; st[1] = "gypsy"; st[2] = "xix"; st[3] = "horse"; st[4] = "extreme"; st[5] = "moscow"; for (var i=0; i<size.length; i++) { $('#[*id*] .sort a#' + size[i]).click(function(e) { $('#[*id*] .all').quicksand( $('#[*id*] .format' + size[i] + 'li')); e.preventDefault(); for (var j=0; j<st.length; j++) { $("#[*id*] a#style" + st[j]).click(function(e){ $('#[*id*] .all').quicksand( $('#[*id*] #' + size[i] + st[j] + 'li')); e.preventDefault(); }); } }); } |
Цитата:
var size = ["small", "medium", "large"] |
А в остальном по синтаксису самого скрипта всё правильно? Будет работать?
Цикл1 { функция {размер Цикл2 { функция {стиль} } } } |
Цитата:
|
Нет-нет, что вы ))
Имелось в виду: "похоже ли с виду на правду" )) Спасибо. Ушел тестировать. |
Протестировал. Не работает.
Пытаюсь вызвать alert по клику (см. код ниже) - возвращает undefined. Если вызывать alert вне функции клика (а до неё), возвращает подряд все три значения массива, а по клику - нет. =( for (var i=0; i<size.length; i++) { $('#[*id*] .sort a#' + size[i]).click(function(e) { alert(size[i]); $('#[*id*] .all').quicksand( $('#[*id*] .format' + size[i] + ' li')); e.preventDefault(); }); } |
Если точнее, то в функцию не передаётся значение [i]. Если написать просто alert(size), вернет все значения массива через запятую, а не то, по которому случилось событие .click();
UPD: Иными словами, как передать переменную цикла в функцию, которая начинается внутри этого цикла. Гугл ничего дельного (ну, или мне понятного) не выдаёт =( |
Решение нашлось вот тут: http://www.cyberforum.ru/javascript-...ead337692.html
Работающий код в итоге такой: var size = ("small","medium","large"); var st = ("west", "gypsy", "xix", "horse", "extreme", "moscow"); for (var i=0; i<size.length; i++) { (function(n){ $('.sort a#' + size[n]).click(function(e) { $(pid + ' .all').quicksand( $(pid + ' .format' + size[n] + ' li')); e.preventDefault(); for (var j=0; j<st.length; j++) { (function(m){ $("a#style" + st[m]).click(function(e){ $(pid + ' .all').quicksand( $(pid + ' #' + size[n] + st[m] + ' li')); e.preventDefault(); }); })(j); } }); })(i); } |
Цитата:
|
var size = new Array(); size[0] = "small"; size[1] = "medium"; size[2] = "large"; var st = new Array(); st[0] = "west"; st[1] = "gypsy"; st[2] = "xix"; st[3] = "horse"; st[4] = "extreme"; st[5] = "moscow"; Вот с этим. Да. P.S.: Для поисковиков и ищущих. В этой теме были решены такие проблемы, как: "оптимизировать javascript jquery код, сократить код, массивы, переменная цикла не передаётся в функцию, функция внутри цикла, передать переменную в функцию, массив не работает в функции." |
можно было просто круглые скобки заменить на квадратные :)
var size = ["small","medium","large"]; var st = ["west", "gypsy", "xix", "horse", "extreme", "moscow"]; ... |
Синтаксис, синтаксис и ещё раз синтаксис ))
Частным преподавательством не занимаетесь по JS? )) |
о нет. вы на возраст посмотрите ) какое преподавательство - я только сам в этом году начал их слушать :)
|
А мне казалось, что возраст не влияет на степень квалификации в некоторых случаях.
Я, когда мне было 18, преподавал бизнес-английский взрослым дядечкам и тётечкам и они были довольны =) |
а я не про квалификацию :)
|
Часовой пояс GMT +3, время: 19:53. |