![]() |
I en del applikationer vill man ha uppgifter från användaren som helt enkelt kräver ett svar, och då kan man använda confirm eller prompt.
Det fungerar ju ungefär så här: Kod:
... Kod:
function fMinPrompt(sFraga, sFunktionVidSvar, sFunktionVidAvbryt) Kod:
fMinPrompt("Hur många kaffekoppar dricker du per dag?","fPromptSvar","fPromptAvbryt"); Så min fråga är nu om det finns någon möjlighet att anropa en egengjord prompt på samma sätt som man gör när man vill anlita den inbyggda prompten? |
Du kan inte påverka windows standardutseende om det är det du frågar. Inte med JS. Däremot kan du ju göra en prompt i HTML som ploppar upp på hemsidan.
|
Citat:
Exempelvis var sSvar = fMinPrompt("Skostorlek"); |
Ja, men jQuery kan du göra en "egen" prompt, se exempel:
http://trentrichardson.com/Impromptu/index.php |
Citat:
PS JQuery är inte nödvändigt för detta, men kanske kan vara enklare om du inte riktigt förstår hur js fungerar. |
Nej, man kan inte göra det du efterfrågar. Ditt krav är att funktionen ska vänta med att returnera innan man svarat på frågan, och det går inte att göra så. Att det fungerar för den inbyggda prompt-funktionen är för att den är konstruerad så, men det går inte att bygga en egen med bara javascript. Att ha callback-funktioner är sättet man måste lösa på.
(Btw, jag tycker inte riktigt att ditt anrop är så lyckat, dels för att du deklarerar publika funktioner för svaren, och dels att du istället för pekare till funktionerna skickar med namnen på dem) |
Ok. Då har jag fått svar på frågan. Det var som jag misstänkte.
Onkeborg: Ge gärna exempel. Jag vill lära mig! |
Rent generellt:
När du deklarerar en funktion: function foo() { alert('kaka'); } så är det bara en kortform av: var foo = function() { alert('kaka'); } Grejjen är alltså att du deklarerar en variabel innehållandes en pekare till en funktion. Du skulle alltså senare i koden kunna skriva: var bar = foo; för att på så sätt låta även variabeln bar peka på samma funktion. Med det i bagaget så går vi vidare: Om vi har följande funktioner: var foo = function() { alert('kaka'); } var anrop = function(funk) { //här gör vi någonting spännande som tar ett tag, t.ex. ett AJAX-anrop //nu är det dags att anropa vår funktion "funk": funk(); //funk == referens till funktionen, funk() == exekvera funktionen och få resultatet av den } Vi vill nu anropa funktionen "anrop" med funktionen "foo" som argument: anrop(foo); Om vi vill slippa att deklarera funktionen "foo" så kan man dock skippa det steget genom att sätta själva funktionsdeklarationen som argument istället för en variabel som innehåller funktionen: var anrop = function(funk) { //här gör vi någonting spännande som tar ett tag, t.ex. ett AJAX-anrop //nu är det dags att anropa vår funktion "funk": funk(); } anrop(function() //det här är alltså anropet { alert('kaka'); }); Det finns många saker som är bra med det här, men som exempel så skulle jag kunna ta den kod du skrev ifrån början här i tråden: fMinPrompt("Hur många kaffekoppar dricker du per dag?", function(sSvar) { // Kod för vidarebehandling av svar }, function() { // Kod för vidarebehandling om användaren avbröt frågerutan }); |
Citat:
Tack för tipset. |
Det är lite praktiskt också, jag ska visa ett enkelt exempel :)
function hanteraKlickPåKnapp(djurTyp) { //Ajax-kod ajax.onSidanLaddad = function() { alert(djurTyp); //Här kan jag använda variabeln djurTyp, trots att den inte är medskickad som parameter till just den här funktionen. Den ärver alltså variablerna från contextet ovanför }; }; Som du ser i mitt lilla exempel så kan du alltså få tillgång till variabler från contextet ovanför dig (som i sin tur ärver från contextet ovanför sig, osv), vilket gör att du slipper göra flera publika funktioner, _och_ slippa göra en massa publika variabler/klasser/behöva skicka med en massa parametrar på något sätt. Istället kan man skriva all kod i en, enda publik funktion som om den vore synkron istället för asynkron. I exemplet så följer ju t.ex. "djurTyp" med automatiskt, men även "ajax" följer med, om man nu till exempel vill göra ännu ett nytt anrop mot servern :) |
Alla tider är GMT +2. Klockan är nu 22:18. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson