26. september 2007 - 07:47Der er
5 kommentarer og 2 løsninger
"Du trykkede uden for boksen"
Hej, jeg har en knap der, når man trykker, kalder en funktion der laver en boks med nogen tekst i. Det jeg så gerne vil have er, at når man trykker et hvilket som helst sted uden for boksen, skal boksen slettes igen. Men jeg ved ikke hvilken event jeg skal bruge der, og hvilket element, eventen skal være sammenhængen med. Jeg har før lavet en meget kringlet løsning, hvor alle andre element end boksen, havde en click event, der kaldte funktionen der lavede boksen. Men jeg tror bestemt, at der er en bedre løsning ... jeg kan bare ikke rigtig finde den:)
<script type="text/javascript"> document.onclick = function(e){ var boks; if(e.target.id=="knap"){ //der er trykket på knappen //lav boksen, hvis den ikke allerede eksisterer: if(!document.getElementById("boks")){ boks = document.createElement("div"); boks.appendChild(document.createTextNode("tekst, tekst, tekst")); boks.setAttribute("id","boks"); document.getElementsByTagName("body")[0].appendChild(boks); } } else if(e.target.id!="boks"){ //der er trykket uden for knappen og udenfor boksen //så vi ikke får fejlmelding, hvis vi trykker på siden, når der ikke er en boks: boks = document.getElementById("boks"); if(boks) document.getElementsByTagName("body")[0].removeChild(boks); } } </script>
Det var egentligt en utrolig simpel måde, som virker perfekt! Jeg har dog aldrig støt på noget i denne stil (med hensyn til at bruge target.id sammen med onclick eventens return værdig), så er det muligt at få et par link til nogen referencer og information omkring dette, og hvilke ting, i samme stil, der også er muligt.
Og det skulle gerne være klaret med det her. Testet i IE 7 og nyeste versioner af firefox og opera: document.onclick = function(e){ var boks; if(e){ //ikke IE: if(e.target.id=="knap"&&!document.getElementById("boks")){ //der er trykket på knappen og //boksen er ikke allerede lavet: boks = document.createElement("div"); boks.appendChild(document.createTextNode("tekst, tekst, tekst")); boks.setAttribute("id","boks"); document.getElementsByTagName("body")[0].appendChild(boks); } else if(e.target.id!="boks"&&document.getElementById("boks")){ //der er trykket uden for knappen og udenfor boksen og //boksen eksisterer: boks = document.getElementById("boks"); document.getElementsByTagName("body")[0].removeChild(boks); } } else if(event.srcElement) { //IE: if(event.srcElement.id=="knap"&&!document.getElementById("boks")){ //der er trykket på knappen og //boksen er ikke allerede lavet: boks = document.createElement("div"); boks.appendChild(document.createTextNode("tekst, tekst, tekst")); boks.setAttribute("id","boks"); document.getElementsByTagName("body")[0].appendChild(boks); } else if(event.srcElement.id!="boks"&&document.getElementById("boks")){ //der er trykket uden for knappen og udenfor boksen og //boksen eksisterer: boks = document.getElementById("boks"); document.getElementsByTagName("body")[0].removeChild(boks); } } }
- efter fjernelsen. Ellers akkumuleres elementerne i hukommelsen ;o)
Men hvorfor ikke bare vise eller skjule boksen, når den én gang er lavet? Teksten sættes så med: boks.firstChild.nodeValue = "Ny tekst";
/mvh </bole>
Synes godt om
Slettet bruger
06. oktober 2007 - 01:11#7
fordi han er en spade :P nej pjatter bare
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.