28. november 2009 - 00:04Der er
43 kommentarer og 1 løsning
Udbygning af eksisterende ajax script
Hej, Jeg fik desværre ikke en løsning på mit spørgsmål i tråden (http://www.eksperten.dk/spm/893664). Derfor prøver jeg igen med flere point i håbet om en kan løse problemet. Jeg ønsker en udbygning af scriptet der kan findes her: http://www.xtinctdesigns.com/GS_Intro.php. Det jeg ønsker er at en tilhørende variabel til $movie_name trækkes med ud af databasen og indsættes i et andet input felt. Fx når man begynder at skrive i inputText kommer udtrækket fra $movie_name, fx Top Gun, hvis denne vælges indsættes i inputText "Top Gun" og den tilhørende $year i inputText2 som fx er "1986". Det der mangler i koden er automatisk at få sat $year i inputText2, når inputText vælges.
I suggest.js skal du ændre funktionen handleClick :
function handleClick(selection) { var cleanString = unescape(selection); document.getElementById("inputText").value = cleanString;
var year = cleanString.substr ( cleanString.length-4, 4); document.getElementById("inputText2").value = year; emptySuggestions();
}
Så burde det virke, hvis du selvfølgelig har lavet en inputbox i din html side, der hedder inputText2 ;)
Læg i øvrigt også mærke til at årstallet bliver skrevet til titlen i den suggestionbox, der kommer frem nu. Dette kan ændres med en substr i funktionen handleClick, hvis du ikke vil have dette.
I øvrige er det ikke den "pæneste" kode, jeg har skrevet,men tror det er den hurtigest måde at få det løst på.
Tak for dit bud. Umiddelbart kan jeg dog ikke få det til at virke. Koden i linket jeg henviser fungerer og jeg har indsat inputText2. Men når jeg begynder at skrive i InputText kommer der ingen forslag. Så vidt jeg tolker koden får du var year ved at trække de sidste fire bogstaver/tal fra variablen der returneres fra php-delen. Da det ikke altid er tale om et årstal (det kan være der står "ukendt" el. "ikke indsat endnu"), vil jeg høre om koden kan tilpasses dette.
Det er helt korrekt at måden jeg finder årstallet på, er at "trække" de sidste 4 cifre ud af sætningen, der kommer tilbage fra php delen. Det var faktisk det jeg mente, med at det var lidt "grim" kode, så det blev jo faktisk hurtigt bevist. :)
Det kan selvfølgelig lade sig gøre, men det kræver nok lidt mere omskrivning af koden, med mindre der er andre, der har et godt forslag selvfølgelig.
Skal også lige have noget helt grundlæggende på plads, virkede din side før, altså hvor man kun fik navnet tilbage og ingen årstal?
Hvis det virkede før så kan der jo være 2 ting galt. Enten i php delen eller i javascript delen. Derfor skal vi lige prøve lidt forskelligt. Prøv i første omgang at sætte følgende ind i php delen :
while ($row) { $movie_name = $row['movie']; $year = $row['year'];
Jeg ved ikke hvad der gik galt, men de ændringer du postede i #1 virker nu. Dvs. når jeg begynder at skrive kommer mulighederne og ved valg af en af disse indsættes i inputText $movie_name og i inputText2 $year (dvs. de sidste fire bogstaver/tal).
Vil det være meget besværligt at ændre så hele værdien af $year indsættes, istedet for blot de sidste fire cifre/bogstaver?
Hmm, der sker dog det underlige at hvis jeg har tastet a, kommer der resultater med a OG r. Taster jeg b kommer der muligheder som begynder med v. Dette var ikke et problem før ændringerne som du kom med i #1.
Ok, det er perfekt. Så er vi tilbage på sporet igen. Har siddet og tænkt lidt over hvordan man laver det smartest så årstal kommer til at virke med alle former for tekst, skal lige teste lidt kode her for at få det helt på plads, så vender jeg lige tilbage.
En tilføjelse til #6: I inputText vises og indsættes både $movie_name og $year. Det er fint de begge vises (da to film kan have samme titel, men produceret i to forskellige år), men er det muligt kun at få sat $movie_name ind i inputText og så selvfølgelig hele værdien af $year i inputText2?
Lad os så prøve med den endelige version, hvor $year kommer direkte i inputText2 :)
Har skrevet lidt forklaring som kommentar, håber det giver lidt indblik, hvad jeg har gjort
database.php
Start med at skifte while loopen ud med
// Laver delen om i php, så det der bliver sendt tilbage til javascript delen ikke længere bliver "Top Gun 1986", men istedet et array, som javascript kan fortolke direkte med eval()
$names = "var names = new Array(\""; $years = "var years = new Array(\"";
while ($row) { $movie_name = $row['movieName']; $year = $row['year'];
// Fjerner de ekstra ," i slutningen af den var names = new Array("foo", "bar", " og afslutter med ); for at lukke syntaxen. Samme med var years, der nu indeholder korseponderende årstal til filmene
Burde være der det hele, tror det smarteste på nuværende tidspunkt er at du sender hele din kode, ligesom du gjorde i det andet spørgsmål, så kan jeg rette det til, og sende det tilbage til dig. ;)
Det er "kun" filerne database.php og suggest.js der er nødvendige at få op.
try { xmlHttp = new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari } catch (e) { try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer } catch (e) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); // Internet Explorer } }
return xmlHttp;
}
function handleClick(name, year) { var cleanName = unescape(name); var cleanYear = unescape(year); document.getElementById("inputText").value = cleanName; document.getElementById("inputText2").value = cleanYear; emptySuggestions();
}
function handleInput(e, userInput) {
var theEvent = e || window.event;
if (userInput.length == 0) { emptySuggestions(); return; }
if (theEvent.keyCode == KEYUP || theEvent.keyCode == KEYDOWN) {
var list = getList();
if(theEvent.keyCode == KEYDOWN) { var newSelectedLi = currentlySelectedLi + 1; } else { var newSelectedLi = currentlySelectedLi - 1; }
Har kigget lidt på den og er gået lidt dø, burde virke, så skal lige have dig til at prøve at ændre den eval( xmlHttp.responseText ); under funktionen stateChanged() til alert( xmlHttp.responseText );
Så burde den komme med en alertbox, hvis der kommer noget tilbage fra php delen.
et tillægsspørgsmål: når jeg begynder at skrive i feltet kommer mulighederne og jeg klikker med musen og filmnavn og år bliver indsat i hhv. inputText og inputText2.
Jeg havde troet resultatet var det samme hvis jeg navigerede med piletasterne og trykkede tab eller enter, men det er det ikke.
Er det let at lave? Ellers opretter jeg et nyt spørgsmål.
Der er 2 "problemer" med at bruge Enter og Tab tasten til at "vælge" en film.
Det første er at listen, der kommer frem er at den er lavet som en <LI> liste, og det i princippet kun er tekst, der bliver skrevet i den, og man derfor hele tiden skal fortælle, hvad der skal ske hvis enten man klikker, bruger piltaster, kører musen hen over osv. Hvis man f.eks havde en dropdown liste <SELECT> ville mange af disse funktioner allerede være "bygget ind i" denne.
Andet problem, er at ENTER og TAB tasterne er allerede "brugt" til noget i browser vinduet, nemlig ENTER = klikke på Search knappen. Ved dog ikke om du bruger denne på din side ? For det andet er TAB knappen brugt til at hoppe frem og tilbage imellem input fields, altså både input text, knapper, links osv.
Må indrømme at jeg ikke ved om der er en måde man kan snyde browseren på, så at man får lov at styre disse events selv i første omgang. Eller lad mig omformulere det, selvfølgelig er der en måde man kan dette på, men jeg ved ikke hvordan. ;)
Har lavet en løsning, der virker med ENTER, dog med det forbehold at du ikke har en SUBMIT knap i forbindelse med inputText boksene. Så sig til, hvis du vil se funktionen.
Okay, du skal tilføje ændre funktion handleInput til :
function handleInput(e, userInput) {
var theEvent = e || window.event;
if (userInput.length == 0) { emptySuggestions(); return; }
// Ny tilføjelse
if (theEvent.keyCode == KEYENTER) { var list = getList(); handleClick( list[currentlySelectedLi].innerHTML.substring(6), list[currentlySelectedLi].value); return;
}
if (theEvent.keyCode == KEYUP || theEvent.keyCode == KEYDOWN) {
var list = getList();
if(theEvent.keyCode == KEYDOWN) { var newSelectedLi = currentlySelectedLi + 1; } else { var newSelectedLi = currentlySelectedLi - 1; }
Okay, havde fundet fejlen. Det var mig, der har lavet en bummert :/
Grunden til fejlen, skyldes at jeg endnu en gang havde glemt at du ikke kun havde tal i $years, og at value på en <li> tag kun må ind holde tal (i øvrigt er attributen slet ikke i brug mere, så det var lidt et workaround, jeg havde lavet).
Skal lige tilbage og tænke på en anden løsning så. ;)
Så prøver vi igen. Nu har jeg også testet her men årstal og bogstaver :)
Ændrer følgende :
if (theEvent.keyCode == KEYENTER) { var list = getList(); // Ny variable var elementName = "hiddenDiv"+currentlySelectedLi; handleClick( list[currentlySelectedLi].innerHTML.substring(6), document.getElementById(elementName).innerHTML.substring()); return;
Skal igen siges, at vi er på et punkt nu, hvor det er "grimt" kodning, men jeg har lidt på fornemmelsen at det ikke betyder så meget, hvis det bare virker ?
Fantastisk, så virker det :) Det vigtigste, i første omgang, er at det virke. Mange tak for hjælpen!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.