LINUX.ORG.RU

[неосилятор][js][нет кода html]


0

2

есть код, динамически меняющий список на странице

<script type="text/javascript">
function selectcat()
{
    var x=document.getElementById("sec").options[sec.selectedIndex].value;
   
    var t = new Array();
    hsub=document.getElementById("hstoresubsec").innerHTML.split('-');
    hsec=document.getElementById("hstoresec").innerHTML.split('-');
    var n = hsub.length;
    var i=0;
    var j=0;
    document.getElementById("subid").options.length=0;//clean the list
    while(i<=n-2)//for every subsection
    {
       
        if(x==hsec[i])
        {
          document.getElementById("subid").options[j]=new Option(hsub[i],i,false,false);
          j++;
        }
       i++;
    }
   
}
</script>
Так вывожу первый список(sections)
<?php

     echo "  <select id=\"sec\" name=\"Section\" onchange=\"selectcat()\">";
     
     while( $sections=mysql_fetch_array($sec_array)){
    //echo $sections[1];
    //echo "\n";
    //echo $row[2];
     echo "<option value=$sections[0]>$sections[0]</option>\n"; 
     }
     
     echo "</select>\n</br>";
     
?>

с ним все ок.

Вот так второй(subsections), он зависит от выбранного в первом пункте

<?php
echo '<select id="subid" name="Subsection">';

$i=0;
while( $subsections=mysql_fetch_array($subsec_array2))
  {
     echo "<option value=\"$subsections[0]\">$subsections[0]</option>";
     $i++;
  }

echo '</select>';
?>
Если менять значение в первом списке то в html коде я вообще не вижу пунктов из второго списка. Я понимаю, что js через DOM все меняет.Но мне нужно передать значение из второго списка через POST.Как?

а чем jquery не устраивает? $.post({});

anonymous ()

А чем смотришь HTML код? Firebug? Он должен отображать актуальное дерево DOM. А то, что есть в DOM, и пойдёт на сервер при отправке формы.

И да, jQuery для этих целей весьма удобна.

roy ★★★★★ ()
Ответ на: комментарий от roy

jQuery - cool, но я еще маленький, пока хочу на чистом js. HTML код смотрю через ctrl+U(да-да). Как выяснилось, подпункты никуда не пропадают,но , как я уже сказал, если изменить section(на него у меня завязана js ф-ия) то усе, в POST значения subsection не получить. Стоит дальше рыть DOM или я глуп и нужно действительно взять готовые интерфейсы jQuery?

blokant ★★ ()
Ответ на: комментарий от blokant
<span class="deviceRoomFilter"></span>
<select name="room" id="room">
	<option value="7" room="7" floor="1">161а</option>
	<option value="8" room="8" floor="1">450</option>
	<option value="9" room="9" floor="1">sdfsdf</option>
	<option value="6" room="6" floor="3">333</option>
	<option value="5" room="5" floor="4">405a</option>
	<option value="1" room="1" floor="6">614a</option>
	<option value="2" room="2" floor="10">1012</option>
</select><br>
jQuery( function() {
	jQuery('span.deviceRoomFilter').dynatree({
		title: "Фильтр кабинетов",
		clickFolderMode: 2,
		onActivate: function(node) {
			deviceFilterActivationRoom(node);
		},
	});
});
function deviceFilterActivationRoom(node) {
	jQuery('select#room option').each( function() {
		if (node.data.obj_type == 'all') {
			jQuery(this).show();
		} else {
			if (jQuery(this).attr(node.data.obj_type) != node.data[node.data.obj_type + '_id']) {
				jQuery(this).hide();
			} else {
				jQuery(this).show();
			}
		}
	});
	jQuery('select#room option').each( function() {
		if ( ! jQuery(this).is(':visible') && jQuery(this).is(':selected')) {
			jQuery(this).removeAttr('selected');
			jQuery('select#room option:visible').first().attr('selected', 'selected');
		}
	});
}

W3C-наци, может, и вышлет за мной группу спецназа за использование левых атрибутов в тегах, но работает в ишаке, лисе и хроме, а, значит, спецназ будет жестоко наказан.

GateKeeper ★★ ()
<html>
<head>
<title>web-dev</title>
<script type="text/javascript">
function selectcat()
{
  var sec = document.getElementById("sec");
  var x = sec.options[sec.selectedIndex].value;

  var t = new Array(); // why do you need this?
  var hsub = document.getElementById("hstoresubsec").innerHTML.split('-');
  var hsec = document.getElementById("hstoresec").innerHTML.split('-');

  var subid = document.getElementById('subid');
  subid.options.length = 0; // clean the list

  var n = hsub.length;
  for(var i = 0; i < n; i++) { // why it was n-2? 
    if(x == hsec[i]) {
      subid.options.add(new Option(hsub[i], i, false, false));
    }
  }
}
</script>
</head>
<body>
<div id="hstoresubsec">subsection 1-subsection 2-subsection 3</div>
<div id="hstoresec">section 1-section 1-section 2</div>
<!-- php code goes here -->
</body>
</html>
<?php
echo "  <select id=\"sec\" name=\"Section\" onchange=\"selectcat()\">";
$section_list = array(
    array("section 1"),
    array("section 2")
);
foreach($section_list as $key => $sections) {
  // notice that quotes were added around $sections[0]
  echo "<option value=\"$sections[0]\">$sections[0]</option>\n";
}
echo "</select>\n</br>";


