12. oktober 2009 - 02:38Der er
9 kommentarer og 1 løsning
Kodeafvikling fejler i IE men virker i FF
Hej,
Jeg har et problem med et stykke hjemmebrygget javascript kode. Først og fremmest vil jeg tilføje at jeg er absolut på tynd is med javascript, hvilket også er en del af grunden til at jeg nu hører mig af her.
Koden virker - tilsyneladende - helt fint på Firefox (latest version) men i IE (8) fejler det miserabelt.
Basalt set har jeg en funktion som udskriver indhold til en udvalgt <label> baseret udfra funktions-parametre.
function outputClientMessage(objid, message, state) { var formattedString;
Ideen er så at mine andre "validator-funktioner" som foretager en meget simpel og overfladisk validering vil kalde den funktion hvis valideringen fejler. Objid er navnet (id) på den label der skal skrives til, message er beskeden som skal skrives og state er en boolsk indikator om der er en fejl eller blot en info besked.
Så vidt, så godt. Jeg troede at alt var godt da jeg primært bruger Firefox, men IE 8 piver over følgende:
Jeg har, som en sidenote, læst mig frem til på nettet at innerHTML tilsyneladende er deprecated og bør undgåes (dog umiddelbart lyder det til at folk er delt i to lejre på det udsagn).
Er der nogen der kan forklare mig hvor det går galt (og hvordan det rettes til så det virker i begge browsere) - og kan det gøres pænere (det er jeg overbevist om, det kan).
innerHTML er deprecated fordi folk gerne vil have dig til at arbejde med HTML som en DOM-struktur (alá XML). Det er der både fordele og ulemper i, men det kan jeg ikke forklare kort her.
Et eksempel til en løsning kunne være (koden er ikke testet men skulle give et billede af hvordan du kan gøre):
var paragraph = document.createElement('p'); var image = document.createElement('img'); var text = document.createTextNode(message); var container = document.getElementById(objid);
Jeg har tidligere leget med innerText, men den virker ikke i Firefox.
j4k0b, dit eksempel ser interessant ud men jeg synes ikke umiddelbart jeg kan få det til at gøre noget. Her er en lettere omskrevet funktion:
function outputClientMessage(obj, message, state) { var s = document.createElement('span'); var img = document.createElement('img'); var text = document.createTextElement("Test: " + message); var target = document.getElementById(obj);
Og så virker det :) Dog skal du også tage højde for at fjerne elementet igen, som er en af ulemperne i forhold til innerHTML. Gem en reference til objektet i en global variabel, og brug target.removeChild før du appender nyt (s)
Vedr. den åbenlyse fejl, så er det korrekt. Det var dog blot en fejl da jeg kopierede over. Min reelle up-to-date kode matchede id'et på det objekt :-)
Efter at have erstattet "document.createTextElement" med "document.createTextNode" virker det igen fint på Firefox, men jeg har stadig lidt små-problemer med at få IE til at rette ind til højre...
IE nægter stadig at acceptere:
s.class = 'objJSErrorMarker';
Hvis jeg sletter eller udkommenterer ovenstående linie, virker koden også i IE.
Har I nogen ide om hvad det er, som den er ked af?
Et lille tillægsspørgsmål, om man må være så fri - hvis man (utilsigtet!) udfører valideringen flere gange (valideringen foretages når man trykker på en knap) vil den indsætte flere og flere enslydende besked - er der nogen nem måde at stoppe den så den kun laver én?
F.eks. giver 2x tryk på valideringsknappen 2x fejlbeskeder på skærmen, osv. Kan man på nogen måde se om et objekt (getElementById...) indeholder noget allerede eller skal man gå ad andre veje?
Med det sagt - så tusind tak for hjælpen, det var ganske uvurderligt :-)
Ved at bruge sit objekt kunne man fantastisk nok kalde getElementsByTagName samt angive det tag man vil ha' antallet af og så bare hive length egenskaben ud :-)
function hideClientMessage(obj) { try { var target = document.getElementById(obj); target.removeChild(currClientMsgObj); } catch(e) { } }
function outputClientMessage(obj, message, state) { var s = document.createElement('span'); var img = document.createElement('img'); var text = document.createTextNode("Test: " + message); var target = document.getElementById(obj);
// prøv at fjern uanset hvad hideClientMessage(obj); currClientMsgObj = s;
target.appendChild(s); }
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.