Tomasz Dzioba

Tomasz Dzioba wszystkiego po
trochu

Temat: Zamienianie kolejności na liście wyboru.

Hej wszystkim czytającym !

Powstał problem po tym jak postanowiłem stworzyć coś do sortowania kolejności pozycji w menu.
Problem wygląda tak. Dostaję poprzez php wygenerową listę

<select onkeyup="dev()" id="kategorie" size="15">
<option>Strona Główna</option>
<option>-Separator-</option>
<option>O Mnie</option>
</select>

Teraz chciałbym aby, zaznaczony element powędrował o 1 pozycję w górę. Jak na mój gust nic trudnego. Muszę pobrać sobie do zmiennej element zaznaczony oraz ich indeksy i zamienic.

function przenies(kierunek)
{
var wybrany=$('kategorie').options.selectedIndex;
var zaznaczony=$('kategorie').options[wybrany];
var doZastapienia='';
if (wybrany>0)
{
if (kierunek=='gora')
{
doZastapienia=$('kategorie').options[wybrany-1];
$('kategorie').options[wybrany-1]=zaznaczony;
$('kategorie').options[wybrany]=doZastapienia;
}
else
{
doZastapienia=$('kategorie').options[wybrany+1];
$('kategorie').options[wybrany+1]=zaznaczony;
$('kategorie').options[wybrany]=doZastapienia;
}
}
}

No i to wszystko działa, dopóki nie klikne jeszcze raz w przycisk wywolujacy ta funkcje, lub odrazu w przypadku IE. Jakies pomysły ?Tomasz Dzioba edytował(a) ten post dnia 19.08.09 o godzinie 13:46

konto usunięte

Temat: Zamienianie kolejności na liście wyboru.

Moja propozycja:

function przenies(kierunek)
{
var wybrany=$('kategorie').options.selectedIndex;
var newOption;
if (wybrany>0)
{
if (kierunek=='gora')
{
newOption=$('kategorie').insertBefore(document.createElement('option'),$('kategorie').options[wybrany+1]);
newOption.text=$('kategorie').options[wybrany-1].text;
$('kategorie').removeChild($('kategorie').options[wybrany-1]);
}
else
{
if($('kategorie').options[wybrany+1]){
newOption=$('kategorie').insertBefore(document.createElement('option'),$('kategorie').options[wybrany]);
newOption.text=$('kategorie').options[wybrany+2].text;
$('kategorie').removeChild($('kategorie').options[wybrany+2]);
}
}
}
}


P.S. nie wiem tylko po co jest
if (wybrany>0)

bo powoduje to to, że jak się jakiś option wywinduje na samą górę, to nie da się go już znieść wtedy niżej.

Przetestować można pod adresem: http://KrzysztofKozlowski.eu/hosting/goldenline_js.htmlKrzysztof Kozłowski edytował(a) ten post dnia 19.08.09 o godzinie 15:07
Tomasz Dzioba

Tomasz Dzioba wszystkiego po
trochu

Temat: Zamienianie kolejności na liście wyboru.

Więc tak

if (wybrany>0)

miał być w celu uniknięcia błędów z tematu wykroczenia po za granice indeksu czy jak on to ładnie określa, może się mylę.

Tak naprawdę potrzebowałem zamiany wartości (na co wcześniej nie wpadłem i dlatego próbowałem całe obiekty (?) przenosić.
Zakończyłem to tak:

function przenies(kierunek)
{
var wybrany=$('kategorie').options.selectedIndex;
var doZastapienia='';
var tekst='';
if (kierunek=='gora')
{
if (wybrany>0)
{
doZastapienia=$('kategorie').options[wybrany].previousElementSibling;
tekst=$('kategorie').options[wybrany].previousElementSibling.text; $('kategorie').options[wybrany].previousElementSibling.text=$('kategorie').options[wybrany].text;
$('kategorie').options[wybrany].text=tekst;
$('kategorie').options.selectedIndex=$('kategorie').options.selectedIndex-1;
}
}
else
{
if (wybrany<$('kategorie').length)
{
doZastapienia=$('kategorie').options[wybrany].nextElementSibling;
tekst=$('kategorie').options[wybrany].nextElementSibling.text; $('kategorie').options[wybrany].nextElementSibling.text=$('kategorie').options[wybrany].text;
$('kategorie').options[wybrany].text=tekst;
$('kategorie').options.selectedIndex=$('kategorie').options.selectedIndex+1;
}
}
}


PS:
czemu :

case 'usun': $('kategorie').removeChild($('kategorie').selectedIndex); break;

daje błąd

Błąd: uncaught exception: [Exception... "Could not convert JavaScript argument arg 0" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://127.0.0.1/strony/admin/# :: dodaj :: line 141" data: no]


Odpowiedz jest prosta ;x nie wczytałem się w Twój kod Krzysztofie, poprawnie jest

$('kategorie').removeChild($('kategorie').options[$('kategorie').selectedIndex]);
Tomasz Dzioba edytował(a) ten post dnia 19.08.09 o godzinie 22:23

konto usunięte

Temat: Zamienianie kolejności na liście wyboru.

Tomasz Dzioba:
Tak naprawdę potrzebowałem zamiany wartości (na co wcześniej nie wpadłem i dlatego próbowałem całe obiekty (?) przenosić.

też myślałem początkowo o przepisywaniu tylko wartości ale uniwersalniejsze wydaje mi się działanie na obiektach i metodami DOM.
Tomasz Dzioba

Tomasz Dzioba wszystkiego po
trochu

Temat: Zamienianie kolejności na liście wyboru.

Faktycznie masz rację, operacje na obiektach DOM dają większe pole do popisu oraz elastyczność. Szczególnie, że teraz dodałem do swoich optionów value oraz id i w tym momencie kod mi się wydłużył, a dzięki Twojemu kodzikowi nieważne co chcę i tak się przeniesie wszystko.
Dzięki za te linijki ;)

Następna dyskusja:

zamienianie znaku "=" na "/"




Wyślij zaproszenie do