Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверить, если ли в select
 
 автор: OLi   (25.10.2012 в 16:23)   письмо автору
 
 

Как проверить, есть ли в select элемент с option value = "90"?

  Ответить  
 
 автор: DJ Paltus   (25.10.2012 в 16:53)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: OLi   (25.10.2012 в 17:04)   письмо автору
 
   для: 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>');

        }


      });


      
    });

  Ответить  
 
 автор: confirm   (25.10.2012 в 17:10)   письмо автору
 
   для: OLi   (25.10.2012 в 17:04)
 

А на jQuery не надо вообще циклов, достаточно проверить по фильтру есть ли требуемое.

  Ответить  
 
 автор: confirm   (25.10.2012 в 17:09)   письмо автору
 
   для: 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.

  Ответить  
 
 автор: OLi   (25.10.2012 в 17:12)   письмо автору
 
   для: confirm   (25.10.2012 в 17:09)
 

Там ошибочно написал: не alert(id) а alert(this.value);

  Ответить  
 
 автор: confirm   (25.10.2012 в 17:18)   письмо автору
 
   для: OLi   (25.10.2012 в 17:12)
 

Не надо алертов, и не надо циклов, в jquery и без этого можно узнать, вернее он сделает обход циклом, но писать это ни к чему.

  Ответить  
 
 автор: OLi   (25.10.2012 в 17:22)   письмо автору
 
   для: confirm   (25.10.2012 в 17:18)
 

Подскажите как сделать без цикла?

  Ответить  
 
 автор: confirm   (25.10.2012 в 17:24)   письмо автору
 
   для: OLi   (25.10.2012 в 17:22)
 

Я вам кажется давал ссылку на довольно неплохой сервис по jquery. Почему бы самому для начала не попытаться найти ответ на нем? А если это так трудно будет, тогда... но вряд-ли это должно вас затруднить.

  Ответить  
 
 автор: ЯСА   (25.10.2012 в 17:55)   письмо автору
 
   для: 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;
        } // зачем дальше цикл гонять, если искомое найдено?

  Ответить  
 
 автор: DJ Paltus   (26.10.2012 в 11:46)   письмо автору
 
   для: ЯСА   (25.10.2012 в 17:55)
 

Дальше цикл гонять - а что, если несколько опций селекта равны искомому значению?

  Ответить  
 
 автор: ЯСА   (26.10.2012 в 11:52)   письмо автору
 
   для: DJ Paltus   (26.10.2012 в 11:46)
 

читаем исходное задание - Как проверить, есть ли в select элемент с option value = "90"?

требуется ответ - либо "есть", либо "нет"

  Ответить  
 
 автор: Deed   (25.10.2012 в 22:06)   письмо автору
 
   для: OLi   (25.10.2012 в 16:23)
 

var ff = $('#sel').find("option[value='90']");
if(ff){
    $('#log').text('we found it!');
}

  Ответить  
 
 автор: OLi   (26.10.2012 в 21:19)   письмо автору
 
   для: 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>

  Ответить  
 
 автор: confirm   (26.10.2012 в 21:49)   письмо автору
 
   для: OLi   (26.10.2012 в 21:19)
 

Как вы изучаете что-то, только нужный кусочек, а остальное по-боку? Ну хотя бы из любопытства заглянуть дальше можно, авось пригодится?
Метод .data(), метод $.inArray().
Изучите, подумайте.

  Ответить  
 
 автор: OLi   (26.10.2012 в 22:20)   письмо автору
 
   для: confirm   (26.10.2012 в 21:49)
 

Спасибо - пригодилось

  Ответить  
 
 автор: OLi   (26.10.2012 в 22:59)   письмо автору
 
   для: 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;
  });

  Ответить  
 
 автор: confirm   (26.10.2012 в 23:03)   письмо автору
 
   для: OLi   (26.10.2012 в 22:59)
 

Прочесть прочли, а не подумали, иначе бы сделали совсем не это.

  Ответить  
 
 автор: OLi   (26.10.2012 в 23:15)   письмо автору
 
   для: confirm   (26.10.2012 в 23:03)
 

Первое что в голову пришло, то и сделал..наведите на мысль, как иначе?

  Ответить  
 
 автор: confirm   (27.10.2012 в 07:31)   письмо автору
 
   для: 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>

Раз выбрано, все, отвали... И никаких проверок. А может не так надо. Может быть, мне то почем знать.

  Ответить  
 
 автор: OLi   (27.10.2012 в 12:55)   письмо автору
 
   для: confirm   (27.10.2012 в 07:31)
 

Т-е каждый элемент html (например A) на странице имеет свой некий не повторяющийся индекс? А если на страницу будет добавлена еще одна ссылка, индекс ее будет index = последний последней ссылки + 1? И не будут ли смещены индексы предыдущих ссылок?

  Ответить  
 
 автор: confirm   (27.10.2012 в 13:14)   письмо автору
 
   для: OLi   (27.10.2012 в 12:55)
 

