Работа функции JS для передачи данных из XMLHttp, навигация на основе select

wish

Новичок
Работа функции JS для передачи данных из XMLHttp, навигация на основе select

Дано:

Форма, которая предназначена для навигации в каталоге предприятий.
Форма содержит 4 элемента select: regId, cityId, catId, subCatId (регион, город, категория, подкатегория)

Каждый элемент вызывает работу функции по событию onClick:
goReg(), goCity(), goCat(), goSubCat();

Функция формирует переменную URL с GET параметрами, передает значение в php файл, получает ответ и выводит результат в дочерний элемент select (первый элемент select regId - сформирован сразу, остальные select - пустые значения)

Я хочу обрабатывать все запросы в одном php файле и одной JS функцией, которая в зависимости от вызывающей функции формирует на странице select и другие элементы (div, span и т.д.).

Первая этап проходит отлично, первый select (regId) формирует второй (cityId). Но второй select (cityId) не вызывает никакого действия, я думаю, что это из-за путаницы с переменной fName в файле ajax.js (глобальная, локальная)

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

Меня особенно интересуют Ваши комментарии по поводу JavaScript кода.
Большое спасибо за советы!

ajax_test.html
PHP:
<head>
    <script language="JavaScript" src="ajax.js"></script>
    </head>
<body>
<br>
    <form name="form1" style="margin: 0px;">
        <!-- навигация по каталогу : начало -->
        <table cellspacing="0" cellpadding="0" id="settings" bgcolor="#fafafa" border="0">
            <tr>
                <td id="moduleTop">Навигация по каталогу</td>
                <td colspan="2" style="border-bottom: 1px Solid Black;background: White;">&nbsp;</td>
            </tr>
            <tr>
                <td id="moduleBaseL">Регион:</td>
                <td id="moduleBaseR" colspan="2">
                <select name="regId" size="1" onChange="goReg();">
                <OPTION value="">Выберите регион</OPTION>
                
<?php
                //Делаем выборку активных городов
                $GetFromDb = mysql_query("SELECT * FROM cities WHERE active='yes' ORDER BY parentReg") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                global $regArray;
                while($citiesActiv = mysql_fetch_array($GetFromDb))
                    {
                    //Создаем массив, содержащий id регионов с активными городами
                    $regArray[] = $citiesActiv['parentReg'];
                    }
                if (!empty($regArray))
                    {
                    global $regArray;
                    $regArray = array_unique($regArray);
                    $count = count($regArray);
                    foreach ($regArray as $regIdArr)
                        {
                        global $regId;
                        $regId = @$_GET['regId'];
                        //Делаем выборку регионов, сортируем по regId
                        $GetFromDb2 = mysql_query("SELECT * FROM regions WHERE regId=$regIdArr ORDER BY regId") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                        while ($regArray1 = mysql_fetch_array($GetFromDb2))
                            {
                            echo "<option value=\"".$regArray1['regId']."\"";
                            if ($regArray1['regId'] == @$regId)
                            echo "selected";
                            echo ">".$regArray1['regName']."</option>";
                            }
                        }
                    }
?>                
                </select>
                </td>
            </tr>
            <tr>
                <td id="moduleBaseL">Город:</td>
                <td id="moduleBaseR" colspan="2">    
                <select name="cityId" size="1" id="respCity" onChange="goCity();">
                <OPTION value="">Выберите город</OPTION>
                <!-- Выводим список городов в зависимости от региона-->
                <?=@$cityListOption?>
                </select>
                </td>            
            </tr>
            
            <tr>
                <td id="moduleBaseL">Категория:</td>
                <td id="moduleBaseR" colspan="2">
                <select name="catId" size="1" id="respCat" onChange="goCat();">
                <OPTION value="">Выберите категорию</OPTION>
                <?=@$catListOption?>
                </select>
                </td>
            </tr>
            <tr>
                <td id="moduleBaseL">Подкатегория:</td>
                <td id="moduleBaseR" colspan="2">    
                <select name="subCatId" size="1" onChange="goSubCat();">
                <OPTION value="">Выберите подкатегорию</OPTION>
                </select></td>
            </tr>
            <tr>
                <td id="moduleBottom" colspan="3">&nbsp;</td>
            </tr>
        </table>
        <!-- навигация по каталогу : конец -->    
</form>
</body>
</html
ajax.js
PHP:
function my_ajax(URL, FNAME)
    {
    fName = FNAME;
    if (window.XMLHttpRequest)
       {
        req = new XMLHttpRequest();
        req.onreadystatechange = verify;
        req.open("GET", URL, true);
        req.send();
       }
     else if (window.ActiveXObject)
       {
        req = new ActiveXObject("Msxml2.XMLHTTP"); 
        if (req) 
            {
         req.onreadystatechange = verify;  
         req.open("GET", URL, true);
         req.send(null);
         }
      }
    }
function verify()
    {
    if (req.readyState == 4)
        { 
        if (req.status == 200)
            {    
            var resp = req.responseText;
            if (fName == 'goReg')
                {
                document.getElementById('respCity').outerHTML = '<select size="1" name="respCity">' + resp + '</select>';
                }
            if (fName == 'goCity')
                {
                document.getElementById('respCat').outerHTML = '<select size="1" name="respCat">' + resp + '</select>';
                }
            }
            else 
            alert("ERROR " +req.statusText +' '+req.status+url);
        }
    }