echo '<select id="subid" name="Subsection">';
$subsection_list = array(
    array("subsection 1"),
    array("subsection 2")
);
foreach($subsection_list as $key => $subsections) {
  echo "<option value=\"$subsections[0]\">$subsections[0]</option>";
} 
echo '</select>';
?>
rival ★★ ()
Ответ на: комментарий от GateKeeper

а еще code_formating-наци укоризненно посмотрит на твои \t и пробел между “!” и “jQuery(this).is(':visible')”

anonymous ()
Ответ на: комментарий от anonymous

code_formating-наци тоже может отдохнуть, либо выслать настройки эклипса для вменяемой работы javascript-плагина с не-\t табуляциями (чтобы Shift-Tab, например, работал по выделенному блоку и прочие ништяки, как в PyDev), а выделение спейсом отрицания в bool-expressions лично мне визуально сильно помогает.

GateKeeper ★★ ()
Ответ на: комментарий от anonymous

А поскольку мало кто прогоняет результат работы шаблонизатора через упаковщик (как у гугля, например), то SEO-наци сейчас как раз высылают пативены за теми, у кого вместо одного \t используется куча 0x20

GateKeeper ★★ ()

попробовал, вы лишь оптимизировали(понимаю,многое не показал). Если работает js то на странице , обрабатывающей POST массив получаем вместо названий, хранящихся в subsections их порядковые номера...Идеи?P.S да, посмотрю в сторону jQuery

blokant ★★ ()

попробовал, вы лишь оптимизировали(понимаю,многое не показал). Если работает js то на странице , обрабатывающей POST массив получаем вместо названий, хранящихся в subsections их порядковые номера...Идеи?P.S да, посмотрю в сторону jQuery

blokant ★★ ()
Ответ на: комментарий от blokant

> Если работает js то на странице , обрабатывающей POST массив получаем вместо названий, хранящихся в subsections их порядковые номера

их порядковые номера


Разумеется будут номера, ведь конструктор получает номер в качестве value:

new Option(hsub, i /* value */, false, false)

rival ★★ ()
Ответ на: комментарий от blokant

> как передать значение?

hsub[i]? Я не знаю какое значение тебе нужно.

rival ★★ ()
Ответ на: комментарий от blokant

можно извратиться и 1.При изменении второго списка(subsections) вызывать js 2.Который запишет значение в hidden элемент 3.передать его

Есть более трувей?

blokant ★★ ()

>.getElementById(«sec»)

getElementById(«hstoresubsec»).innerHTML

Надеюсь, это не преждевременная оптимизация и такой уровень программирования в эпоху jQuery реально обоснован? :)

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

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

blokant ★★ ()
Ответ на: комментарий от blokant

> можно подробнее насчет hsub?мне нужное значение (selectedindex) записать куда-то?

Я не понимаю, что у тебя не получается именно, так что не знаю как и что подробнее тебе описывать.

Что именно тебе не ясно с hsub?

new Option(hsub[i], i /* value */, false, false)

Ты ведь понимаешь, что делает вот эта строчка? Она создает <option/> в select'e.

Ты жаловался, что у тебя в POST'е передаются номера, вместо названий. Это происходит потому, что Option объект, который ты создаешь, принимает следующие аргументы:
Option(text, value, defaultSelected, selected)
То есть js код:

new Option(hsub[i], i, false, false)

создает тебе следующий элемент в select'е:

<option value=«i»>hsub[i]</option>

С заменой переменных на их значения, конечно же.
В POST, как ты наверное знаешь, отправляется value атрибут элемента, а не text, из-за чего ты получаешь i, вместо hsub[i]. Если же ты этого не знал, то определенно следует почитать что-нибудь на эту тему.
Вполне очевидно, что тебе нужно заменить второй аргумент, который сейчас i, на что-то другое, скорее всего на hsub[i].

rival ★★ ()
Ответ на: комментарий от blokant

> можно извратиться и 1.При изменении второго списка(subsections) вызывать js 2.Который запишет значение в hidden элемент 3.передать его

Это костыли. select'а вполне достаточно.

Единственное применение таким костылям я вижу только, если ты хочешь реализовать свой select-like элемент, используя простые элементы вроде текста, ссылок и картинок.

rival ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.