Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JS] attachevent onkeyup volgorde

Pagina: 1
Acties:

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Hoi,

ik ben bezig een intranetapplicatie uit te breiden. Er zijn al vele pagina's code geschreven voor deze pagina. Qua verbetering heb ik een scriptje geschreven dat aan alle input velden een onKeyUp event attached dat controleert of het ingedrukte karakter wel een legaal karakter is (alphanumeriek). Echter, op sommige elementen staat al een onkeyup gedefinieerd via de attributen van het element.

Mijn probleem is dat deze reeds gedefinieerde onkeyup altijd EERST wordt uitgevoerd, en daarna pas mijn geattachte event. Heeft iemand enig idee hoe ik deze volgorde kan veranderen? Het attribuut onkeyup gaat dus voor het geattachte event...

Via de js-file doe ik dit voor alle elementen:
JavaScript:
1
2
3
loop objecten {
    obj.attachEvent('onkeyup', AllowCharset);
}


op de pagina staat bijvoorbeeld zo'n element:
HTML:
1
    <input type="text" onKeyUp="GoNextFieldIfLengthIs(this, 4);">


Ik heb geprobeerd in de code het volgende te doen, om dit op te lossen, maar dan geeft hij het verkeerde "this" element mee met GoNextFieldIfLengthIs.
JavaScript:
1
2
3
4
5
6
loop objecten {
   var temp = obj.onkeyup;
   obj.onkeyup = null;
   obj.attachEvent('onkeyup', AllowCharset);
   eval("obj.attachEvent('onkeyup', " + temp + ");";
}


hij voert dan wel de functie GoNextFieldIfLengthIs uit, maar het this object is blijkbaar een ander object... want this.value kent hij in de functie GoNextFieldIfLengthIs niet... terwijl deze functie prima werkt als ik hem op zichzelf laat werken....

heeft iemand enig idee of dit op te lossen is, of kan ik beter een smerige workaround gaan zoeken?

Verwijderd

Misschien dat je hier wat aan hebt.

edit:
@hieronder
dat artikel vertelt iets over de manier waarop bepaalde browsers de zaakjes regelt en voor zover ik het heb gelezen, kan je dit ook beinvloeden.

[ Voor 47% gewijzigd door Verwijderd op 29-11-2007 15:01 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Punt is dat je iets toevoegt en eigenlijk zet je dus je commando achter de punt-komma in je onkeyup :)

Je zou een poging kunnen doen door je functie uit te lezen en vervolgens beide weer in de juiste volgorde te attachen. Heb er zelf niet meegespeeld, dus wie weet werkt het niet :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • crisp
  • Registratie: Februari 2000
  • Laatst online: 14:39

crisp

Devver

Pixelated

sowieso is de volgorde van attached events niet per specificatie gedefinieerd, dus daar vanuit gaan is al een no-go (in IE's model is het trouwens last attached - first executed terwijl de meeste W3C DOM event implementaties het precies andersom doen :P).

In dit geval zou je denk ik gewoon de DOM1 onclick moeten 'herschrijven', iets als:
JavaScript:
1
2
3
4
5
6
7
8
9
if (obj.onkeyup)
  obj._onkeyup = obj.onkeyup;
obj.onkeyup = function()
{
  // andere functies, let op scope en afhandeling van event cancelling

  if (this._onkeyup)
    this._onkeyup();
}

[ Voor 4% gewijzigd door crisp op 29-11-2007 16:51 ]

Intentionally left blank


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
BtM909 schreef op donderdag 29 november 2007 @ 14:51:
Punt is dat je iets toevoegt en eigenlijk zet je dus je commando achter de punt-komma in je onkeyup :)

Je zou een poging kunnen doen door je functie uit te lezen en vervolgens beide weer in de juiste volgorde te attachen. Heb er zelf niet meegespeeld, dus wie weet werkt het niet :)
Dat probeerde ik inderdaad te bereiken met mijn onderste scriptje... maar helaas gaat het dan fout met "this". In de functie GoNextFieldIfLengthIs krijg ik dan de error dat hij this.value niet kent... :(
crisp schreef op donderdag 29 november 2007 @ 16:50:
sowieso is de volgorde van attached events niet per specificatie gedefinieerd, dus daar vanuit gaan is al een no-go (in IE's model is het trouwens last attached - first executed terwijl de meeste W3C DOM event implementaties het precies andersom doen :P).

In dit geval zou je denk ik gewoon de DOM1 onclick moeten 'herschrijven', iets als:
JavaScript:
1
2
3
4
5
6
7
8
9
if (obj.onkeyup)
  obj._onkeyup = obj.onkeyup;
obj.onkeyup = function()
{
  // andere functies, let op scope en afhandeling van event cancelling

  if (this._onkeyup)
    this._onkeyup();
}
ik ga daar eens mee spelen...
Verwijderd schreef op donderdag 29 november 2007 @ 14:47:
Misschien dat je hier wat aan hebt.

edit:
@hieronder
dat artikel vertelt iets over de manier waarop bepaalde browsers de zaakjes regelt en voor zover ik het heb gelezen, kan je dit ook beinvloeden.
dat artikel had ik ook gegoogled ja... maar helaas gaat dat meer over hierarchische elementen... nu is het geval dat ik op 1 element meerdere onkeyup acties heb.... beetje zoals: <input type="text" onkeyup="actie1(); actie2(); actie3();"> en dan wil ik er met een attachEvent ook nog eentje extra aanplakken....