Avatar billede clausjul Nybegynder
13. maj 2005 - 15:04 Der er 21 kommentarer og
1 løsning

Dynamiske onclik events

Jeg har to links:

<a href="http://www.bny.dk/cgi-bin/test.pl" onclick="return confirm('sikker?')">Link 1</a>

<a href="http://www.bny.dk/cgi-bin/test.pl">Link 2</a>

Og noget java script:

window.onload = function() {
for(m=0;m < document.getElementsByTagName('a').length;m++) {
    var event = document.getElementsByTagName('a')[m].onclick;
    if (event == null) {
        document.getElementsByTagName('a')[m].onclick = function() { wait(); }
    } else {
        document.getElementsByTagName('a')[m].onclick = new Function(getFuncBody(event) + ";if (true) { wait() }");
    }
    }
}

Jeg ønsker at køre wait() funktionen efter en bruger har klikket på linket. Det virker fint i link nr. 2. Men hvis der er en onclick="return Confirm('Sikker?')" i forvejen og jeg tilføjer den dynamisk med wait() funktionen, således at den kommer til at se ud: return Confirm('Sikker?');wait()

Men problemet er at når confirm returner noget, så køres wait ikke - hvorfor ??? Er der en workaround på det?
Avatar billede olebole Juniormester
13. maj 2005 - 16:06 #1
<ole>

Jeg forstår ikke, hvad du vil. Hvad skal wait-funktionen - og hvornår skal den køres?

/mvh
</bole>
Avatar billede clausjul Nybegynder
13. maj 2005 - 16:18 #2
Jeg vil gerne have at wait() kører efter return Confirm('Sikker?'). Det ser ud til at return Confirm('Sikker?') går "den anden vej" og ikke kører wait()
Avatar billede roenving Novice
13. maj 2005 - 16:23 #3
return betyder, at den nuværende funktion skal afbrydes, så du skal nok gøre det omvendt, når du udvider funktioner, men hvad gør wait() ?-)

    } else {
        document.getElementsByTagName('a')[m].onclick = new Function("if (true) { wait() }" + getFuncBody(event));
    }
Avatar billede clausjul Nybegynder
13. maj 2005 - 16:47 #4
wait() skal køre efter confirm() og ikke omvendt. Wait() laver en timeout, sådan, at når man submitter og hvis skærmbilledet ikke skifter efter 5 sekunder, så dukker der en "Please wait .." layer op.
Avatar billede olebole Juniormester
13. maj 2005 - 16:57 #5
Jeg er stadig ikke helt sikke på, hvad du vil - men kan det være noget i denne retning:

    } else {
        document.getElementsByTagName('a')[m].onclick = function() {
            if (confirm('Sikker?')) {
                wait();
                return true;
            } else {
                return false;
            }
        };
    }
Avatar billede clausjul Nybegynder
13. maj 2005 - 17:02 #6
Javascripten skal lægge en ekstra funktion i de eksisterende events, altså efter de funktioner i onclick-events. Og det skal ske helt automatisk, men det ser ud til at den return giver problemer...
Avatar billede roenving Novice
13. maj 2005 - 17:06 #7
Ja, som jeg skrev @16:23:17 afbryder en return, derfor må du ud i konstruktioner, som den, ole viser ...
Avatar billede olebole Juniormester
13. maj 2005 - 18:02 #8
Hvordan gik det, da du testede det, jeg skrev?
Avatar billede clausjul Nybegynder
13. maj 2005 - 19:15 #9
olebole > der skal ikke laves en kodestump, fordi jeg vil kun tildele onclick event til alle links dynamisk via javascript. Wait() funktion skal altid være sidst....
Avatar billede olebole Juniormester
13. maj 2005 - 19:49 #10
Nej, wait() skal ikke stå sidst ... det giver ingen mening. wait() skal stå først, hvis det skal virke.

Men sig mig lige: Spilder du bare vores tid? Har du slet ikke testet det, jeg skrev?
Avatar billede clausjul Nybegynder
13. maj 2005 - 19:53 #11
Nej, jeg tænker logisk: wait() er en funktion, som giver en meddelelse om at man skal være tålmodig efter 5 sekunder - hvis siten er langsom. Hvis jeg nu klikker på et link og wait() kører først, så vil meddelelsen dukke op efter 5 sekunder og det samme med confirm box - wait() skal først køre EFTER confirm er dukket op. Og den skal bruges til en standard program, som kan ikke bare kan pille i, så jeg prøver at få javascript til at lave de nødvendige wait() events.
Avatar billede olebole Juniormester
13. maj 2005 - 20:01 #12
Så må du zq klare dig selv!

Hvorfor spørger du, når du ikke vil lære? Hvorfor skal du diskutere med folk, der ved langt mere end dig selv - i stedet for at teste, hvad de skriver til dig?
Du har fat i de to bedste JavaScriptere på Eksperten, som begge fortæller dig, du tager fejl - og fortæller dig, hvad du skal gøre.

Du er tydeligvis ikke i stand til at overskue selv det mest basale JavaScript, så måske du skulle indtage en lidt mere realistisk holdning til dine egne evner og teste de løsninger, vi skriver til dig.
Avatar billede clausjul Nybegynder
13. maj 2005 - 20:14 #13
Jamen, jeg tænker bare på den teoriske plan. En onclick event som hedder wait();return confirm('Sikker?') betyder vel at wait() kører først. Min kode ligger andetsteds, så jeg kan først prøve efter på tirsdag. Og jeg er IKKE grøn til javascript. Men prøver at finde ud af, hvordan rækkefølgen skal opstilles. Håber det er OK at I to kan vente ....
Avatar billede olebole Juniormester
13. maj 2005 - 20:31 #14
Måske er du ikke grøn til JavaScript ... men i så fald vil jeg betragte dig som værende farveblind  :)

Ja, wait() vil præcis afvikle først. Du fortæller, det er en setTimeout, du sætter igang - og som tæller i baggrunden, mens de andre ting afvikles. Det gør en setTimeout altid i JavaScript - så det er lidt svært at få øje på, du skulle bygge din 'logik' på noget, der ligner JS-viden.

I øvrigt er det jo let nok at lave en lille test - uanset hvor dine filer ligger. Kan du skrive her, har du en browser og en NotePad, så deeeet .....

<script type="text/JavaScript">
function wait() {
    setTimeout("alert('Timeout')", 5000);
}
window.onload = function() {
    var aA = document.getElementsByTagName("a");
    for (i=0; i<aA.length; i++) {
        aA[i].onclick = function() {
            if (confirm('Sikker?')) {
                wait();
                return true;
            } else {
                return false;
            }
        }
    }
}
</script>

<a href="java script:alert('Linket går her')">TEST</a>
Avatar billede clausjul Nybegynder
13. maj 2005 - 20:45 #15
Ja, din kodestump er god nok. Men jeg står overfor en udfordring, som gør, at jeg skal sætte en wait() i alle onclick events som har tag A og INPUT - det kunne gøres, at hvis aA indeholder "return" (kan gøres ved RegExp.match funktionen?) og hvis den indeholder return, så skal din kodestump bruges - ellers laves den i normal rækkefølge. Har jeg fat i noget? :-)
Avatar billede olebole Juniormester
13. maj 2005 - 21:05 #16
Vi tester bare igen:

<script type="text/JavaScript">
function wait() {
    setTimeout("alert('Timeout')", 5000);
}
window.onload = function() {
    var aA = document.getElementsByTagName("a");
    for (i=0; i<aA.length; i++) {
        if (!aA[i].onclick || aA[i].onclick.toString().indexOf("return")==-1) continue;
        aA[i].onclick = function() {
            if (confirm('Sikker?')) {
                wait();
                return true;
            } else {
                return false;
            }
        }
    }
}
</script>

<a href="java script:alert('Linket går her')">TEST A</a><br>
<a href="java script:alert('Linket går her')" onclick="return noget">TEST B</a><br>
<a href="java script:alert('Linket går her')">TEST C</a>
Avatar billede olebole Juniormester
13. maj 2005 - 21:15 #17
Du kan også skrive noget à la:

<script type="text/JavaScript">
function wait() {
    setTimeout("alert('Timeout')", 5000);
}
function setHandlers(coll) {
    for (i=0; i<coll.length; i++) {
        if (!coll[i].onclick || coll[i].onclick.toString().indexOf("return")==-1) continue;
        coll[i].onclick = function() {
            if (confirm('Sikker?')) {
                wait();
                return true;
            } else {
                return false;
            }
        }
    }
}
window.onload = function() {
    var a = document.getElementsByTagName("a");
    setHandlers(a);
    a = document.getElementsByTagName("input");
    setHandlers(a);
}
</script>

<a href="java script:alert('Linket går her')">TEST A</a><br>
<a href="java script:alert('Linket går her')" onclick="return noget">TEST B</a><br>
<a href="java script:alert('Linket går her')">TEST C</a><br><br>

<input type="text"><br>
<input type="text" onclick="return nogetAndet"><br>
<input type="text"><br>

- hvis du skal sætte handlers på både inputs og links
Avatar billede clausjul Nybegynder
17. maj 2005 - 15:08 #18
Tak for indlæggene. Oleboles kode har givet mig inspiration til at gå videre. Det hele handler om at onclick event skal altid kalde wait() og problemet med return er løst. Jeg har desuden også lavet nogle undtagelser, så ventebeskeden ikke dukker op, når man klikker på et input text felt eller checkbox m.m. Koden kan ses nedenfor:

<script language="javascript">

