28. december 2010 - 13:53Der er
22 kommentarer og 1 løsning
Hjælp til opbygning af noget lignede named anchors
Jeg har en side bestående af en masse felter indlejret i næsten lige så mange <ul> o.l. Disse felter kan brugeren indtaste værdier i, og ved tryk på enter, bliver en processide kaldt, via en submitknap. Processiden sørger for at gemme data i en database, og indlæse frontend'en igen.
Mit problem er at vi gerne skal have <ul> til at være lukket fra starten af, men at den <ul> som man sidst indtastede noget i er åben, og at fokus samtidig ligger på det sidst indtastede felt. Altså noget med named anchors, men jeg kan ikke lige greje, hvordan jeg løser det, når jeg springer over flere sider, og at submitknappen samtidig er den seneste aktive element, hvilket den jo bliver ved tryk på enter.
$query = "SELECT * FROM aconto_plan WHERE ordre_id = '".$_GET['id']."' AND type = 1 ORDER BY id ASC"; $query_ud = mysql_query($query) or die(mysql_error);?>
$forespøgz = "SELECT *, ab.låst AS ab_låst, a.id AS id, ab.id AS ab_id FROM aconto_plan AS a LEFT JOIN aconto_kolonner AS ak ON a.id = ak.acontoplan_id LEFT JOIN aconto_beløb AS ab ON ab.acontokolonner_id = ak.id WHERE a.ordre_id = '".addslashes($_GET['id'])."' AND a.id = '".$position['id']."' AND type = 1"; //ORDER BY `ab`.`acontokolonner_id` DESC ";
Ja, det har jeg også fundet ud af, men hvordan kan jeg bruge den dynamisk?
Jeg vil gerne have at display i følgende blvier dynamisk, alt efter hvad window.location.hash er
<div id="id_kontrakt" style="display:block;">
Jeg tror dog jeg har løst problemet ved at gemme en information om typen i databasen, det er bare ikke satans elegant, så hvis der var en smartere måde, ville jeg meget gerne vide det.
Jeg glemte nok at skrive i #7, at jeg gætter på at siden som loades via din header i #2, også dannes dynamisk af PHP. Dermed må PHP vide hvor mange felter, der skal være åbne og lukkede, og kunne outputte javascript i stil med #7 dynamisk til sidst.
Hvis det skal være statisk serverside, kan du bruge anchor til normal positionering på siden, og så lave et javascript switch statement som lukker for felterne over det nævnte anchor:
<script type="text/javascript"> window.onload = function () { switch( window.location.hash.substring(1) ) { case "felt10": showhide('id_felt9'); case "felt9": showhide('id_felt8'); case "felt8": showhide('id_felt7'); ... ... } // stil cursor i samme felt som siden er positioneret til: document.getElementById('id_' +window.location.hash.substring(1)).focus(); } </script>
Læg mærke til at switch/case ikke indeholder break. Derfor vil alle nedenstående statements blive udført når et match er fundet. Og derfor spørges på nederste feltnavn først, og alle ovenstående felter spærres ud fra det navn der skal positioneres til ifølge anchor.
Men lige for at afklare nogle ting, så er siden i headeren dynamisk. Altså det er selvfølgelig en fast side, men et dynamisk antal felter, og dynamisk indhold i disse. Data hertil trækkes fra databasen. Faktisk er header-siden samme som brugeren i første omgang indtastede data i.
Så processen bagved er således.
fronten side 1 -> backend processide 1 -> frontend side 1
Men tilbage dit forslag, for at se om jeg følger dig af den rigtige vej.
Som jeg forståer det så vil du have en onLoad på min frontend side 1. Funktionen showhide() skal vise(none) det felt, som kommer fra hash og samtidig lukke(block) alle de andre?
#10 Jeg går ud fra at din side viser alle felter (display:block)? Og at showhide(id) bare skifter mellem display: none og block? Og javascriptet vi arbejder på her, skal gøre en række elementer usynlige?
Hvis jeg forudsætter tre gange ja til ovenstående er ideen, at vi kalder showhide() på en række synlige elementer, og dermed bliver de usynlige.
Men hvis antal felter er dynamisk er det vel nemmest at sætte none/block direkte fra PHP mens siden dannes:
Så er der ikke behov for javascript. Til gengæld skal du beregne $kontraktOK i mit eksempel her, eller på anden måde lave den if der bestemmer om afsnit kontrakt er synligt.
#11 Det er ikke 3 ja'er, men tæt på. Alle felter er som standard skjult (display:none), ellers så passer det. Men det gør vel ikke den store forskel...
Men den sidste måde du nævner er faktisk den jeg har implementeret. Problemet i det, er at jeg bliver nød til at gemme hvilket felt, der senest er blevet ændret, i databasen. Dette skal jeg så på siden trække ud igen. Og betyder også, at jeg pt. kun kan vise én række felter, og jeg kan forestille mig, at brugerne gerne vil have alle ændrede rækker vist, men det er jeg altså ikke helt sikker på.
#12 OK, men så kan switch/case godt bruges: Men feltrækkefølgen skal ikke være "omvendt" som i #9, hvor jeg troede at jeg skulle skjule dem der allerede var udfyldt.
Det skal blot være den rigtige felt-rækkefølge i case-linierne, hvis resten af felterne skal ændres fra skjulte til synlige.
Ja, hvis meningen er at det aktuelle felt og alle efterfølgende felter skal gøres synlige.
Og hvis antal felter (og dermed anchors) kan variere, skal du bygge det op i en PHP-string, mens siden dannes, og outputte det til sidst, pakket ind i en onload-funktion som vist i #9.
Nej, det er ikke det aktuelle og alle efterfølgende felter, der skal gøres synlige.
Der er 2 muligheder 1) Kun det felt, som brugeren sidst indtastede i gøres synlig. 2) Alle og kun de felter, som brugeren indtastede skal gøres synlige.
Det er fordi jeg ikke rigtig er klar over, om man kan sende flere "variabler" som hash.
Min siden er opbygget sådan, at brugeren kan folder mange "menuer" ud, hvor under der i hver er en række felter, som de kan indtaster. Systemet gemmer så alle felter, når de trykker gem.
Min høker-løsning pt. er at jeg smider feltets navn i et dertil indrettet felt, som jeg så gemmer i databasen, så kan jeg finde ud af at trække det ud på siden, og folder den rigtige menu ud. MEN jeg har kun et felt dertil, og det indeholder kun et feltnavn, så har brugeren indtastet i 5 felter, så vil det kun være den sidste der er åben. Gav det mere mening?
Man kunne godt bruge split() på hash-værdien, og så have flere variable i den, adskilt af et udvalgt bogstav eller underscore.
Men jeg synes ikke, at det er den rigtige teknologi til at korttids-huske lidt data i klienten.
Jeg ved, at du vil sætte denne hash med serverside script, men kunne man ikke gøre det i klienten allerede ved første send? Og så bruge en cookie i browseren til at huske status?
Cookies er meget nemt, og gør at man kan gemme variable i klienten. Det er faktisk beregnet til at huske status fra sidste besøg, som du har brug for her.
Læs en tutorial om javascript og cookies.
Så en skitse til en løsning er:
- Opret en ny tom javascript Array() (global variabel) - Din showhide() funktion udvides til at gemme id på afsnit der åbnes, i Array'et. Og fjerne afsnit der lukkes. - En onsubmit() funktion på din form udvides til at gemme status på Array i en cookie. - Onload() funktionen aflæser cookie, og kalder showhide() per element.
Herved vil din side altid have samme status som før submit, uden at du skal programmere noget serverside.
Og cookies har en expires parameter, så du selv bestemmer om status skal huskes i få sekunder, resten af dagen eller flere år.
Her længe tænkt, at jeg burde kigger nærmere på hvordan cookies skal bruges, men har aldrig fået taget mig sammen. Men dette kan være et godt incitament. Det må dog vente, da systemet meget snart skal gå i drigt, og så må brugerne nøjes med den nuværende funktionalitet indtil videre.
Men du skal have mange gange tak for hjælpen. Smid et svar, så du kan få nogle point.
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.