DOM элементы страницы, это массив элементов, и как любой массив, естественно имеет индексы.
Я вам об этих индексах говорил, и не раз.
Но добавление элемента на страницу, еще не означает, что он получит последний индекс среди родственных ему элементов, так как это будет зависеть от того, куда он добавляется.
И забудьте в конце концов о ссылках. Кроме тех что вы добавляете, ради щелчка, думаю, что на странице будут и нормальные ссылки.
Как получить индекс элемента в наборе я вам уже показывал. jQuery имеет для этого метод, позволяющий вернуть индекс в любом наборе.
Думать надо не о том, что сместится индекс, а о том, как правильно задать обработчик.

  Ответить  
 
 автор: OLi   (27.10.2012 в 13:48)   письмо автору
 
   для: 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 от предыдущего клика в этом наборе на только что сделанный клик. (Допустить лишь одно значение из набора).

  Ответить  
 
 автор: confirm   (27.10.2012 в 14:06)   письмо автору
 
   для: 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>

И что можно искать только Мерседс? А если надо найти Ладу, Пежо.., и тогда на каждую элемент свой?

  Ответить  
 
 автор: OLi   (27.10.2012 в 14:24)   письмо автору
 
   для: 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 очищается и заполняется по предыдущему принципу.

  Ответить  
 
 автор: confirm   (27.10.2012 в 15:05)   письмо автору
 
   для: OLi   (27.10.2012 в 14:24)
 

Ну у них ведь набор взаимосвязанный, Ajax подгружает, ну и т.п., а что вы представляете неизвестно ведь.
И этот набор вы помещаете в список со множественным выбором?

  Ответить  
 
 автор: OLi   (27.10.2012 в 15:47)   письмо автору
 
   для: confirm   (27.10.2012 в 15:05)
 

Набор взаимосвязанный, но мне не нужен весь этот набор, а только то, что выбрано..
Да - помещается в список то, что было выбрано...

  Ответить  
 
 автор: confirm   (27.10.2012 в 15:51)   письмо автору
 
   для: OLi   (27.10.2012 в 15:47)
 

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

  Ответить  
 
 автор: OLi   (27.10.2012 в 17:04)   письмо автору
 
   для: confirm   (27.10.2012 в 15:51)
 

Если марка не выбрана - то модели не подгрузятся. Какие 2 остальные?

  Ответить  
 
 автор: confirm   (27.10.2012 в 17:18)   письмо автору
 
   для: OLi   (27.10.2012 в 17:04)
 

Создайте форму в которой поместите три списка каждый с двумя опциями (для уяснения этого хватит). В списках не делайте выбранных по умолчанию опций. Назовите каждый список, например, as[]. Выберите опции только второго и третьего списка. Отправьте форму, и посмотрите что получили.
А теперь замените эти три списка одним со множественным выбором, с тремя опциями, выберите в нем также вторую и третью опцию. Отправляйте форму, что на этот раз получаете?

  Ответить  
 
 автор: Deed   (27.10.2012 в 21:09)   письмо автору
 
   для: OLi   (27.10.2012 в 17:04)
 

http://jsfiddle.net/kilotonna/FUsmZ/16/

  Ответить  
 
 автор: confirm   (28.10.2012 в 02:54)   письмо автору
 
   для: Deed   (27.10.2012 в 21:09)
 

И к чему вы мне эту хрень показываете? Вы блин не понимаете простой вещи, что ваш муьтисписок вернет во втором случае два значения сдвинуты в начало. То есть, модель, которую вы могли бы ожидать вторым элементом массива, в этом случае придет первым.
Даже на этой хрени, что вы указываете, этот баг виден, и тем не менее вы упорно это делаете. Плюс и другой баг заметен - не соблюдается ваше же требование по одному значению из одного набора.
Вы так видимо все и делаете, первое что на ум взбредет?
Сделайте и отправьте то, что я вам писал, это будет лучше для понимания того, что ваш код бред полный.

  Ответить  
 
 автор: Deed   (28.10.2012 в 08:49)   письмо автору
 
   для: confirm   (28.10.2012 в 02:54)
 

Подбирайте слова.
У него все числовые значения атрибута "rel" уникальны и их взаимное расположение в массиве роли не играет.
Потыкайте кнопки, а потом будете писать про "одно значение из одного набора".

  Ответить  
 
 автор: confirm   (28.10.2012 в 08:56)   письмо автору
 
   для: Deed   (28.10.2012 в 08:49)
 

Повторяю для сугубо одаренных - тыкайте сами, коли вам надо, а я удостоверился, что это полная хрень.
Уникальные? А вы уверены в этом? Это вы этот пример видите, но не знаете что есть на самом деле. А если вы считаете, что автоинкремент базы данных генерирует уникальность не только в одной таблице, но и уникальность среди таблиц, то заблуждаетесь.
Насчет последовательности, которая не играет роли, в свете вышесказанного, то вы несете бред, ни чем не лучше кода, который считаете идеальным.
Вот каков у него код, такие у него и запросы к базе, от которых волосы дыбом, иначе не скажешь.

И заметьте, в адрес автора я ни слова ни сказал обидного, так что без адвокатов, пожалуйста.

  Ответить  
 
 автор: OLi   (28.10.2012 в 13:19)   письмо автору
 
   для: confirm   (28.10.2012 в 08:56)
 

У меня все значения уникальны, т-е формирующийся список будет иметь уникальные ID.

  Ответить  
 
 автор: OLi   (28.10.2012 в 13:25)   письмо автору
 
   для: OLi   (28.10.2012 в 13:19)
 

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

  Ответить  
 
 автор: confirm   (28.10.2012 в 14:33)   письмо автору
 
   для: 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.

Итого, всего один махонький обработчик, вместо трех, и без всякого шаманства основанного на некой глобальной уникальности.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования