Dynamiczny formularz oparty o elementy <select> + JS

0

Witam,

Mam kłopocik odnośnie tego, co w temacie. Otóż mam sobie formularz, który jest statyczny oparty na elementach SELECT, natomiast zmieniać się mają elementy <OPTION> w tym "selekcie". Mam 6 selektów, z czego tylko pierwszy jest dostępny, pozostałe mają flagę disabled. Jaki chciałbym efekt?

  1. Wybieram z pierwszego selektu (wygenerowanego przez kod PHP) markę samochodu. Wszystko pobierane jest z bazy danych.
  2. Funkcja w OnChange odblokowuje drugi element (to działa).
  3. Odblokowany drugi selekt ma mieć elementy zależne od pierwszego wybranego (jeśli np. wybiorę Volkswagen, to elementy drugiego selektu mają być pobierane z bazy danych poprzez skrypt PHP "./operations/edit_car/operations.php w którym jest funkcja to robiąca). Chcę to zrobić na zasadzie Javascript (JQuery albo cokolwiek innego) by elementy zostały dynamicznie wstawione, a przy zmianie elementu pierwszego selekta np. na Seat, zostały usuniete wszystkie elementy w drugim i pobrane zostałyby nowe modele. Tutaj zaczynam się zawieszać , bo nie wiem jak podejść do tego kłopotu. mam taki kod:

plik operations.php:

<?php
//ŁADOWANIE MODELI NA PODSTAWIE PODANEJ MARKI
if (isset($_REQUEST['mark']))
{
    include('../open_database.php');
    $query="SELECT model FROM cars WHERE mark='".$_REQUEST['mark']."'";
    $result=mysql_query($query);
    mysql_close($conn);    
    $poprzedni='none';
    if($result==false)
        exit;
    while($res=  mysql_fetch_row($result))
    {
        if ($res['model']!=$poprzedni)
        {
                $poprzedni=$res['model'];
                echo '<option value="'.$res['model'].">".$res['model']."</option>";               
        }           
    }
}
    
?> 

a teraz plik JS:

function add_option(id,zm,skad)
{
    var selected = document.getElementById(skad).value;
    var str = window.location.pathname;
    var directory = str.replace(/index.php/i,"");
    var zmienna= zm;
    var rootdomain_withouts="http://"+window.location.hostname+directory;
    alert(rootdomain_withouts);
    $('document.getElementById('+id+')').load(rootdomain_withouts+"operations/edit_car/actions.php", { zmienna : selected} );
    
} 

Czy pomożecie rozwiązać problem?

0
  1. "Select Distinct" - poczytaj co robi
  2. napisz jeszcze co jest źle w ogóle
  3. zainwestuj (tzn ściągnij za darmo) w firebuga, bądź jakiekolwiek inne narzędzie tego typu (google Ci pomoże) - sprawdzisz sobie np czy ścieżka, z której ładujesz dane jest poprawna.
  4. dopiero teraz zauważyłem ostatnią linijkę w js. WTF? $('document.getElementById('+id+')') zastąp $('#'+id)
0
  1. Ok poczytam (piszę pracę inżynierską jednocześnie się ucząc programowania w tych językach)
  2. Źle jest to, że nie wysyła nic do pliku php o ile w ogóle go widzi... nie wiem jakiej metody tu użyć. Mało poradników na necie i są niezrozumiałe.
  3. Ścieżki są ok , bo wyświetliłem sobie alert'em, więc funkcja w ogóle wchodzi ze wszystkimi parametrami.
  4. Poprawiłem zgodnie z zaleceniem, jednak to nie rozwiązało mojego problemu.

PRZEPRASZAM ZA MOJĄ NIEWIEDZĘ I WSZELKIE DZIWACTWA KTÓRE TU WIDAĆ :)
WYJAŚNIAM.
Mam 2 selecty:

MARKA SAMOCHODU | | MODEL SAMOCHODU | <-- ten nieaktywny na dzień dobry :)

Przy wybraniu z listy jakiejś marki, pierwsza pozycja z tego menu (o treści wybierz samochód) zostaje usunięta zdarzeniem OnChange i funkcją napisaną w JS, więc jest si. Kolejna funkcja w tym samym zdarzeniu OnChange aktywuje kontrolkę obok (selecta) no i jest trzecia funkcja (wlasnie ta gdzie znalazles krzaki w ostatniej linijce)... od tej funkcji oczekuję, że gdy przekażę parametry: id_aktywnej kontrolki z której wybieram obecnie, nazwa zmiennej (w pliku php będę ją uzależniał np. jeśli marka jest przekazywana to będzie wybierany model, jeśli model, to rocznik trzeba będzie pobrać z bazy danych itp) oraz nazwa docelowej kontrolki w której mają zostać wpisane dane, to ta funkcja odpowiednio manipulując swoimi argumentami (manipulację pomijam bo do tego już doszedłem i zrobiłem poprawnie) wyśle zmienną mark='nazwa_marki' do pliku operations.php w którym to dojdzie do pobrania danych z bazy danych i jednocześnie wklejenia kodu <option value="wartość">wartość</option>. A więc w JS muszę użyć chyba funkcji innerHtml aby wkleić ten kod właśnei do elementu docelowego i żeby wewnątrz tego innerHtml było odwołanie do pliku php który przecież generuje kod HTML.

Nie wiem czy dosyć jasno to opisałem, to zagmatwane :) wybacz.

PS. Select Distinct sie do czegoś przyda? :) już zrobiłem funkcję która eliminuje powtórzenia, chyba że ona obciąża serwer. Z tym, że to, co robię to panel Admina, więc jak już tylko jedna osoba (właściciel autokomisu) ma wgląd do edycji samochodu dostępnego na jego terenie... proszę zatem o poradę :)

0

Select distinct jak najbardziej! Od tego masz bazę danych, żeby dane filtrować na poziomie bazy danych. Przecież równie dobrze można by wybrać wszystkie kolumny i wszystkie wiersze i następnie przefiltrować to w php - ale to bez sensu.

druga rzecz:
robisz coś takiego { zmienna: selected } -- wbrew pozorom - "kluczem" nie będzie tu wartość zmiennej zmienna, a po prostu tekst zmienna.

Czyli:

var dupa = "test";
var dane = { dupa: 3 };
for (key in dane) { alert (key); }

wyświetli dupa, a nie test!

Trzeba zrobić coś takiego np:

var dupa = "test";
var dane = {};
dane[dupa] = 3;
for (key in dane) { alert (key); } // tutaj pojawi się "dupa"

Podejrzewam, że dlatego nie dostajesz oczekiwanej zmiennej w php. zrób to tak:

// w ogóle to tworzysz od cholery zmiennych, żeby wykonać na nich jedną operację - bez sensu.
// np jaki sens było robić var zmienna = zm; [?]

function add_option(id,zm,skad) {
    var selected = document.getElementById(skad).value;
    // skoro używasz jQuery to możesz tą linię zastąpić:
    // var selected = $('#'+skad).val();
    var path = "http://" + window.location.hostname + window.location.pathname.replace(/index.php/i,"");
    var path_2 = "operations/edit_car/actions.php";
    var dane = {};
    var dane[zm] = selected;
    $('#'+id).load(path + path_2, dane);
} 

Wydaje mi się, że to powinno wystarczyć.
Zainstaluj Firebuga/cokolwiek jak mówiłem i sobie otwórz zakładkę "Sieć", albo jak to się w Firebugu nazywa - będziesz widział wszystkie zapytania do serwera (i prawdopodobnie odpowiedź serwera na zapytanie - ja używam odpowiednika Firebuga dla Opery i nie wiem)

0

to tworzenie wielu zmiennych (tzn kopii zm ) stworzyłem bo nie wiedziałem dlaczego podkreślało mi zm, a po najechaniu na to, pojawila sie informacja "variable is never used" wiec stwierdzilem, ze podstawienie zmiennej pod nową da jakis efekt. Wiem, to byl moj blad tylko dlatego, ze ucze sie dopiero Jav'y.
Każdy ma prawo na głupotę podczas nauki :) Teraz wiem, że ta zmienna w ogóle nie jest przekazywana tylko nazwa zmiennej będzie taka a nie inna :)

A co do PHP to po prostu nie wiedziałem o istnieniu zapytania SELECT DISTINCT. Teraz skoro wiem, to zastosuję to.
Już się zabieram za poprawę skryptu :) dam znać o wynikach za jakąś chwilkę w edycji postu :) pozdrawiam

0

Niestety nie ma pożądanego efektu. Dalej dzieje się to samo. Pokażę formularz generowany funkcją .load() w div'ie:

<h3>Edytuj dane istniejącego samochodu</h3>
<form action="./operations/edit_car.php" method="POST">
    <table style="width: 100%; text-align: right; margin-bottom: 15px;">
        <tr>
           <td style="width: 50%">
                <label>Dostępne marki:</label>
                <select name="mark" class="pole_wyboru" id="mark_list" OnChange="zmien_stan('model_list',false); usun_opcje('mark_list','none'); add_option('model_list','mark','mark_list');">
                    <option value="none">wybierz markę</option>
                        
```php
<?php
                            //DO FUNKCJI JQuery load() NALEŻY PODAĆ W FUNKCJI INCLUDE BEZWZGLĘDĄ ŚCIEŻKĘ DOSTĘPU DO PLIKU PHP
                            $katalog=str_replace('/pages/subpages/edit_car.php', '', $_SERVER['SCRIPT_FILENAME']);
                            include($katalog.'/operations/open_database.php');
                            $query='SELECT DISTINCT mark FROM cars ORDER BY mark ASC';
                            $result=mysql_query($query);
                            mysql_close($conn);                          
                            while ($res=mysql_fetch_assoc($result))
                            {
                                echo '<option value="'.$res['mark'].'">'.$res['mark'].'</option>';
                            }      
                        ?>
                </select>
            <td style="width: 50%">
                <label>Dostępne modele:</label>
                    <select name="model" class="pole_wyboru" id="model_list" disabled="disabled" OnChange="usun_opcje('model_list','none');zmien_stan('year_list',false);">
                        <option value="none">wybierz model</option>
                    </select>
    </table>
    <br/>
    <br/>
    <br/>
    <br/>   
   <button class="btn_login" id="ok" type="submit" style="border: 1px black solid; color:black;" onclick="close_window('box'); return true"><img src="./img/icon-change.png" alt="+"/> &nbsp; Wybierz</button> &nbsp;
   <button class="btn_logout" id="cancel" type="button" style="border: 1px black solid; color: #9f0000;" onclick="close_window('box'); return false"><img src="./img/icon-back.png" alt="-"/> &nbsp; anuluj</button>
</form>; 

Zaś nowy skrypt JS wygląda tak (ze wszystkimi funkcjami):

function add_option(id,zm,skad) 
{
    var selected = $('#'+skad).val();
    var path = "http://" + window.location.hostname + window.location.pathname.replace(/index.php/i,"");
    var path_2 = "operations/edit_car/actions.php";
    var dane = {};
    dane[zm] = selected;
    $('#'+id).load(path + path_2, dane);
} 

function zmien_stan(idobiektu,blokada)
{
    document.getElementById(idobiektu).disabled=blokada;
}

function usun_opcje(idobiektu,opcja)
{
    $("#"+idobiektu+" option[value='"+opcja+"']").remove();
} 

Plik PHP uległ lekkiej zmianie (dodałem SELECT DISTINCT :) zgodnie z zaleceniem). Teraz pytanie odnośnie funkcji .load(). Jeśli przesyłamy szereg parametrów do skryptu php to jak potem je w skrypcie php odczytać? Będzie to w tablicy superglobalnej $_REQUEST['nazwazmiennej'] , czy może w tablicy $_POST['NAZWAZMIENNEJ'] a może w $_GET['...']?? Robię to po raz pierwszy dlatego jestem taki zielonobrunatny :) Dziękuję z góry za pomoc mistrzu :D

0

czekaj, ty chcesz podmienić tylko zawartość jednego selecta, tak? to dlaczego php zwraca aż tyle tego wszystkiego? Twój php powinien zwracać w takim przypadku tylko parę "optionów" (już nie mówiąc o użyciu json i wysłaniu tylko par wartość/opis - ale to nie będziemy mieszać)

zainteresuj się funkcją $.ajax - łatwiej moim zdaniem prześledzić co się dzieje, niż w przypadku $.load

zmienne będą oczywiście w $_GET w przypadku load (ale zajrzyj do dokumentacji, ja nigdy load nie używałem z ww. powodu - metoda ajax jest bardziej rozbudowana).

o $_REQUEST zapomnij, że istnieje i nigdy nie używaj - może być z tego w skrajnych przypadkach więcej złego niż dobrego.

0

teraz mam coś takiego:

function add_option(id,zm,skad) 
{
    //czyścimy całkowicie kolejny element
    var select = document.getElementById(id);
    while(select.hasChildNodes()) 
    {
        select.removeChild(select.firstChild);       
    } 
    var selected = $('#'+skad).val();
    var path = "http://" + window.location.hostname + window.location.pathname.replace(/index.php/i,"");
    var path_2 = "operations/edit_car/actions.php";
    var dane = {};
    dane[zm] = selected;
    //$('#'+id).load(path + path_2, dane);
    $('#'+id).innerHTML=wczytaj_plik(path+path_2,zm,dane[zm]);
    

}  
    //WCZYTANIE HTML ZA POMOCĄ AJAXA
    var ajax_method = typeof XMLHttpRequest == "undefined"?new ActiveXObject('Microsoft.XMLHttp'):new XMLHttpRequest();
    function wczytaj_plik(nazwa, zmienna, wartosc) 
    {
        ajax_method.onreadystatechange = function(){
                if (ajax_method.readyState == 1) {
                        ladowanie();
                }
                if (ajax_method.readyState == 4) {
                        if (ajax_method.status == 200) {
                                wynik(ajax_method.responseText);
                        }
                        else {
                                blad(ajax_method.status);
                        }
                }
        };
        ajax_method.open( "POST", nazwa, true );
        ajax_method.setRequestHeader('Content-Type',
        'application/x-www-form-urlencoded');
        ajax_method.send(zmienna + "=" + encodeURIComponent(wartosc));  
    } 
 

Sprawdziłem tym dodatkiem do FF który mi poleciłeś... Nagłówki faktycznie są wysyłane POST zmienna=wartość i są to mark=Volkswagen (przy tym wyborze), ale odpowiedź serwera jest zerowa... Nie ma odpowiedzi ani kodu HTML w odpowiedzi serwera. Serwer tylko odpowiedział nagłówkiem... Sprawdziłem katalogi - są wpisane dobrze jak i nazwa skryptu php. Sprawdzam to na serwerze lokalnym Apache. Nie wiem co robię źle. Ta metoda dała taki sam efekt jak funkcja .load() (takie same nagłówki widzę i 0 odpowiedzi w Firebug) tylko więcej pisania. Masz jakieś jeszcze pomysły? Zaczyna mnie to denerwować... a nie chcę motłochu z bazy danych pobierać :(

0

skoro używasz już jQuery to zrób sobie zamiast

var select = document.getElementById(id);
    while(select.hasChildNodes()) 
    {
        select.removeChild(select.firstChild);       
    } 

takie:

 $('#'+id).html('');

i do ajaxa też użyj jQuery (google, dokumentacja!)

jeżeli skrypt zwraca pustą treść - to raczej cos jest nie tak z PHP - nie z JS.

używasz $_REQUEST['mark'] - zaprzestań tego. Odwołuj się do $_POST i $_GET.

napisz sobie w swoim pliku php który wywołujesz na samym początku: die('dupa'); - zobacz, czy w JS odbierzesz tę dupę - "debugowanie przez dupczenie" to się nazywa ;) głupie, ale jakże skuteczne. dowiesz się, czy na pewno odwołujesz się do poprawnego skryptu. potem zrób sobie np: print_r($_POST); die(); --- zobaczysz co zwróci serwer, czy widzi Twoje dane z POST - i tak małymi kroczkami dojdziesz do tego, co i gdzie jest źle.

0

nie jestem aż tak głupi :) metodę przez "dupczenie" znam i zastosowałem . nawet przy niej mam 0 odpowiedzi :) w tym cały problem.

0

To znaczy, że nie umiesz jej zastosować ;) Tak naprawdę ktoś, kto ogarnia debugging - poradzi sobie z każdym skryptem - będzie coś kombinował, ale nigdy nie stanie w miejscu.
Ciężko jest tak zdalnie pomóc, skoro nie mam przed sobą Twojego kodu, w którym mogę grzebać i mojego Dragonflya (Firebuga).

Ale nie odpowiedziałeś nic nt. moich kroków. Czy die('dupa') coś zwraca? itd.

0

Nie wiem - nie ogarniam tego... próbuję się tego nauczyć ale te poradniki są tak kiepsko napisane... np. nie wiem co robi to "true" w .open("POST","skrypt", true); Mało tego nie wiem jaką ścieżkę zastosować do owego skryptu... czy muszę podać http://nazwahosta/katalogi/skrypt.php czy muszę może podać tylko katalogi/skrypt, bo AJAX sam będzie wiedział że jest to odwołanie do tego samego hosta na tym samym protokole (http lub https)... dużo kwestii jest dla mnie niejasnych. Jak mam grzebać w czymś , czego nie rozumiem :( na studiach nie miałem ani AJAX'a ani JavaScript ani JQuery... z tego tytułu jestem samoukiem, więc nie dziw mi się, że nie potrafię debugować skryptów JS.
Tak, robiłem die('dupa') i nic z tego. Zmieniłem koncepcję bo z tamtym nie umiem sobie poradzić. Może i jestem kiepski ale każdy czegoś się uczy. Też kiedyś byłeś na moim miejscu. Nie pisałbym na forum gdybym potrafił sobie z tym poradzić...
Tak wygląda strona:
http://img856.imageshack.us/img856/7301/autokomis.png

Teraz mam 2 pola. plik php w divie i wygląda tak:

<h3>Edytuj dane istniejącego samochodu</h3>
<form action="javascript: szukaj();" method="POST">
    <table style="width: 100%; text-align: right; margin-bottom: 15px;">
        <tr>
           <td style="width: 50%" id="lala">
                <label>Szukaj po :</label>
                <select name="search_by" id="search_category" class="pole_wyboru" OnChange="usun_opcje('search_category','none'); zmien_stan('pole_wyszukiwania',false); ">
                    <option value="none">wybierz kryteria</option>
                    <option value="mark">marce</option>
                    <option value="model">modelu</option>
                    <option value="year">roku produkcji</option>  
                    <option value="vin">numerze VIN</option>
                    <option value="id">ID w bazie danych</option>
                </select>
            <td style="width: 50%; text-align: left;">
                <input name="search" id="pole_wyszukiwania" class="pole_wyboru" disabled="disabled">
        <tr>
    </table>
    <br/>
    <div id="przyciski">
           <button class="btn_login" id="ok" style="border: 1px black solid; color:black;" onclick="return szukaj();"><img src="./img/icon-change.png" alt="+"/> &nbsp; Wyszukaj</button> &nbsp;
           <button class="btn_logout" id="cancel" type="button" style="border: 1px black solid; color: #9f0000;" onclick="close_window('box'); return false"><img src="./img/icon-back.png" alt="-"/> &nbsp; anuluj</button>
    </div>
    <div id="found">
        
    </div>
</form>; 

Skrypt JS wygląda tak:

/*******************************************************************************/
/*FUNKCJE OBSŁUGI MODUŁU EDYCJI SAMOCHODÓW*/
/*ZMIEŃ WŁAŚCIWOŚĆ OBIEKTU Z DISABLE NA ENABLE I ODWROTNIE*/
/*PIERWSZY PARAMETR TO ID OBIEKTU, DRUGI PARAMETR PODAJEMY TRUE (element zablokowany) LUB FALSE (element odblokowany) */
function zmien_stan(idobiektu,blokada)
{
    document.getElementById(idobiektu).disabled=blokada;
}

function usun_opcje(idobiektu,opcja)
{
    $("#"+idobiektu+" option[value='"+opcja+"']").remove();
}
//obsługa OnClick wyszukiwarki
function szukaj()
{
    var path = "http://" + window.location.hostname + window.location.pathname.replace(/index.php/i,"");
    var path_2 = "img/loading.gif";
    if (document.getElementById('pole_wyszukiwania').value=='')
        {
            alert ('Wpisz zawarto\u015bć pola zgodnie z kryterium wyszukiwania.');
            return false;
        }
    if (window.XMLHttpRequest)
    {// Dla IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// Dla IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
        xmlhttp.onreadystatechange=function()
    {
    if (xmlhttp.readyState!=4)
    {
        document.getElementById('przyciski').innerHTML('<img src="'+path+path_2+'" alt=""/>');
    }
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        document.getElementById("found").innerHTML=xmlhttp.responseText;
    }
    }
    //ar katalog= rootdomain
    xmlhttp.open("GET","operations/edit_car/actions.php",true);
    xmlhttp.send();
    return true;
} 

Proszę teraz plik actions.php:

<?php
die('dupa');
?> 

Teraz jak kliknę na WYSZUKAJ to wyświetla się puste okienko (testuję na Mozilla Aurora) w którym widnieje treść : "true" a w adresie przeglądarki pokazuje się wywołanie funkcji: "javascript: szukaj();".

KATALOGI

Moja strona zbudowana jest tak, że aby do niej się dostać z lokala należy wpisać http://localhost/autokomis i w tym momencie startuje plik index.php.

Plik php który odpowiedzialny jest za okienko wyszukiwania w module edycji samochodów jest w katalogu http://localhost/autokomis/pages/subpages/edit_car.php.

Skrypt .php który odpowiedzialny jest za obsługę wyszukiwarki znajduje się w katalogu http://localhost/autokomis/operations/edit_car/actions.php.

Teraz powiedz jak mam skonfigurować skrypt AJAX. Chyba, że jesteś w stanie wyjaśnić co się po kolei w tym skrypcie dzieje (jaka jest procedura przetwarzania tego skryptu poprzez przeglądarkę, która odczytuje funkcję szukaj();). Szukałem po samouczkach ale nie bardzo je rozumiem (być może jestem tyle tępy odnośnie JS)...

Wielkie dzięki za cierpliwość :) gdybym miał możliwość, postawiłbym Ci piwko za pomoc :) i to nie jedno hihi

0

wgłębię się w kod wieczorem, ale, powtórzę po raz kolejny to samo, choć od samego początku widzę, że olewasz połowę moich postów.

Nie wiem - nie ogarniam tego... próbuję się tego nauczyć ale te poradniki są tak kiepsko napisane... np. nie wiem co robi to "true" w .open("POST","skrypt", true);

1.) poradniki zawsze są kiepsko napisane. od małego jak tylko spotykałem się z poradnikiem, w każdym z języków jakich się tykałem - zawsze to była kupa gówna. Tylko uświadamiasz to sobie dopiero potem - jak już ogarniasz co i jak
2.) zamiast poradników korzystaj z dokumentacji. dokumentacja ma przykłady, ma od cholery tekstu opisującego co do czego.
3.) nie chcesz/nie umiesz korzystać z dokumentacji/google. wystarczy wpisać "XMLHttpRequest open", żeby trafić np na wiki http://pl.wikipedia.org/wiki/XMLHttpRequest w którym masz rozpisane parametry (choć widzę w polskim artykule nie do końca - ale to tylko jedno dostępne źródła z [b]milionów[/b] źródeł w chyba każdym języku

Mało tego nie wiem jaką ścieżkę zastosować do owego skryptu... czy muszę podać http://nazwahosta/katalogi/skrypt.php czy muszę może podać tylko katalogi/skrypt, bo AJAX sam będzie wiedział że jest to odwołanie do tego samego hosta na tym samym protokole (http lub https)... dużo kwestii jest dla mnie niejasnych.

1.) jw. dokumentacja. wszystko rozjaśni, jeżeli tylko spróbujesz ją przeczytać, zrozumieć i nie oczekiwać, że znajdziesz tam kod do ctrl+c, ctrl+v.
2.) skoro masz już jQuery - użyj go do ajaxa. Dużo upraszcza w zapisie jak i zachowaniu kompatybilności z przeglądarkami.

z tego tytułu jestem samoukiem, więc nie dziw mi się, że nie potrafię debugować skryptów JS.

a myślisz, że mnie ktokolwiek kiedykolwiek uczył html/css/php/mysql/javascript (albo rzeszy języków, których nie używam do webeveloperki)? nope, wszystko mam z googli, dokumentacji, z prób i błędów. pół roku po rozpoczęciu studiów to ja poszedłem do pracy jako webdeveloper, a nie czekałem czy i kiedy mnie ktoś tego nauczy ;)

jak mówiłem - kod przeanalizuję wieczorem, bo teraz nie mam na to za specjalnie czasu. w ostateczności nawet mogę Ci pomóc przez zdalny pulpit.

0

Mój drogi - poradziłem sobie po męczarniach i rzucaniem myszką o ścianę :) nie mam do tego cierpliwości. Kombinowałem i kombinowałem aż znalazłem, że problemem jest funkcja encodeURIcomponent(wartość zmiennej). Skrypt php jej nie potrafi odczytać i w wieczność się ładuje. Czy ta funkcja MUSI być użyta? Jeśli tak, to jak po stronie skryptu php sobie z nią poradzić (zdekodować?)?

0

Uporałem się już ze wszystkim. Skrypt działa, AJAX poprawnie wywołuje skrypt i wysyła parametry. Nie wiem gdzie wcześniej popełniłem błąd, ale działa. Nadal aktualnym pozostaje pytanie które zadałem post wyżej. JAK UPORAĆ SIĘ Z TĄ FUNKCJĄ I CZY JEST KONIECZNA. Pozdrawiam

0

zajrzyj no w dokumentację: http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp - jeżeli Twój parametr nie zawiera niczego więcej niż proste znaki a-z, 0-9 czy podkreślenie i pauzę - to nie musisz jej używać. url_decode po stronie php odwraca działanie tej funkcji w JS.

0

Poradziłem sobie z poprzednim zadaniem ale teraz mam dziwną sytuację której nie rozumiem. Zacznę od początku. Skrypcik AJAX tworzy mi pięknie obiekt XMLHTTP, wysyła dane i odbiera w przypadku funkcji szukaj. Pewne dane są załadowane do elementu

. W tych danych zawierają się 2 łącza USUŃ oraz EDYTUJ oczywiście samochód w bazie danych (jego dane). Funkcja podobna do poniższej funkcji szukaj() zajmuje się (zacznijmy od prostszego) usunięciem danych z bazy (całego rekordu). Odwołuje się ona do skryptu .php, który zwraca tylko tekst "ok" lub "not_ok". Czego bym nie zrobił - nic nie jest ponownie przesyłane (tylko i wyłącznie w IE ). Pierwsze szukanie wykonuje się normalnie, a już usuwanie czy załadowanie formularza edycji danych samochodu w ogóle się nie wykonuje... błąd pokazuje się w:</p>
xmlhttp.onreadystatechange=function()
            {
                 if (xmlhttp.readyState==4 && xmlhttp.status==200) //odpowiedź została odebrana
                {
                     document.getElementById('found').innerHTML=xmlhttp.responseText;                        // <- na początku tej linii debuger stawia kursor mówiąc mi: actions.js, wiersz 347 Znak 22 ,SCRIPT1002: Błąd składni 
                }
            } 

Szukałem co może być tego przyczyną i nie znalazłem. Zajrzałem także do dokumentacji :) nie piszą o tym albo ja nie umiem szukać kompletnie... czy miałeś z tym już problem? Proszę o pomoc...
Tutaj przedstawiam tę przykłądową (działającą funkcję) szukaj i funkcję usuń działającą na FF lecz nie na IE:

 function szukaj()
{
    var path = "http://" + window.location.hostname + window.location.pathname.replace(/index.php/i,"");
    var path_2 = "operations/";
    var path_img= "img/";
    sel=document.getElementById('search_category');
    sel_val=sel.options[sel.selectedIndex].value;
    if((sel.selectedIndex<1)&&(sel_val=='none'))
        {
            alert("Wybierz kryterium wyszukiwania.");
            return false;
        }else
        if (document.getElementById('pole_wyszukiwania').value=='')
            {
                alert ('Wpisz zawarto\u015bć pola zgodnie z kryterium wyszukiwania.');
                return false;
            }
    if (window.XMLHttpRequest)
    {// Dla IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// Dla IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");      
    }
        xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200) //odpowiedź została odebrana
                {
                    document.getElementById('przyciski').innerHTML='<button class="btn_login" id="ok" style="border: 1px black solid; color:black;" onclick="return szukaj();"><img src="./img/icon-change.png" alt="+"/> &nbsp; Wyszukaj</button> &nbsp; <button class="btn_logout" id="cancel" type="button" style="border: 1px black solid; color: #9f0000;" onclick="close_window(\'box\'); return false"><img src="./img/icon-back.png" alt="-"/> &nbsp; anuluj</button>';
                    document.getElementById("found").innerHTML=xmlhttp.responseText;
                }else
                    {
                        document.getElementById('found').innerHTML="";
                        document.getElementById('przyciski').innerHTML= '<img src="'+path+path_img+'loading.gif" alt=""/>';
                    }
            }
    //var dane="category="+encodeURIcomponent(sel_val)+"&value="+encodeURIcomponent(document.getElementById('pole_wyszukiwania').value);
    var dane="category="+sel_val+"&value="+document.getElementById('pole_wyszukiwania').value;
    xmlhttp.open('POST','operations/edit_car/actions.php',true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-length",  dane.length);
    xmlhttp.setRequestHeader("Connection", "close");
    xmlhttp.send(dane);
    return true;
}

function del(id, km)
{
    var del_or_not= confirm("Czy napewno usunąć ten samochód? \n\nSamochód zostanie usunięty bezpowrotnie!");
    if (del_or_not==true)
        {
            var dane="id="+id+"&km="+km;
            if (window.XMLHttpRequest)
            {// Dla IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else
                {// Dla IE6, IE5
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
            xmlhttp.onreadystatechange=function()
            {
                if (xmlhttp.readyState==4 && xmlhttp.status==200) //odpowiedź została odebrana
                {
                    if (xmlhttp.responseText=="ok")
                            {
                                var path = "http://" + window.location.hostname + window.location.pathname.replace(/index.php/i,"");
                                alert("Samochód został usunięty pomyślnie!");
                                $('#car_manage_content').load('./pages/subpages/edit_car.php');

                            }
                            else
                                    {
                                        alert("Samochód nie mógł być usunięty!");    
                                    }
                }
            }
            //var dane="category="+encodeURIcomponent(sel_val)+"&value="+encodeURIcomponent(document.getElementById('pole_wyszukiwania').value);
            xmlhttp.open('POST','operations/edit_car/actions.php',true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.setRequestHeader("Content-length",  dane.length);
            xmlhttp.setRequestHeader("Connection", "close");
            xmlhttp.send(dane);
            return true;
        }
}
0

a usuń tą megadługą linię powyżej. zakładam, że w niej coś nie spodobało się szanownemu IE. Jeżeli po jej usunięciu skrypt będzie działać to rozbij tego długiego stringa o tak:

document.getElementById('przyciski').innerHTML='<button class="btn_login" id="ok" style="border: 1px black solid; color:black;" onclick="return szukaj();">'+
'<img src="./img/icon-change.png" alt="+"/> &nbsp; Wyszukaj</button>'+
'&nbsp; <button class="btn_logout" id="cancel" type="button" style="border: 1px black solid; color: #9f0000;" '+
'onclick="close_window(\'box\'); return false"><img src="./img/icon-back.png" alt="-"/> &nbsp; anuluj</button>';

btw: jak używasz klas, to po cholerę jeszcze liniowo definiujesz style?
już pomijam jaki to chaos i niezorganizowanie ten kod, no ale "działa" ;)

0

liniowo wprowadzam małe zmiany bo pewne parametry akurat do tej klasy nie pasują. To jest klasa dla przycisku logowania i podmenu natomiast wykorzystuję ją jako przycisk akceptacji tylko w tym miejscu.

Usunięcie linii nie dało efektu. Dalej mam to samo. (tymczasowo ją wyciąłem).

0

a jak wywalisz też tą linię w której jest niby błąd?

0

to samo...

0

hmmm IE9 jest o tyle głupi że automatycznie przy nieznanym certyfikacie (bo używam protokołu https) włącza tryb zgodności a więc obiekty ActiveX są wyłączone. Stąd były problemy. Wystarczyło pogrzebać w opcjach. Tylko co powiedzieć użytkownikom? :) Mój serwis nie działa na IE? hihi

0

Zainwestować w uznany certyfikat SSL i nie naruszać sensu istnienia samych certyfikatów lub tak jak na przykład administracja 4programmers stworzyć sobie własny urząd certyfikacji (Certificate Authority), wypisać za jego pomocą certyfikat dla strony i kazać użytkownikom zainstalować sobie ten CA - dla większości przeglądarek to 2 kliknięcia, nawet nie trzeba za bardzo grzebać po opcjach - w przypadku Opery i Firefoxa (nie wiem jak inne) przeglądarka automatycznie zaproponuje instalację certyfikatu gdy użytkownik kliknie w <a href=""></a> kierujący do pliku z certyfikatem.

Ewentualnie: http://stackoverflow.com/questions/5374099/how-do-i-force-internet-explorer-to-render-in-standards-mode-and-not-in-quirks

0

Drogi Administratorze :) wszystko pięknie, tylko ten projekt który wykonuję jest projektem pracy inżynierskiej. Nie chcę zatem inwestować w kupno certyfikatu. Witryna widnieje na serwerze CBA.pl zatem nie mogę im narzucić generacji certyfikatu. Mało tego - ich serwer odrzuca https:// (nie znam dobrego darmowego serwera z udostępnioną funkcją mail(), tablicą superglobalną $_SERVER[] oraz możliwością szyfrowania połączenia na raz). Chyba że można mi coś polecić? pozdrawiam

0

Jeśli koniecznie potrzebujesz protokołu SSL - obecnie hosting jest bardzo tani, typowe shared hosty to około 50zł za rok.

0

w przypadku przesyłanych danych personalnych bardzo ważne jest szyfrowanie SSL pomimo zastosowanego dodatkowo szyfru cezara

0

Mam kolejny problem. Otóż chcę, aby po wyświetleniu komunikatu w Javascript alert('blablabla') "stała się" animacja slideUp elementu div. Problem polega na tym, że jeśli sobie to położę pod sobą, to po wyświetleniu komunikatu nic się nie dzieje, a po kliknięciu na OK w nim div NATYCHMIASTOWO znika, bez żadnej animacji. Ktoś pomoże? będę wdzięczny :) pozdro

0

po prostu alert daj przed slideUp
ale animacja zacznie się dopiero po kliknięciu ok
w tle raczej się nie da

chyba że wykorzystasz jakiegoś custom alerta w jquery

0

wlasnie zrobilem jak mowisz. Animacja MA SIĘ ZACZĄĆ po kliknięciu ok ale to nie działa :) pozdrawiam

0

niestety, tak dziwnie działają alerty. gdzieś widziałem niedawno fajny art o używaniu alertów, szczególnie w kontekście debugowania, a konkretnie - dlaczego nie należy ich używać - ponieważ zatrzymują kod.. w teorii - bo zatrzymują tak naprawdę jego część i nie zawsze da się to przewidzieć co się stanie. Niestety nie jestem w stanie tego już odnaleźć :/ Z alertem zawsze tak jest, niezależnie od tego gdzie go postawisz. możesz próbować użyć confirm() - ale confirm wyświetla dwa przyciski - ok i anuluj ..

1 użytkowników online, w tym zalogowanych: 0, gości: 1