|
|
|
| Как проверить, есть ли в select элемент с option value = "90"? | |
|
|
|
|
|
|
|
для: OLi
(25.10.2012 в 16:23)
| | Это работает, но как всегда, ждем критики со стороны Конфёрма и ЯСА.
<select id=sel>
<option value="3">Item1</option>
<option value="4">Item2</option>
<option value="80">Item3</option>
<option value="5">Item4</option>
</select>
<div id=log></div>
<script type=text/javascript>
var find = 90;
var sel = document.getElementById("sel");
var opts = sel.getElementsByTagName("option");
for (var i=0; i<=opts.length-1; i++){
if(opts[i].value == find){
document.getElementById("log").innerHTML += "<br>Элемент " + i + " равен " + find;
}
}
</script>
|
| |
|
|
|
|
|
|
|
для: DJ Paltus
(25.10.2012 в 16:53)
| | А вот вспомнил про each и сделал так:
Только вот при втором клике и последующих, если сделать alert(id) выводит одно и тоже число, от второго клика
$(".form_advanced a").click(function() {
var id = $(this).attr('rel');
var th = $(this);
$("#ids").each(function(){
alert(this.value);
if(this.value == id) {
th.RemoveClass('a_search_l');
} else {
th.addClass('a_search_l');
$('#ids').append('<option selected="selected" value="' +id+ '"></option>');
}
});
});
|
| |
|
|
|
|
|
|
|
для: OLi
(25.10.2012 в 17:04)
| | А на jQuery не надо вообще циклов, достаточно проверить по фильтру есть ли требуемое. | |
|
|
|
|
|
|
|
для: DJ Paltus
(25.10.2012 в 16:53)
| | Не надо критики, просто надо знать, что число опций списка, это свойство length самого списка. Ну и в добавок - зачем такая арифметика в виде <=opts.length-1, разве без нее не обойтись если проверять только на меньшее?
<select id=sel>
<option value="3">Item1</option>
<option value="4">Item2</option>
<option value="80">Item3</option>
<option value="5">Item4</option>
</select>
<div id=log></div>
<script type=text/javascript>
var sel = document.getElementById("sel");
alert(sel.length)
for (var i=0; i<sel.length; i++)
document.getElementById("log").innerHTML += sel[i].value+"<br>";
</script>
|
Ну и бог знает, может надо на jQuery. | |
|
|
|
|
|
|
|
для: confirm
(25.10.2012 в 17:09)
| | Там ошибочно написал: не alert(id) а alert(this.value); | |
|
|
|
|
|
|
|
для: OLi
(25.10.2012 в 17:12)
| | Не надо алертов, и не надо циклов, в jquery и без этого можно узнать, вернее он сделает обход циклом, но писать это ни к чему. | |
|
|
|
|
|
|
|
для: confirm
(25.10.2012 в 17:18)
| | Подскажите как сделать без цикла? | |
|
|
|
|
|
|
|
для: OLi
(25.10.2012 в 17:22)
| | Я вам кажется давал ссылку на довольно неплохой сервис по jquery. Почему бы самому для начала не попытаться найти ответ на нем? А если это так трудно будет, тогда... но вряд-ли это должно вас затруднить. | |
|
|
|
|
|
|
|
для: DJ Paltus
(25.10.2012 в 16:53)
| |
var opts = sel.getElementsByTagName("option");
var opts = sel.options;
| &
if(opts[i].value == find){
document.getElementById("log").innerHTML += "<br>Элемент " + i + " равен " + find; break;
} // зачем дальше цикл гонять, если искомое найдено?
|
| |
|
|
|
|
|
|
|
для: ЯСА
(25.10.2012 в 17:55)
| | Дальше цикл гонять - а что, если несколько опций селекта равны искомому значению? | |
|
|
|
|
|
|
|
для: DJ Paltus
(26.10.2012 в 11:46)
| | читаем исходное задание - Как проверить, есть ли в select элемент с option value = "90"?
требуется ответ - либо "есть", либо "нет" | |
|
|
|
|
|
|
|
для: OLi
(25.10.2012 в 16:23)
| |
var ff = $('#sel').find("option[value='90']");
if(ff){
$('#log').text('we found it!');
}
|
| |
|
|
|
|
|
|
|
для: Deed
(25.10.2012 в 22:06)
| | Корректируем немного задание:
$(".form_advanced .block a").click(function() {
var id = $(this).attr('rel');
var th = $(this);
$(".form_advanced .block a").each(function() {
$(this).removeClass('a_search_l');
});
$("#ids").each(function(){
if(this.value == id) {
th.RemoveClass('a_search_l');
} else {
th.addClass('a_search_l');
$('#ids').append('<option selected="selected" value="' +id+ '"></option>');
}
});
return false;
});
|
Проблема в том, что при проходе по option val и сравнения существующих в списке value с id от элемента, по которому кликнули, происходит добавление повторяющихся id в список
<select id="ids" name="ids[]" multiple="multiple"><option selected="selected" value="924"></option><option selected="selected" value="923"></option><option selected="selected" value="923"></option><option selected="selected" value="923"></option></select>
|
| |
|
|
|
|
|
|
|
для: OLi
(26.10.2012 в 21:19)
| | Как вы изучаете что-то, только нужный кусочек, а остальное по-боку? Ну хотя бы из любопытства заглянуть дальше можно, авось пригодится?
Метод .data(), метод $.inArray().
Изучите, подумайте. | |
|
|
|
|
|
|
|
для: confirm
(26.10.2012 в 21:49)
| | Спасибо - пригодилось | |
|
|
|
|
|
|
|
для: OLi
(26.10.2012 в 22:20)
| | Сделал так:
$(".form_advanced .block a").click(function() {
var id = $(this).attr('rel');
var th = $(this);
$(".form_advanced .block a").each(function() {
$(this).removeClass('a_search_l');
});
var el_pos_f = $.inArray(id, ids);
if (el_pos_f ==-1) {
ids.push(id);
th.addClass('a_search_l');
$('#ids').append('<option selected="selected" value="' +id+ '"></option>');
} else {
ids.splice(el_pos_f,1);
$('#ids option[value='+id+']').remove();
th.RemoveClass('a_search_l');
}
return false;
});
|
| |
|
|
|
|
|
|
|
для: OLi
(26.10.2012 в 22:59)
| | Прочесть прочли, а не подумали, иначе бы сделали совсем не это. | |
|
|
|
|
|
|
|
для: confirm
(26.10.2012 в 23:03)
| | Первое что в голову пришло, то и сделал..наведите на мысль, как иначе? | |
|
|
|
|
|
|
|
для: OLi
(26.10.2012 в 23:15)
| | Я не наводчик, я как и Яшка, артиллерист, могу только расстрелять. )
Я до сих пор не понимаю, чего вы там у себя "ищите", чего пытаетесь делать, а значит о какой наводке может идти речь? Могу стрелять только наугад. Я вам давал ссылки методов, для того чтобы подумать, что можно сделать, тем более, что о массивах вы некогда сами упоминали.
Вы ведь даже данный вопрос задаете, совсем не описывая условия, ну и пожалуйста:
<script>
var arr = [];
$(function(){
$('span').on('click', function(){
arr[$(this).index()] = $(this).text();
$(this).off('click');
alert(arr);
});
});
</script>
<span>111</span>
<span>222</span>
<span>333</span>
|
Раз выбрано, все, отвали... И никаких проверок. А может не так надо. Может быть, мне то почем знать. | |
|
|
|
|
|
|
|
для: confirm
(27.10.2012 в 07:31)
| | Т-е каждый элемент html (например A) на странице имеет свой некий не повторяющийся индекс? А если на страницу будет добавлена еще одна ссылка, индекс ее будет index = последний последней ссылки + 1? И не будут ли смещены индексы предыдущих ссылок? | |
|
|
|
|
|
|
|
для: OLi
(27.10.2012 в 12:55)
| | DOM элементы страницы, это массив элементов, и как любой массив, естественно имеет индексы.
Я вам об этих индексах говорил, и не раз.
Но добавление элемента на страницу, еще не означает, что он получит последний индекс среди родственных ему элементов, так как это будет зависеть от того, куда он добавляется.
И забудьте в конце концов о ссылках. Кроме тех что вы добавляете, ради щелчка, думаю, что на странице будут и нормальные ссылки.
Как получить индекс элемента в наборе я вам уже показывал. jQuery имеет для этого метод, позволяющий вернуть индекс в любом наборе.
Думать надо не о том, что сместится индекс, а о том, как правильно задать обработчик. | |
|
|
|
|
|
|
|
для: confirm
(27.10.2012 в 13:14)
| | Сложность вот в чем:
Есть несколько наборов из элементов по которым происходит клик.
Эти наборы определены в контейнерах DIV.
Пример:
1) <div id="marka"><span rel="23">VW</span><span rel="19">Mersedes</span></div>
2) <div id="model"><span rel="13">Golf</span><span rel="28">A4</span></div>
3) <div id="petrol"><span rel="132">Дизель</span><span rel="285">Бензин</span></div>
..... и тд
|
Из прошлых вопросов на форуме, я решил, что мне выгодно хранить все rel значения от ссылок в списке SELECT.
НО, из каждого набора 1,2,3 и тд, нужно допустить лишь один выбор, клик по одному элементу, значение которого (rel) заносится в SELECT OPTION SELECTED, c таким условием, что при повторном клике на элемент из этого же набора, шла замена в SELECT от предыдущего клика в этом наборе на только что сделанный клик. (Допустить лишь одно значение из набора). | |
|
|
|
|
|
|
|
для: OLi
(27.10.2012 в 13:48)
| | >c таким условием, что при повторном клике на элемент из этого же набора, шла замена в SELECT от предыдущего клика в этом наборе на только что сделанный клик.
О чем тут речь? И зачем вообще что-то заменять?
<script>
var arr = [];
$(function(){
$('#set div').on('click','span', function(){
$(this).parent().children().css('background','#fff');
var k = $(this).parent().index();
if($(this).is('[val]')) {
$(this).css('background','#ccc');
arr[k] = $(this).attr('val');
} else arr.splice(k,1,0);
$('#inf').html(arr.join('<br>'));
});
});
</script>
<div id="set">
<div id="marka"><span val="23">VW</span> <span val="19">Mersedes</span> <span>reset</span></div>
<div id="model"><span val="13">Golf</span> <span val="28">A4</span> <span>reset</span></div>
<div id="petrol"><span val="132">Дизель</span> <span val="285">Бензин</span> <span>reset</span></div>
</div>
<p id="inf"></p>
|
И что можно искать только Мерседс? А если надо найти Ладу, Пежо.., и тогда на каждую элемент свой? | |
|
|
|
|
|
|
|
для: confirm
(27.10.2012 в 14:06)
| | Поглядите эту ссылку, для прмера:
[url]kolesa(точка)kz/a/search?cat=auto.car&das%5Bauto.car.grbody%5D=&das%5Bauto.car.mm%5D%5B0%5D=62&das%5Bauto.car.mm%5D%5B1%5D=80&das%5Bregion%5D=&das%
5Bprice%5D%5Bl%5D=&das%5Bprice%5D%5Bh%5D=&das%5
Byear%5D%5Bl%5D=&das%5Byear%5D%5Bh%5D=&das%5B_sys.torg%5D=
&das%5Bhas_change%5D=&das%5Bauto.condition%5D=&das%5Bauto.fuel%5D=&das%5Bauto.car.volume%5D%5Bl%5D=&das%5Bauto.car.volume%5D%5Bh%5D=
&das%5Bauto.run%5D%5Bh%5D=&das%5Bauto.car.transm%5D=&das%5Bauto.color%5D=&das%5Bauto.color_m%5D=&das%5Bcar.dwheel%5D=&_txt_=
&das%5B_sys.hasphoto%5D=[/url]
Можно заметить, что выбрана одна марка Mercedes-Benz, и для нее можно выбрать лишь одну модель из всего набора (в данном случае выбрано E 230)
Пусть Mercedes-Benz определен как число 89
Тогда по клику на него в select занесется значение 89
Пусть E 230 определено как 109, тогда по клику на нее, в select занесется 109
Список будет иметь вид:
<option selected value="89"></option>
<option selected value="109"></option>
|
Тут мы передумали и захотели искать по модели E200 (определено как 45), тогда наш список преобразовался:
<option selected value="89"></option>
<option selected value="45"></option>
|
Здесь видна эта замена...
Тут мы решили искать не по марке Mercedes-Benz, а по Toyota, тогда весь список select очищается и заполняется по предыдущему принципу. | |
|
|
|
|
|
|
|
для: OLi
(27.10.2012 в 14:24)
| | Ну у них ведь набор взаимосвязанный, Ajax подгружает, ну и т.п., а что вы представляете неизвестно ведь.
И этот набор вы помещаете в список со множественным выбором? | |
|
|
|
|
|
|
|
для: confirm
(27.10.2012 в 15:05)
| | Набор взаимосвязанный, но мне не нужен весь этот набор, а только то, что выбрано..
Да - помещается в список то, что было выбрано... | |
|
|
|
|
|
|
|
для: OLi
(27.10.2012 в 15:47)
| | А вы представляете, что получите, если я не сделаю выбора марки авто, а только два остальных, если будете использовать такой список? | |
|
|
|
|
|
|
|
для: confirm
(27.10.2012 в 15:51)
| | Если марка не выбрана - то модели не подгрузятся. Какие 2 остальные? | |
|
|
|
|
|
|
|
для: OLi
(27.10.2012 в 17:04)
| | Создайте форму в которой поместите три списка каждый с двумя опциями (для уяснения этого хватит). В списках не делайте выбранных по умолчанию опций. Назовите каждый список, например, as[]. Выберите опции только второго и третьего списка. Отправьте форму, и посмотрите что получили.
А теперь замените эти три списка одним со множественным выбором, с тремя опциями, выберите в нем также вторую и третью опцию. Отправляйте форму, что на этот раз получаете? | |
|
|
|
|
|
|
|
|
для: Deed
(27.10.2012 в 21:09)
| | И к чему вы мне эту хрень показываете? Вы блин не понимаете простой вещи, что ваш муьтисписок вернет во втором случае два значения сдвинуты в начало. То есть, модель, которую вы могли бы ожидать вторым элементом массива, в этом случае придет первым.
Даже на этой хрени, что вы указываете, этот баг виден, и тем не менее вы упорно это делаете. Плюс и другой баг заметен - не соблюдается ваше же требование по одному значению из одного набора.
Вы так видимо все и делаете, первое что на ум взбредет?
Сделайте и отправьте то, что я вам писал, это будет лучше для понимания того, что ваш код бред полный. | |
|
|
|
|
|
|
|
для: confirm
(28.10.2012 в 02:54)
| | Подбирайте слова.
У него все числовые значения атрибута "rel" уникальны и их взаимное расположение в массиве роли не играет.
Потыкайте кнопки, а потом будете писать про "одно значение из одного набора". | |
|
|
|
|
|
|
|
для: Deed
(28.10.2012 в 08:49)
| | Повторяю для сугубо одаренных - тыкайте сами, коли вам надо, а я удостоверился, что это полная хрень.
Уникальные? А вы уверены в этом? Это вы этот пример видите, но не знаете что есть на самом деле. А если вы считаете, что автоинкремент базы данных генерирует уникальность не только в одной таблице, но и уникальность среди таблиц, то заблуждаетесь.
Насчет последовательности, которая не играет роли, в свете вышесказанного, то вы несете бред, ни чем не лучше кода, который считаете идеальным.
Вот каков у него код, такие у него и запросы к базе, от которых волосы дыбом, иначе не скажешь.
И заметьте, в адрес автора я ни слова ни сказал обидного, так что без адвокатов, пожалуйста. | |
|
|
|
|
|
|
|
для: confirm
(28.10.2012 в 08:56)
| | У меня все значения уникальны, т-е формирующийся список будет иметь уникальные ID. | |
|
|
|
|
|
|
|
для: OLi
(28.10.2012 в 13:19)
| | Пример вполне работающий, только ошибка в том, что если выбрать только данные из первого списка (при этом были выбраны данные из последующих списков), то они затирают | |
|
|
|
|
|
|
|
для: OLi
(28.10.2012 в 13:19)
| | Трудно даже вообразить, что за таблицы у вас при этом.
Есть авто, которые могут иметь самые разные характеристики, а это значит хранить их лучше в другой таблице связанной с первой. Каждая из этих таблиц предполагает добавление, а значит и уникальность записей, и каким образом может быть обеспечена уникальность их, если представить все эти записи в одной плоскости?
Да ладно, бог с ними с вашими уникальностями, может это так кажется, что у вас бардак, потому, что не видно полной картины.
Но взгляните на сайт казахский еще раз - есть набор, и при этом пользователя никто не обязывает его выбрать в этом наборе что-то. И есть выбор "все", и даже не зная всей конкретики, можно предположить, что это выбор по умолчанию.
А что у вас?
Я вам давал ссылки на методы, один из них .data(). Этот метод закрепляет за объектом любой набор данных. А это означает, что элементы родители элементов набора могут хранить выбор из этого набора.
А что у вас?
Вы дергаете страницу добавляя/удаляя элемент, что затратно само по себе, а хуже всего то, что этого в данном случае не требуется. И делаете вы это некорректно, и можно выбрать два одинаковых ваших "уникальных" значения.
Пример с учетом того, что пользователь может не сделать выбор в одной или нескольких позициях, и об этом сервер должен знать, а факт того, что в базе нет id значений равных 0, то это и будет значением по умолчанию ("все"):
<script>
$(function(){
//устанавливаем значения выбора по умолчанию и обработчик
$('#set div[id |= box]')
.data('val',0)
.on('click', 'span[val]', function(){
$(this).parent()
.data('val',$(this).attr('val'))//запомнить выбор
.children()
.css('background','#fff');
$(this).css('background','#ccc');
});
//отправка формы
$('form').submit(function(){
//формируем и добавляем список
var s = '<select name=ids[] multiple style="display:none">';
$('#set div').each(function(){
s += '<option value='+$(this).data('val')+' selected>';
});
$(this).append(s+'</select>');
});
});
</script>
<div id="set">
<div id="box-marka"><span val="23">VW</span> <span val="19">Mersedes</span></div>
<div id="box-model"><span val="13">Golf</span> <span val="28">A4</span></div>
<div id="box-petrol"><span val="132">Дизель</span> <span val="285">Бензин</span></div>
</div>
<form action="">
<input name="set" value="value" />
<input type="submit" value="GO" />
</form>
|
Возможно родитель может содержать и иные элементы div, поэтому обработчик устанавливается на элементы имен по их префиксам, по тем же соображениям делегируются события только тех элементов, у которых есть атрибут val.
Итого, всего один махонький обработчик, вместо трех, и без всякого шаманства основанного на некой глобальной уникальности. | |
|
|
|