Avatar billede sithlord Nybegynder
19. juli 2008 - 00:33 Der er 9 kommentarer

IE vil have det anderledes

Hey

Jeg er lige begyndt at rode med noget JS, og er selvfølgelig stødt ind i utallige problemer med browser kompatibilitet. Dette problem har jeg dog ikke været i stand til at løse; sandsynligvis fordi jeg ikke rigtig ved noget om hvordan browserne læser/burde læse koden. Det meste er fundet på nettet og derefter har jeg modificeret det en smule. Ideen er at man skal kunne tilføje ekstra form-felter samtidig med at den clearer deres value ved onFocus samt geninsætter værdien hvis feltet efterlades blankt.

Hele koden ser således ud:
<script type="text/javascript">

var counter = 0;

function init() {
    document.getElementById('moreFields').onclick = moreFields;
    moreFields();

}

function addEventHandlers() {
    var formInputs = document.getElementsByTagName('input');
    for (var i = 0; i < formInputs.length; i++) {
        var theInput = formInputs[i];
       
        if (theInput.type == 'text' && theInput.className.match(/\bcleardefault\b/)) { 
            /* Add event handlers */         
            addEvent(theInput, 'focus', clearDefaultText, false);
            addEvent(theInput, 'blur', replaceDefaultText, false);
           
            /* Save the default value */
            if (theInput.value != '') {
                theInput.defaultText = theInput.defaultValue;
            }
        }
    }
}

function clearDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
   
    if (target.value == target.defaultText) {
        target.value = '';
    }
}

function replaceDefaultText(e) {
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if (!target) return;
   
    if (target.value == '' && target.defaultText) {
        target.value = target.defaultText;
    }
}

function addEvent(element, eventType, lamdaFunction, useCapture) {
    if (element.addEventListener) {
        element.addEventListener(eventType, lamdaFunction, useCapture);
        return true;
    } else if (element.attachEvent) {
        var r = element.attachEvent('on' + eventType, lamdaFunction);
        return r;
    } else {
        return false;
    }
}

function moreFields() {
    counter++;
    var newFields = document.getElementById('readroot').cloneNode(true);
    newFields.id = '';
    newFields.style.display = 'block';
    var newField = newFields.childNodes;
    for (var i=0;i<newField.length;i++) {
        var theName = newField[i].name
        if (theName)
            newField[i].name = theName + counter;
    }
    var insertHere = document.getElementById('writeroot');

    insertHere.parentNode.insertBefore(newFields,insertHere);
    addEventHandlers();
}

window.onload = init;

</script>

</head>

<body>
<div id="readroot" style="display: none; width: 150px; float:left;">

    <input type="image" src="images/delete.jpg" value="Remove review"
        onclick="this.parentNode.parentNode.removeChild(this.parentNode);" class="inputRemove" />

    <select name="ugedag" style="float:left;">
        <option>Vælg dag</option>
        <option value="mandag">Mandag</option>
        <option value="tirsdag">Tirsdag</option>
        <option value="onsdag">Onsdag</option>
        <option value="torsdag">Torsdag</option>
        <option value="fredag">Fredag</option>
        <option value="lørdag">Lørdag</option>
        <option value="Søndag">Søndag</option>
    </select><br /><br />

    <input type="text" id="start_tid" name="start_tid" value="Start tid" style="color:#999999" class="cleardefault" /><br />
    <input type="text" id="slut_tid" name="slut_tid" value="Slut tid" style="color:#999999" class="cleardefault" /><br />
    <input type="text" value="Hej" class="cleardefault" />



</div>

<form method="post" name="form1" action="index.php?submitted=1">

   

    <input type="button" id="moreFields" value="Tilføj dag" />
    <input type="submit" value="Send form" /><br /><br />

   
    <span id="writeroot"></span>

</form>

Det hele fungerer fint nok i Firefox, Opera og Safari som jeg har testet det på, men IE clearer ikke felternes value. Hvis jeg derimod kører addEventHandler() funktionen i starten af moreFields() funktionen i stedet for i slutningen som det står i ovenstående virker det i IE, men hverken i FF, Opera eller Safari...

Håber i forstår hvad jeg mener. Har prøvet at søge på nettet, men kunne ikke lige komme på de rigtige søgeord uden at skrive en halv stil :P

På forhånd tak
Avatar billede idiotbarn Nybegynder
19. juli 2008 - 15:05 #1
Hej
Din target.defaultText er tom i IE (alert box kan være go at debugge med )
Da default teksten er ens i alle tilfældene, når jeg har lavet noget ligende har jeg haft en funktion a la:
function clearText(obj, text)
{
if(obj.value==text)
obj.value="";
...
}

