Проверка в <select>

Ev0luti0N

Registered
Можете ли да ми кажете какъв ще е най-бързият начин, за да получа следния резултат:
Имам един <select> в който има около 100-150 елемента(<option>) имам и променлива в която имам резултат да кажем Иван искам най-бързият начин при който да ми селектира(selected) това Иван от тези резултати в <select>.

Благодаря!
 
Не става много ясно дали стойността на option или текста на option е Иван, затова ще дам примери и за двата варианта. Използвам jQuery.

Пръви вариант - стойността на option е тест (име): в елемента с id people търсим option, чиято стойност е равна на предварително избраната, и променяме атрибута му selected на true

Код:
<script type="text/javascript">
	function selectName(selected_name){
		$("#people option[value="+selected_name+"]").attr("selected", true);
	}
</script>

<select id="people" name="people">
	<option value="">---избери---</option>
	<option value="Иван">Иван</option>
	<option value="Петкан">Петкан</option>
	<option value="Драган">Драган</option>
</select>

<input type="button" onclick="selectName('Иван');" value="Избери Иван" />


Втори вариант - стойността на option е уникален id номер: в елемента с id people търсим option, чиято стойност е равна на предварително избраната, и променяме атрибута му selected на true

Код:
<script type="text/javascript">
	
function selectName(selected_id){
		$("#people option[value="+selected_id+"]").attr("selected", true);
	}

</script>

<select id="people" name="people">
	<option value="0">---избери---</option>
	<option value="1">Иван</option>
	<option value="2">Петкан</option>
	<option value="3">Драган</option>
</select>

<input type="button" onclick="selectName(2);" value="Избери Петкан" />
 
Трети вариант: търсене по text на option елемент с raw javascript (с jquery може и да стане на 1 ред, ама реално то прави същото)

Код:
<script type="text/javascript">
function selectOptionByText(p_text)
{
	var opts = document.getElementById('s').options;
	
	for (var i = 0; i < opts.length; ++i) {
		if (opts[i].text == p_text) {
			opts[i].selected = true;
			return true;
		}
	}
	
	return false;
}
</script>
<select id="s" name="s">
	<option value="0">---избери---</option>
	<option value="1">Иван</option>
	<option value="2">Петкан</option>
	<option value="3">Драган</option>
</select>
<button onclick="selectOptionByText('Иван');">test</button>
 
lortnoc каза:
(с jquery може и да стане на 1 ред, ама реално то прави същото)

Можеш ли да покажеш варианта с един ред на jQuery? Аз не можах да го направя.
 
Код:
<script type="text/javascript">
function jSelectOptionByText(p_text)
{
	$('#s option:contains("' + p_text + '")').attr('selected', true);
}
</script>
 
Благодаря! Всъщност, така би работило за всеки един от вариантите по-горе. Аз мислех, че имаш начин с един ред в jQuery да търсиш само в textNode на options.
 
Ev0luti0N каза:
Нещо с PHP няма ли :?

Докато създаваш това select меню, проверяваш стойностите с предварително зададената:

Код:
$names = array(1=>"Иван", 2=>"Петкан", 3=>"Драган")

$selected = "Иван";

$select = "<select name='people' id='people'>";

foreach($names as $key=>$value){
    if($value == $selected){
        $selected .= "<option value='$key' selected='selected'>$value</option>";
   }else{
        $selected .= "<option value='$key' >$value</option>";
   }
}

$select .= "</select>";

Едва ли ползваш някой framework, но там обикновенно си има helpers за тези форм контроли:

Код:
$select = new Zend_Form_Element_Select('people');
$select->setMultiOptions($names)->setValue($selected);
 
Мисля, че съм го направил подобно и това забавя доста зареждането на самата страница! Ще проверя отново и ще опитам пак. :)
 
Не стана ясно, но ако все пак използваш РНР за да създадеш този select, може да го направиш на две стъпки:

Първа стъпка - генерираш селекта, без да правиш проверка за избрана стойност:

Код:
$names = array(1=>"Иван", 2=>"Петкан", 3=>"Драган")

$selected = "Иван";

$select = "<select name='people' id='people'>";

foreach($names as $key=>$value){
        $selected .= "<option value='$key' >$value</option>";
}

$select .= "</select>";

Втора стъпка - създаваш текстов низ, който представлява option елемента за избраната стойност, търсиш го в $select и заместваш със selected:

Код:
$search_for = "<option value='2'>Петкан</option>";

$selected = "<option value='2' selected='selected'>Петкан</option>";

$select = str_replace($search_for, $selected, $select);

Трудно е да се каже дали това е по-бърз вариант - в първия случай проверката се прави за всеки символ и за всяко име. Във втория случай се проверява буква по буква целия текстов низ, който съдържа кода на селект менюто.
 
Това е идея ще пробвам, защото точно през PHP си правя самият array(); и има 150 елемента и проверката е голяма и забавя ацки много. Ще го пробвам този втория вариянт и ще споделя резултатите :)
 

Back
Горе