Źródło w rozdziale: Fancy JavaScript method
Kod
HTLM:
<ul>
<li onclick="this.parentNode.removeChild(this);"> <input type="hidden" name="ingredients[]" value="Cheese" /> Cheese </li>
<li onclick="this.parentNode.removeChild(this);"> <input type="hidden" name="ingredients[]" value="Ham" /> Ham </li>
<li onclick="this.parentNode.removeChild(this);"> <input type="hidden" name="ingredients[]" value="Mushrooms" /> Mushrooms </li>
</ul>
<select onchange="selectIngredient(this);">
<option value="Cheese">Cheese</option>
<option value="Olives">Olives</option>
<option value="Pepperoni">Pepperoni</option>
...
</select>
JS:
function selectIngredient(select)
{
var option = select.options[select.selectedIndex];
var ul = select.parentNode.getElementsByTagName('ul')[0];
var choices = ul.getElementsByTagName('input');
for (var i = 0; i < choices.length; i++)
if (choices[i].value == option.value) return;
var li = document.createElement('li');
var input = document.createElement('input');
var text = document.createTextNode(option.firstChild.data);
input.type = 'hidden';
input.name = 'ingredients[]';
input.value = option.value;
li.appendChild(input);
li.appendChild(text);
li.setAttribute('onclick', 'this.parentNode.removeChild(this);');
ul.appendChild(li);
}
<ul>
<li onclick="this.parentNode.removeChild(this);"> <input type="hidden" name="ingredients[]" value="Cheese" /> Cheese </li>
<li onclick="this.parentNode.removeChild(this);"> <input type="hidden" name="ingredients[]" value="Ham" /> Ham </li>
<li onclick="this.parentNode.removeChild(this);"> <input type="hidden" name="ingredients[]" value="Mushrooms" /> Mushrooms </li>
</ul>
<select onchange="selectIngredient(this);">
<option value="Cheese">Cheese</option>
<option value="Olives">Olives</option>
<option value="Pepperoni">Pepperoni</option>
...
</select>
JS:
function selectIngredient(select)
{
var option = select.options[select.selectedIndex];
var ul = select.parentNode.getElementsByTagName('ul')[0];
var choices = ul.getElementsByTagName('input');
for (var i = 0; i < choices.length; i++)
if (choices[i].value == option.value) return;
var li = document.createElement('li');
var input = document.createElement('input');
var text = document.createTextNode(option.firstChild.data);
input.type = 'hidden';
input.name = 'ingredients[]';
input.value = option.value;
li.appendChild(input);
li.appendChild(text);
li.setAttribute('onclick', 'this.parentNode.removeChild(this);');
ul.appendChild(li);
}
Bardzo mi się to spodobało i pasuje idealnie do projektu który tworzę. Jest mały szkopuł. Potrzebuję dodatkowe opcje w select. Opcję 'wszystko' oraz 'nic'. Problem polega na tym, że wybranie którejś z tych opcji musi kasować wszystkie wybrane do tej pory. I odwrotnie. Jeśli jest już wybrana opcja 'wszystko' (bądź 'nic') a ktoś wybierze opcje np. 'Ham' to oczywiście wybrana poprzednio opcja np. 'wszystko' ulega skasowaniu.
Moja wiedza nt. js jest niewystarczająca by to zrobić. Może ktoś mądrzejszy znajdzie chwilkę by dopisać taki kod sprawdzający/kasujący? <prosi>