function goReg()
    {
    url="some.php?regId="+document.forms['form1'].regId.value;
    var fName = "goReg";
    my_ajax(url, fName);
    }
    
    function goCity()
    {
    alert('goCity');
    url="some.php?regId="+document.forms['form1'].regId.value+"&cityId="+document.forms['form1'].cityId.value;
    var fName = "goCity";
    my_ajax(url, fName);
    }
function goCat()
    {
    url="some.php?regId="+document.forms['form1'].regId.value+"&cityId="+document.forms['form1'].cityId.value+"&catId="+document.forms['form1'].catId.value;
    my_ajax(url);
    }
function goSubCat()
    {
    url="some.php?regId="+document.forms['form1'].regId.value+"&cityId="+document.forms['form1'].cityId.value+"&catId="+document.forms['form1'].catId.value+"&subCatId="+document.forms['form1'].subCatId.value;
    my_ajax(url);
    }

some.php
PHP:
<?php
//Подключаемся к базе данных
include_once("../include/config.inc");
header("Content-type: text/plain; charset=windows-1251");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
$regId=@$_GET["regId"];
$cityId=@$_GET["cityId"];
$catId=@$_GET["catId"];
$subCatId=@$_GET["subCatId"];
if (isset($regId) and !empty($regId))
    {
    echo "<option value=\"\">&nbsp;</option>";
                if (!isset($regId) or !is_numeric($regId) or $regId < 0 or $regId == 1)
                    {
                    $GetFromDb = mysql_query("SELECT * FROM cities WHERE active='yes' ORDER BY cityId") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                    }
                else
                    {
                    $GetFromDb = mysql_query("SELECT * FROM cities WHERE parentReg=$regId AND active='yes' ORDER BY cityId") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                    }
                //Делаем выборку городов, сортируем по regId
                while ($cityArray = mysql_fetch_array($GetFromDb))
                    {
                echo "<option value=\"{$cityArray['cityId']}\"";
                if ($cityArray['cityId'] == @$cityId)
                echo "selected";
                echo ">".$cityArray['cityName']."</option>";
                    }
    }
if (isset($cityId) and !empty($cityId))
    {
                global $catId;
                //Делаем выборку категорий, сортируем по catId
                $GetFromDb = mysql_query("SELECT * FROM catCategories WHERE parentCatId=0 AND active='yes' ORDER BY catName") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                while ($catArray1 = mysql_fetch_array($GetFromDb))
                    {
                echo "<option value=\"{$catArray1['catId']}\"";
                if ($catArray1['catId'] == @$catId)
                echo "selected";
                echo ">".$catArray1['catName']."</option>";
                    }
    }                
    
if (isset($subCatId) and !empty($subCatId))
    {
echo "***";
                if (!isset($catId) or !is_numeric($catId) or $catId < 0)
                    {
                    $GetFromDb = mysql_query("SELECT * FROM catCategories WHERE parentCatId!=0 ORDER BY catName") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                    }
                else
                    {
                    $GetFromDb = mysql_query("SELECT * FROM catCategories WHERE parentCatId=$catId ORDER BY catName") or die("Не удалось подключиться к базе данных<br>".mysql_error()."");
                    }
                //Делаем выборку подкатегорий, сортируем по catId
                while ($catArray = mysql_fetch_array($GetFromDb))
                    {
                echo "<option value=\"{$catArray['catId']}\"";
                if ($catArray['catId'] == @$subCatId)
                echo "selected";
                echo ">".$catArray['catName']."</option>";
                    }
    }
?>
 

flash-vkv

Новичок
тоже не узрел, а ошибка банальна "рассинхрон" , где тока я ее не встречаю на днях у webalta.ru даже встретил :)
wish - поиск рулит
 

BRat

o_0
по сути не столько поиск..
wish
советую прочитать вот такую книгу - http://www.amazon.com/dp/0764579088?tag=sergiopereira-20&creative=374929&camp=211189&link_code=as2&creativeASIN=0764579088
Одна из лучших по JS
 

flash-vkv

Новичок
нада же так запутаться в собственном коде вам что-нибуть говорят строки my_ajax(url, fName); и my_ajax(url); , потом <select name="cityId" size="1" id="respCity" onChange="goCity();"> и document.getElementById('respCity').outerHTML = '<select size="1" name="respCity">' .
 

wish

Новичок
BRat
За ссылку спасибо ;))

Вопрос:
Но второй select (cityId) не вызывает никакого действия, я думаю, что это из-за путаницы с переменной fName в файле ajax.js (глобальная, локальная

Где ошибка во втором select?

flash-vkv
Спасибо за указание ошибок.

Товарищи, благодарю за участие - учусь, стараюсь - спасибо.

-~{}~ 16.02.07 14:38:

Ошибку я нашел:

При событии onSelect первого элемента, второй формировался без вызова функции goCity().
 
Сверху