ФорумПрограммированиеJavaScript → проблемы с динамическими select'ами

проблемы с динамическими select'ами

  • Trej Gun

    Сообщения: 5299 Репутация: N Группа: в ухо

    Spritz 21 сентября 2009 г. 9:53, спустя 10 минут 41 секунду


    я конечно прошу прощения за грубость, но я бы за такой код хуй оторвал.
    погоди, он хотябы в адеквате.
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 21 сентября 2009 г. 9:54, спустя 57 секунд



    я конечно прошу прощения за грубость, но я бы за такой код хуй оторвал.
    погоди, он хотябы в адеквате.
    про его адекватность я ничего покачто еще не говорил.
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 2:02, спустя 16 часов 7 минут 50 секунд

    Пожалуйста, посмотрите мой код, описанный выше я там что-то напортачил с передачей backend'у параметров.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 сентября 2009 г. 2:36, спустя 34 минуты 21 секунду

    gvik, покажи как теперь выглядит код, со всеми исправлениями
    И еще, используй "<?php", а не "<?"
    adw/0
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 2:55, спустя 19 минут 3 секунды

    Спасибо за совет. Я всегда так использую, так написано в книге Котерова.
    select.php

    <?php
    ini_set('display_errors',1);
    error_reporting(E_ALL ^E_NOTICE);

    $db = mysql_connect ("localhost", "root", "");
    mysql_query ("set character_set_client='cp1251'");
    mysql_query ("set character_set_results='cp1251'");
    mysql_query ("set collation_connection='cp1251_general_ci'");
    mysql_select_db("cars",$db);
    ?>
    <script src="JsHttpRequest.js"></script>

    <script>
    function doload(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;}
    req.open(null,"select2.php",true);
    req.send({brand:value});
    }

    function doload1(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result1").innerHTML=req.responseText;}
    req.open(null,"select3.php",true);
    req.send({brand:value, model:value});
    }

    function doload2(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result2").innerHTML=req.responseText;}
    req.open(null,"select4.php",true);
    req.send({brand:value, model:value, body:value});
    }
    </script>

    <form action="script.php" method="POST">

    <select name="brand" id="brand" onchange="doload(this.value);">
    <option value="no_action">–Выберите марку–</option>
    <?php
    $sql = mysql_query ("SELECT DISTINCT brand FROM t1");
    while ($new_brand = mysql_fetch_array($sql))
      echo '<option value='.$new_brand['brand'].'>'.$new_brand['brand'].'</option>';
    ?>
    </select>

    <br><br>

    <div id="result"></div>

    <br>

    <div id="result1"></div>

    <br>

    <div id="result2"></div>

    <input type="submit" value="Найти">

    </form>

    select2.php
    <?php 
    $db = mysql_connect ("localhost", "root", "");
    mysql_query ("set character_set_client='cp1251'");
    mysql_query ("set character_set_results='cp1251'");
    mysql_query ("set collation_connection='cp1251_general_ci'");
    mysql_select_db("cars",$db);

    require("JsHttpRequest.php");
    $JsHttpRequest=new JsHttpRequest("windows-1251");
    ?>
    <select name="model" id="model" onchange="doload1(this.value, this.value);">
    <option value="no_action">–Выберите модель–</option>
    <?php
    $sql = mysql_query ('SELECT DISTINCT model FROM t1 WHERE brand = "'.mysql_real_escape_string($_REQUEST["brand"]).'"');
    if($sql) {
       while ($new_model= mysql_fetch_array($sql)) {
           echo '<option value="'.$new_model['model'].'">'.$new_model['model'].'</option>';
       }
    } else {
       echo mysql_error();
    }
    ?>
    </select>

    select3.php
    <?php 
    $db = mysql_connect ("localhost", "root", "");
    mysql_query ("set character_set_client='cp1251'");
    mysql_query ("set character_set_results='cp1251'");
    mysql_query ("set collation_connection='cp1251_general_ci'");
    mysql_select_db("cars",$db);

    require("JsHttpRequest.php");
    $JsHttpRequest=new JsHttpRequest("windows-1251");
    ?>
    <select name="body" id="body" onchange="doload2(this.value, this.value, this.value);">
    <option value="no_action">–Выберите тип кузова–</option>
    <?php
    $sql = mysql_query ('SELECT DISTINCT body FROM t1 WHERE brand = "'.mysql_real_escape_string($_REQUEST["brand"]).'" AND model = "'.mysql_real_escape_string($_REQUEST["model"]).'"');
    if($sql) {
       while ($new_body= mysql_fetch_array($sql)) {
           echo '<option value="'.$new_body['body'].'">'.$new_body['body'].'</option>';
       }
    } else {
       echo mysql_error();
    }
    ?>
    </select>

    select4.php
    <?php 
    $db = mysql_connect ("localhost", "root", "");
    mysql_query ("set character_set_client='cp1251'");
    mysql_query ("set character_set_results='cp1251'");
    mysql_query ("set collation_connection='cp1251_general_ci'");
    mysql_select_db("cars",$db);

    require("JsHttpRequest.php");
    $JsHttpRequest=new JsHttpRequest("windows-1251");
    ?>
    <select name="fuel" id="fuel">
    <option value="no_action">–Выберите тип топлива–</option>
    <?php
    $sql = mysql_query ('SELECT DISTINCT fuel FROM t1 WHERE brand = "'.mysql_real_escape_string($_REQUEST["brand"]).'" AND model = "'.mysql_real_escape_string($_REQUEST["model"]).'" AND model = "'.mysql_real_escape_string($_REQUEST["body"]).'"');
    if($sql) {
       while ($new_fuel= mysql_fetch_array($sql)) {
           echo '<option value="'.$new_fuel['fuel'].'">'.$new_fuel['fuel'].'</option>';
       }
    } else {
       echo mysql_error();
    }
    ?>
    </select>
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 сентября 2009 г. 3:19, спустя 23 минуты 51 секунду

    Я всегда так использую, так написано в книге Котерова.
    Однако в предыдущих листингах вашего кода - вы используете короткую запись :)
    Спустя 105 сек.
    onchange="doload1(this.value, this.value);"

    Почему вы передаете 2 параметра, когда в функции определен только один?
    Спустя 215 сек.
    <script>
    function doload(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;}
    req.open(null,"select2.php",true);
    req.send({brand:value});
    }

    function doload1(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result1").innerHTML=req.responseText;}
    req.open(null,"select3.php",true);
    req.send({brand:value, model:value});
    }

    function doload2(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result2").innerHTML=req.responseText;}
    req.open(null,"select4.php",true);
    req.send({brand:value, model:value, body:value});
    }
    </script>


    У вас эти функции отличатся только тем, что используются разные бекенды, тогда можно сделать функцию, в которую можно передавать имя бекенда.

    <script>
    function doload(value, backend){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;}
    req.open(null, backend, true);
    req.send({brand:value});
    }
    </script>


    И в onchange передавать название бекенда, примерно так:

    onchange="doload(this.value, 'select.php');"
    onchange="doload(this.value, 'select2.php');"
    onchange="doload(this.value, 'select3.php');"
    adw/0
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 3:25, спустя 6 минут 4 секунды


    Однако в предыдущих листингах вашего кода - вы используете короткую запись :)

    В своём коде я пишу всегда, а вот с чужим проскальзывают такие места)))
    Вот исправленный <script>, я правильно исправил?
    <script>
    function doload(value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result").innerHTML=req.responseText;}
    req.open(null,"select2.php",true);
    req.send({brand:value});
    }

    function doload1(value, value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result1").innerHTML=req.responseText;}
    req.open(null,"select3.php",true);
    req.send({brand:value, model:value});
    }

    function doload2(value, value, value){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result2").innerHTML=req.responseText;}
    req.open(null,"select4.php",true);
    req.send({brand:value, model:value, body:value});
    }
    </script>
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 сентября 2009 г. 3:29, спустя 4 минуты

    Вот исправленный <script>, я правильно исправил?
    сделай одну функцию, как я описал выше…
    adw/0
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 3:30, спустя 55 секунд


    можно сделать функцию, в которую можно передавать имя бекенда.

    Это верно, но с увеличение select'ов в бекендах увекличивается кол-во параметров в SQL-запросах, вот этот аспект меняч смущает. получается я должен в бекенды передавать много параметров или есть другой способ?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 сентября 2009 г. 4:00, спустя 29 минут 42 секунды

    gvik, либо разбивать данные на несколько таблиц (идентификатор=>значение), либо передавать несколько параметров в SQL
    adw/0
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 4:18, спустя 18 минут 19 секунд

    adw0rd, а как правильно в функции объявить параметры и передать их, а то что-то мой синтаксис не работает?
    function doload2(value, value1, value2){
    var req=new JsHttpRequest();
    req.onreadystatechange=function(){
    if(req.readyState==4) document.getElementById("result2").innerHTML=req.responseText;}
    req.open(null,"select4.php",true);
    req.send({brand:value, model:value1, body:value2});

    onchange="doload2(this.value, this.value1, this.value2);
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 сентября 2009 г. 4:28, спустя 10 минут 2 секунды

    gvik, конечно не будет работать, ты понимаешь что такое "this.value"? Это значение которые ты выбрал в списке.
    А что такое "this.value1" и "this.value2"только одному тебе известно :)

    Тебе надо брать значения из соседних списков, либо храниться эти значения, например в форме со скрытыми полями

    <form>
       <input id="select1" type="hidden" />
       <input id="select2" type="hidden" />
    </form>


    И в doload записывать и вынимать значения оттуда

    function doload1(value){
       var req=new JsHttpRequest();
       req.onreadystatechange=function(){
           if(req.readyState==4) document.getElementById("result1").innerHTML=req.responseText;
       }
       document.getElementById("select1").value = value;
       req.open(null,"select1.php",true);
       req.send({brand:value});
    }


    А при следуещем селекте записывать и вытаскивать предыдущий

    function doload2(value){
       var req=new JsHttpRequest();
       req.onreadystatechange=function(){
           if(req.readyState==4) document.getElementById("result2").innerHTML=req.responseText;
       }
       var select1 = document.getElementById("select1").value;
       document.getElementById("select2").value = value;
       req.open(null,"select2.php",true);
       req.send({brand:select1, model: value});
    }

    adw/0
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 4:45, спустя 16 минут 29 секунд

    adw0rd, Спасибо большое работает, а что в функции нужно изменить чтобы все select'ы были сразу видны или это надо в свойстве select'а написать visibled?
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 22 сентября 2009 г. 4:51, спустя 6 минут 33 секунды


    adw0rd, Спасибо большое работает, а что в функции нужно изменить чтобы все select'ы были сразу видны или это надо в свойстве select'а написать visibled?
    сейчас у вас генерируется каждый по мере выполнения выбора в списке (onchange)
    а вам надо сразу все вывести селлекты и все. а при онченже заменять соответствующий селект
    Спустя 144 сек.
    Когда-то давно я уже делал подобную форму, тоже связанную с автомобилями и марками http://pyha.ru/forum/topic/433.0
    adw/0
  • gvik

    Сообщения: 137 Репутация: N Группа: Кто попало

    Spritz 22 сентября 2009 г. 5:02, спустя 10 минут 29 секунд

    adw0rd, Спасибо, я уже читал эту ветку, но тогда ничего не понял и закрыл, а теперь буду уже осмысленно перечитывать. Спасибо большое!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!