Avatar billede mik789 Nybegynder
19. august 2004 - 18:38 Der er 5 kommentarer og
2 løsninger

event i Gecko

Jeg har en <div> med en onclick event der åbner en alert med nogle informationer. Men i samme div har jeg nogle links, og når man klikker på dem, skal alertboksen helst ikke åbne.

Et lignende sp. var oppe forleden, http://eksperten.dk/spm/529915, og jakoba havde denne løsning:

"Det der sker er at IE (og kun IE) sel sådan en event som en pil der går hele vejen igennem din side. Først rammer den din div og nedenunder din div ligger så body.

for at forhindre det skal du sætte event.chancelBubble til true i den eventhandeler der færdighåndterer hændelsen.

  [code]
  <body onclick="alert('1');">
  <div onclick="alert('2');if(event)event.cancelBubble=true;">link</div>
[/code]

grunden til 'if(event)' er at undgå at andre brovsere (der ikke laver et event objekt) kløjs i det."

Det mærkelige er at det faktisk også virker i min Firefox når det skrives som her i selve link tag'et - selv uden betingelsen [if(event)].

Men når jeg så prøver at lave det som en funktion for alle mine links sådan:

<script type="text/javascript">
function stopParentEvent(){
var links = document.getElementsByTagName('a');
for(i=0;i<links.length;i++)
links[i].onclick=function(){event.cancelBubble=true;};
}
window.onload=stopParentEvent;
</script>

- så virker det kun i IE, ikke i Firebird?

1) Hvordan får jeg funktionen til også at virke i Firebird?
2) Hvordan kan det være at det faktisk virker i Firefox når det skrives i tag'et - selv om det er en IE ting?
Avatar billede mik789 Nybegynder
19. august 2004 - 18:39 #1
Firebird == "Firefox"
Avatar billede skovenborg Nybegynder
19. august 2004 - 23:14 #2
prøv:
function stopParentEvent(e){
if (!e) {e = this.event;}
var links = document.getElementsByTagName('a');
for(i=0;i<links.length;i++)
links[i].onclick=function(){e.cancelBubble=true;};
}
window.onload=stopParentEvent;

kan ikke lige helt huske om det er this.event eller bare event. Men pointen er at window.onload automatisk smider et event-object med som første argument (i gecko-browsere).

Som du forresten kan se af:
http://www.mozilla.org/docs/dom/domref/dom_event_ref.html#998197
så er cancelBubble med i (i hver fald nyere versioner af) gecko-browserne.
Avatar billede mik789 Nybegynder
20. august 2004 - 00:20 #3
ja, du har ret, cancelBubble er også understøttet med Mozilla DOM. Men din kode virker alligevel ikke i Mozilla, selv om den heller ikke giver nogle fejl. Jeg har prøvet med både event og this.event.

Til gengæld fandt jeg en metode der dur i Mozilla her: http://www.mozilla.org/docs/dom/domref/examples.html#998748, og ved at kombinere de to scripts får jeg dette, som faktisk dur uden fejl i begge browsere, selv om det sikkert kan gøres mere elegant end denne gryderet:

<script type="text/javascript">
function stopParentEvent(){
  if(document.all){ // MS DHTML, IE
  var links = document.getElementsByTagName('a');
  for(i=0;i<links.length;i++)
  links[i].onclick=function(){event.cancelBubble=true;};
  }else{ // Gecko DOM, Mozilla
  function stopProp(e){
    e.stopPropagation();
  }
  var links = document.getElementsByTagName('a');
  for(i=0;i<links.length;i++) links[i].addEventListener("click", stopProp, false);
  }
}
window.onload=stopParentEvent;
</script>

Har nogle en bedre løsning?
Avatar billede mik789 Nybegynder
20. august 2004 - 01:28 #4
og let trimmet:

function stopParentEvent(){
var links = document.getElementsByTagName('a');
  for(i=0;i<links.length;i++){
    if(document.all){
      links[i].onclick=function(){event.cancelBubble=true;};
    }else{
      function stopProp(e){
        e.stopPropagation();
      }
      links[i].addEventListener("click", stopProp);
    }
  }
}
window.onload=stopParentEvent;

Og her vedr. metoden addEventListener() - http://www.mozilla.org/docs/dom/domref/dom_el_ref31.html#1028304
Avatar billede mik789 Nybegynder
20. august 2004 - 11:52 #5
her sker ikke rigtig noget, så jeg lukker.
skovenborg> tak for input. vil du ha lidt af pointene?
Avatar billede skovenborg Nybegynder
20. august 2004 - 14:34 #6
undskyld jeg ikke lige fik svaret tilbage - var gået i seng på det tidspunkt ;-)

Men din løsning ser meget fin ud - jeg var også lidt i tvivl om hvad du ville.

if (!e) {e = this.event;} var egentlig også til IE og ikke Mozilla - kunne bare ikke huske hvordan det var (og sad inde i Linux da jeg skrev det - så jeg kunne ikke lige teste).

Jeg smider lige et svar så kan vi jo dele eller hvad du nu synes er rimeligt ;-)
Avatar billede mik789 Nybegynder
20. august 2004 - 15:01 #7
helt fint!
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