window.onload = function() {
    setHandlers('a');
    setHandlers('input');   
}

function setHandlers(type) {

    var attribute = "";
    var typeExceptions = new Array('text','password','radio','checkbox');
    var exceptionFlag = false;
    var tagArray = document.getElementsByTagName(type);
    for(m=0;m < tagArray.length;m++) {
   
        // Exceptions for input fields - defined in typeExceptions
        if (type == 'input') {       
            attribute = tagArray[m].type.toString();
            if (tagArray[m].type != null) {
                for (i=0;i<typeExceptions.length;i++) {
                    if (Trim(attribute) == typeExceptions[i]) {
                        exceptionFlag = true;
                    }
                }
            }        
        }   
   
        if (exceptionFlag == false) {
            var event = tagArray[m].onclick;

            if (event == null) {
                tagArray[m].onclick = function() { wait(); }
            } else {
                if (tagArray[m].onclick.toString().indexOf("return") > -1) {
               
                    var funcstring = "function Evaluate_" + type + "() { " + getFuncBody(event) + " }";
                    funcstring += "evalValue = Evaluate_" + type + "();";
                    funcstring += "if (evalValue == true) {\n";
                    funcstring += "  wait();\n";
                    funcstring += "  return true;\n";
                    funcstring += "} else {\n";
                    funcstring += "  return false;\n";
                    funcstring += "}\n";
                    tagArray[m].onclick = new Function(funcstring);
                } else {
                    tagArray[m].onclick = new Function(getFuncBody(event) + ";wait()");
                }
            }
        }
    }
}

function Trim(str)
{
  return str.replace(/^\s*|\s*$/g,"");
}

function wait() {
    setTimeout("showbox()",2000);
}

function showbox() {
    document.getElementById("waitdiv").style.visibility = "visible";
}

function getFuncBody(funcPtr) {
    var str=funcPtr.toString();
    str=str.replace(/[^{]+{/,"");
    str=str.substring(0,str.length-1);
    return str;
}
</script>

Olebole: Er det godt nok? Nu skal du jo have point, så svar lige. :-)
Avatar billede olebole Juniormester
17. maj 2005 - 16:57 #19
Hehe ... det er okay - og det funker. Der er dog et par ting, jeg ville gøre lidt mere 'sexy', hvis det var mig, der skulle kode det  :)

Bl.a. ville jeg bruge et hash-table (et objekt, hvor alle properties værdier er sat til '1') i stedet for at bruge et array til dine exceptions ... det er langt hurtigere at søge i.
Dernæst ville jeg blot break'e loop'et, hvis/når en exception findes. Det er jo rigeligt til, at der ikke sættes handler på det pågældende element.

Så ender din 'setHandlers' op med at se sådan ud:

function setHandlers(type) {
    var attribute = "";
    var typeExceptions = {text:1, password:1, radio:1, checkbox:1 );
    var exceptionFlag = false;
    var tagArray = document.getElementsByTagName(type);
    for(m=0;m < tagArray.length;m++) {
        // Exceptions for input fields - defined in typeExceptions
        if (type == 'input') {       
            attribute = tagArray[m].type.toString();
            if (tagArray[m].type && typeExceptions[Trim(attribute)]) break;       
        }   
        var event = tagArray[m].onclick;
        if (event == null) {
            tagArray[m].onclick = function() { wait() };
        } else {
            if (tagArray[m].onclick.toString().indexOf("return") > -1) {
                var funcstring = "function Evaluate_" + type + "() { " + getFuncBody(event) + " }";
                funcstring += "evalValue = Evaluate_" + type + "();";
                funcstring += "if (evalValue == true) {\n";
                funcstring += "  wait();\n";
                funcstring += "  return true;\n";
                funcstring += "} else {\n";
                funcstring += "  return false;\n";
                funcstring += "}\n";
                tagArray[m].onclick = new Function(funcstring);
            } else {
                tagArray[m].onclick = new Function(getFuncBody(event) + ";wait()");
            }
        }
    }
}

- ellers synes jeg, det ser fint ud  :)
Avatar billede olebole Juniormester
17. maj 2005 - 17:01 #20
PS: nu ved jeg ikke, hvordan du har det med knapper. Jeg selv bruger altid <button></button> - og tildeler knappen den ønskede type. Andre bruger f.eks:
    <input type="submit" value="Jeg er en knap">

Hører du til den sidste kategori, kan det være, du skal udvide dit hash-table til:
  var typeExceptions = {text:1, password:1, radio:1, checkbox:1, submit:1, reset:1, button:1);
Avatar billede clausjul Nybegynder
12. juli 2005 - 13:54 #21
Glemte vist at give dig points ;)
Avatar billede olebole Juniormester
12. juli 2005 - 15:22 #22
Hehe ... bedre sent end aldrig ... tak  ;o)
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