Det giver ikke helt den samme mulighed for genbrug, men den må du lige veje op mod hvad det skal bruges til
Avatar billede sithlord Nybegynder
19. juli 2008 - 15:14 #2
Den simple version startede jeg også med at lave i starten, men det kom aldrig til at fungere rigtigt. Den her fungerede derimod fint indtil jeg prøvede at flette de to funktioner, til at cleare teksten og tilføje "form-input", sammen... Og det er ikke kun det at defaultText er tom i IE, den reagerer slet ikke ved fokus i input felterne...

Hvis jeg derimod kører addEventHandlers() i begyndelsen af moreFields() funktionen fungerer IE jo helt fint... den både clearer og geninsætter... og jeg forstår ærlig talt ikke hvorfor det lige er sådan...
Avatar billede idiotbarn Nybegynder
19. juli 2008 - 15:16 #3
snakker vi foresten IE6 eller IE7?
Avatar billede sithlord Nybegynder
19. juli 2008 - 15:19 #4
IE7... tør slet ikke prøve i IE6 endnu :O
Avatar billede idiotbarn Nybegynder
19. juli 2008 - 15:46 #5
Jeg tror det er tricket med at klone en masse controls der måske ikke er helt go. Så vidt jeg lige kan se kører du samtlige inputs (på hele siden) igennem hver gang du tilføjer en blok, og tilskriver en eventhandler til alle sammen...

En pænere metode er at tilføje objekter via DOM træet. Jeg har lavet et eksempel herunder, som virker i FF og IE. Jeg ved dog ikke hvor pænt det er at bruge attributter der ikke er standard...

<head>
    <title>Untitled Page</title>
    <script>
        function AddField()
        {
            var defText = "asw";
            var txt  = document.createElement("input");
            txt.setAttribute("type","text");
            txt.setAttribute("value",defText);
            txt.defaultText = defText;
           
            addEvent(txt, 'focus', clearDefaultText, false);
            addEvent(txt, 'blur', replaceDefaultText, false);
           
            document.getElementById("container").appendChild(txt);
        }
        function clearDefaultText(e) {

            var target = window.event ? window.event.srcElement : e ? e.target : null;

            if (!target) return;
       
            if (target.value == target.defaultText) {
                target.value = '';
            }
        }

        function replaceDefaultText(e) {
            var target = window.event ? window.event.srcElement : e ? e.target : null;
            if (!target) return;
         
            if (target.value == '' && target.defaultText) {
                target.value = target.defaultText;
            }
        }
       
        function addEvent(element, eventType, lamdaFunction, useCapture) {
            if (element.addEventListener) {
                element.addEventListener(eventType, lamdaFunction, useCapture);
                return true;
            } else if (element.attachEvent) {
                var r = element.attachEvent('on' + eventType, lamdaFunction);
                return r;
            } else {
                return false;
            }
        }
       
 
    </script>
</head>
<body>
    <input type="button" value="add" onclick="AddField()"/>
    <div id="container"></div>
</body>
</html>
Avatar billede sithlord Nybegynder
19. juli 2008 - 17:35 #6
Nej den kører kun de to inputs der er i "readroot" igennem... det er fordi den ikke blot skal tilføje et enkelt felt, men en blok af felter.. Er taget herfra: http://www.quirksmode.org/dom/domform.html

det duer ikke til formålet bare at tilføje et enkelt felt desværre...
Avatar billede idiotbarn Nybegynder
19. juli 2008 - 19:45 #7
der skulle jo så laves om i koden så den tilføjede de samme felter som før...
Det er ihvertfald en mulighed, ser lige om jeg får tid til at kigge på eksemplet. quirksmode.org plejer ihvertfald at være en rigtig go kilde...
Avatar billede olebole Juniormester
20. juli 2008 - 21:59 #8
<ole>

quirksmode.org laver nu bunker af fejl - og scriptet, der linkes til, er da også et udmærket eksempel. Hvis man ønsker at bruge HTML-DOM, kan det kun ske, hvis man også bruger HTML som markup. Forfatteren bruger HTML-DOM sammen med XHTML-markup, og det er et absolut no-go. Han burde naturligvis have brugt XML-DOM, hvis koden skal give mening  ;o)

sithlord >> Jeg er lidt i tvivl om, hvad det er, du præcist ønsker at lave. Prøv at elaborere lidt  =)

/mvh
</bole>
Avatar billede sithlord Nybegynder
20. juli 2008 - 22:47 #9
Det er prøver på at lave er et system hvor man kan tilføje det ønskede antal inputs i en form, men de skal tilføjes i blokke ligesom på quirksmode... Og så ville jeg godt have den funktion at den clearede inputsnes værdier ved fokus på inputtet. Men den skal sætte værdien ind igen hvis feltet bliver efterladt tomt...

Håber i forstår det bedre... ved ikke rigtig noget om JS da jeg først begyndte at lege med det for 3 dage siden, men kan ikke forestille mig at det ikke er muligt at kombinere de to funktioner på en måde...

Mange tak fordi i gider hjælpe :D
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester