Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 15:15 Der er 39 kommentarer og
1 løsning

Problem i IE: Angive en event på et element via JS

Hej js-nørder! :P

Jeg er løbet ind i et problem. Følgende kode illustrerer mit problem:
var temp = document.createElement('div');
temp.appendChild(document.createTextNode('tester'));
temp.setAttribute('onmousedown', 'alert(\'vi tester\');');
document.body.appendChild(temp);

... når man trykker på tester-div'en i Ildræven kommer der en alert - det gør der ikke i IE.

Hvordan angiver man en onmousedown via JS's DOM, så det virker i Internet Explorer?

... Tak :)
Avatar billede olebole Juniormester
24. maj 2006 - 15:23 #1
<ole>

Du bruger attachEvent:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/attachevent.asp

Mener du virkelig, den kode virker i FF? OMG ... er der da overhovedet ingen grænser for dens DOM-fejl?  =8-O

Det må absolut ikke virke. I FF skal du bruge metoden addEventListener:
    http://developer.mozilla.org/en/docs/DOM:element.addEventListener

/mvh
</bole>
Avatar billede olebole Juniormester
24. maj 2006 - 15:26 #2
Du bør også bruge:
    document.getElementsByTagName("body")[0].appendChild(temp)

- hvis du gerne vil øve dig på at skrive DOM, der kan anvendes under XHTML, når det engang med tiden kan bruges på WWW  :)
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 15:27 #3
Tak for dit svar.

Med andre ord skal jeg opdele koden efter hvilken browser brugeren bruger? Hvad anbefaler W3C man gør?
Avatar billede olebole Juniormester
24. maj 2006 - 15:34 #4
W3C har fastlagt addEventListener som metoden at anvende
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 15:38 #5
... okay jeg antager at svaret er ja til mit første spørgsmål (15:27:06).

Smid et svar :) og mange tak for hjælpen.

Lige et tillægsspørgsmål: Hvordan eller hvor kan jeg til en anden gang se om en given DOM-operation er "lovlig"?
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 15:43 #6
Fandt lige en lækker funktion jeg tænkte jeg lige ville dele hvis andre skulle støde på samme problem som jeg :)

function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.attachEvent) {
        var r = elm.attachEvent('on' + evType, fn);
        return r;
    }
    else {
        elm['on' + evType] = fn;
    }
}
Avatar billede olebole Juniormester
24. maj 2006 - 15:49 #7
Da ingen af de store browsere har implementeret ægte XHTML, men falder tilbage på HTML, når der opstår en fejl, er der ikke idag nogen mulighed for at udvikle seriøse XHTML-applikationer, der kan bruges under XHTML. Det er du nødt til at gøre 'i blinde' - udfra viden du må læse dig til  :o|

FF's implementation er rent ud elendig - da den bygger på deres i forvejen dårlige HTML/DOM-implementering ... og MS har besluttet ikke at understøtte ægte XHTML, før de er færdige med en helt ny version, der intet har med MSHTML at gøre. Derfor kommer IE7.0 heller ikke til at understøtte XHTML.

Hvis du skriver XHTML idag, får du bare tillagt dig en bunke dårlige kodevaner, som du tror er XHTML - men som bare vil vælte browseren med en XML-fejl, når vi engang kommer dertil  ;o)

HTML4.01-Strict er mit bedste bud på et fornuftigt standard-valg i skrivende stund.
Avatar billede softspot Forsker
24. maj 2006 - 15:51 #8
Se, det er god stil! Du finder selv noget kode efter du har fået svar - og deler det med os andre - lækkert! Dig skulle vi have nogle flere af her på eksperten :D
Avatar billede olebole Juniormester
24. maj 2006 - 15:55 #9
spoton, om jeg så må sige  ;D

Denne side, peger også mod mange gode sider:
    http://developer.mozilla.org/en/docs/Migrate_apps_from_Internet_Explorer_to_Mozilla
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 15:59 #10
Jes jeg kører også HTML4.01, men derfor bør jeg vel alligevel sørge for at skrive fremtidssikret DOM-Javascript (ved fx at undgå at bruge setAttribute('onmouseover')).

En helt anden ting - kan man ikke kan anvende funktioner med parametre på events? Fx virker dette her ikke
elm.addEventListener(elm, 'alert(\'hej\');');

Jeg er vant til at bruge document.onmousemove - og der kan man heller ikke bruge parametrer på den måde.

Men det kan man måske bare ikke i forbindelse med events? Egentlig forstår jeg jo godt hvorfor, eftersom
document.onmousemove = badabing(par1, par2);

... vil resultere i at onmousemove bliver sat lig med det badabing returnerer, hvilket jo ikke er den umiddelbare mening med at opsætte events.

Har jeg ret eller overser jeg noget? :)
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 16:02 #11
Ups, fejl i min 4. linje i 15:59:11 -der skulle naturligvis stå fx:
elm.addEventListener('click', 'alert(\'hej\');');
Avatar billede softspot Forsker
24. maj 2006 - 16:03 #12
Ja, hvis du skal tildele en funktion til et event kan du gøre således:

document.onmousemove = function(par1, par2) { ... };

om man kan gøre det samme med addEventListener ved jeg ikke lige - ole ved det nok :)
Avatar billede olebole Juniormester
24. maj 2006 - 16:08 #13
elm.addEventListener('click', function(varA){alert(varA)});
Avatar billede olebole Juniormester
24. maj 2006 - 16:10 #14
- men det kommer jo anpå, hvad du mener med parametre. Er der et specifikt tilfælde, du tænker på?
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 16:11 #15
Tak begge to :-)

Smid et svar olebole.
Avatar billede olebole Juniormester
24. maj 2006 - 16:12 #16
- gerne  :)

Jeg synes i øvrigt aldrig, du mailede tilbage. Gik projektet i stå?  :)
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 16:16 #17
... nu kan jeg ikke erindre at have modtaget en mail fra dig olebole, så jeg antager beskeden ikke var til mig :-)
Avatar billede olebole Juniormester
24. maj 2006 - 16:26 #18
sorry ... en anden Rasmus  :D

Tak for points  ;o)
Avatar billede razmuz_dk Nybegynder
24. maj 2006 - 16:33 #19
... nå jeg bliver nødt til lige at lege Spørgejørgen - for her kommer endnu et spørgsmål:

Funktionen der skal køres ved onmousedown skal i sin nuværende tilstand have to parametre. Jeg har hidtil brugt følgende kode til at tilføje onmousedown'en:
temp.firstChild.setAttribute('onmousedown', 'return drag.activate(' + playerRef + ');');

Det er i forbindelse med et drag'n drop interface.

Kan dette oversættes til den "rigtige" metode (addEventListener/attachEvent)? Eller skal jeg lave nogle rokeringer i koden sådan at funktionen kan kaldes uden parametre (umiddelbart virker det mere bøvlet synes jeg...)
Avatar billede olebole Juniormester
24. maj 2006 - 16:41 #20
Jeg forstår ikke årsagen til 'return', men ville mene, du skulle skrive:

  temp.firstChild.attachEvent('mousedown', function(){drag.activate(playerRef)});
- og:

  temp.firstChild.addEventListener('onmousedown', function(){drag.activate(playerRef)}, false);
Avatar billede razmuz_dk Nybegynder
25. maj 2006 - 12:18 #21
Meningen med "return" er, at man ikke skal kunne markere noget tekst mens man trækker et element (det er fra et drag'n drop-script). Giver det ikke mening? :)
Avatar billede razmuz_dk Nybegynder
25. maj 2006 - 12:20 #22
... Altså fx vil man ikke kunne markere denne tekst
<div onmousedown="return false;">bongo</div>

Men hvordan opnår jeg det, at man ikke må kunne markere, med attachEvent/addEventListener?
Avatar billede razmuz_dk Nybegynder
29. maj 2006 - 13:52 #23
... kan du hjælpe mig med det sidstnævnte problem Olebole?
Avatar billede softspot Forsker
29. maj 2006 - 14:01 #24
temp.firstChild.attachEvent('mousedown', function(){drag.activate(playerRef); return false; });
Avatar billede razmuz_dk Nybegynder
29. maj 2006 - 14:24 #25
Jeg takker :)
Avatar billede softspot Forsker
29. maj 2006 - 14:26 #26
velbekomme :)
Avatar billede razmuz_dk Nybegynder
29. maj 2006 - 14:49 #27
Øhm, jeg kan altså ik' få det til at virke :( Prøv at køre dette "test-script":
<script type="text/javascript">
    function addEvent(elm, evType, fn, useCapture) {
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        }
        else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            return r;
        }
        else {
            elm['on' + evType] = fn;
        }
    }
    function test() {
        return false;
    }
    var temp = document.createElement('div');
    temp.appendChild(document.createTextNode('Denne kan man godt markere'));
    addEvent(temp, 'mousedown', function(){ return false; });
    document.body.appendChild(temp);
    document.onselectstart = function() { return false; };
</script>
<div onmousedown="return false;">Denne kan man ikke markere</div>

I IE har jeg disabled markering totalt via onselectstart - men i Firefox kan man godt markere den øverste div :( Any bright ideas?
Avatar billede razmuz_dk Nybegynder
01. juni 2006 - 09:41 #28
Jeg har stadig ikke fundet en fungerende løsning :/ Hjælp mig inden jeg begynder at bruge innerHTML :P

Måske man bare sku oprette et nyt spørgsmål... (spørgsmålet 29/05-2006 14:49:24 er jo klart forskellig fra det oprindelige i denne "tråd")
Avatar billede softspot Forsker
01. juni 2006 - 09:54 #29
Prøv lige at smide din initialiseringskode ind i window.onload-eventet som vist herunder:

<script type="text/javascript">
    function addEvent(elm, evType, fn, useCapture) {
        if (elm.addEventListener) {
            elm.addEventListener(evType, fn, useCapture);
            return true;
        }
        else if (elm.attachEvent) {
            var r = elm.attachEvent('on' + evType, fn);
            return r;
        }
        else {
            elm['on' + evType] = fn;
        }
    }
    function test() {
        return false;
    }

    window.onload = function() {
        var temp = document.createElement('div');
        temp.appendChild(document.createTextNode('Denne kan man godt markere'));
        addEvent(temp, 'mousedown', function(){ return false; });
        document.body.appendChild(temp);
    }

    document.onselectstart = function() { return false; };
</script>
<div onmousedown="return false;">Denne kan man ikke markere</div>
Avatar billede razmuz_dk Nybegynder
01. juni 2006 - 10:38 #30
Tak for svaret, men det ser heller ikke ud til at virke :/

Se evt. her: http://shokk.dk/over.php
Avatar billede softspot Forsker
01. juni 2006 - 10:50 #31
OK, så prøv denne version:

<html>
<head>
  <script type="text/javascript">
    function addEvent(elm, evType, fn, useCapture) {
      if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
      }
      else if (elm.attachEvent) {
        var r = elm.attachEvent('on' + evType, fn);
        return r;
      }
      else {
        elm['on' + evType] = fn;
      }
    }
    function test() {
      return false;
    }
    window.onload = function() {
      var temp = document.createElement('div');
      temp.appendChild(document.createTextNode('Denne kan man godt markere'));
      addEvent(temp, 'mousedown', function(){ return true; });
      addEvent(temp, 'selectstart', function(){ event.cancelBubble = true; return true; });
      document.body.appendChild(temp);
    }
    document.onselectstart = function() { return false; };
  </script>
</head>
<body>
  <div onmousedown="return false;">Denne kan man ikke markere</div>
</body>
</html>
Avatar billede razmuz_dk Nybegynder
02. juni 2006 - 10:17 #32
Virker desværre stadig ikke i FF -> http://shokk.dk/over.php :/

Man kan stadig markere teksten i den "javascript-skabte" div. Uuuunderligt.
Avatar billede razmuz_dk Nybegynder
07. juni 2006 - 14:44 #33
På tide jeg giver op eller...? :)
Avatar billede softspot Forsker
07. juni 2006 - 14:48 #34
Jeg gik ud fra at du ville have det sådan som teksten i laget beskrev, nemlig at den første (øverste) ikke kunne markeres og den sidste (nederste og genererede) kunne markeres - det fungerer i det mindste i både min FF 1.0 og IE 6.0

Kan du kort summere op hvad det er for en funktionalitet du ønsker...?
Avatar billede razmuz_dk Nybegynder
07. juni 2006 - 15:07 #35
Arh okay, ja det er måske lidt dumt skrevet.

Well, når man trykker på den div der bliver oprettet dynamisk af Javascript, må man ikke kunne trække og markere. Men det kan man i dit eksempel.
Avatar billede softspot Forsker
07. juni 2006 - 15:38 #36
Ja, det vil jeg mene er pga. denne linie:

  addEvent(temp, 'selectstart', function(){ event.cancelBubble = true; return true; });

umiddelbart ville jeg jo bare forvente at du skulle fjerne denne linie i den dynamiske/javascript-styrede oprettelse af div-elementet, da det linien gør er at sætte et event som undlader at udføre nogle af de indeholdende elementers selectstart-events (cancelBubble = true forhindrer dette).

Altså:

    window.onload = function() {
      var temp = document.createElement('div');
      temp.appendChild(document.createTextNode('Denne kan man godt markere'));
      addEvent(temp, 'mousedown', function(){ return true; });
      document.body.appendChild(temp);
    }
Avatar billede razmuz_dk Nybegynder
07. juni 2006 - 15:49 #37
Jeg prøvede lige at udkommentere den linje du omtaler. Det hjalp intet.
Du kan se siden her:
http://shokk.dk/over.php
Man kan stadig markere den dynamisk-genererede div :(

Jeg forsøgte med dette:
temp.onmousedown = function() { return false; };

Det virker faktisk i Firefox. Men det er garanteret ikke en del af DOM-standarden??
Avatar billede softspot Forsker
07. juni 2006 - 15:54 #38
Hvorfor ændrer du så ikke bare linien:

    addEvent(temp, 'mousedown', function(){ return true; });

til:

    addEvent(temp, 'mousedown', function(){ return false; });
Avatar billede razmuz_dk Nybegynder
07. juni 2006 - 15:57 #39
... har jeg prøvet - virker ikke. Se opdateret version på:
http://shokk.dk/over.php
Avatar billede softspot Forsker
07. juni 2006 - 16:12 #40
Ja, der er altså noget ved den der DOM som jeg ikke forstår (faktisk er der en del, men lad nu det ligge :))... såvidt jeg kan se, er det kode du får til at fungere og det jeg foreslår (som altså ikke fungerer) nøjagtigt det samme, men det synes addEvent så åbenbart ikke... :(

Spørgsmålet er om du skal skal ud i noget med preventDefault() (FF/NS osv) og returnValue = false (IE) for at forhindre mousedown i at udføres...

addEvent(temp, 'mousedown', function(e){ e = e ? e : event; if(e.preventDefault) e.preventDefault(); else if(e.returnValue) e.returnValue = false; else return false; });

jeg er usikker på om det spiller, men det burde være noget i den retning...
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