Archief - Force event

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

blackrabbit

Legacy Member
Hi,

zit nu al een half uurtje te googlen maar vind geen oplossing voor mijn probleem.
Op zich is het vrij simpel:

- gegeven een input-field (met ID "some_field") in een gegeven form. Aan dit input-veld is een onKeyUp-event gekoppeld
- elders op deze pagina wordt het bovenstaande input-veld leeggemaakt (object.value='')
Probleem: de onKeyUp-event van dat input-veld wordt niet getriggered. Hoe kan ik dit event forcen?
Was de methode handleEvent() tegengekomen, maar in de bug-console van FF verschijnt dat FF deze methode niet kent (deprecated, of gebruik ik ze fout?)

n00bslayer

Legacy Member
Je hebt bij de meeste scripts het onchange event van doen en slecht in zeldzame gevallen heb je het onkeyup event nodig (bvb om de wachtwoordsterkte te berekenen of een eigen auto-aanvulscript te schrijven), let wel dat dit event niet altijd even goed werkt met checkboxen en radioboxen in IE.

onchange triggert op een input van het type text wanneer er geen focus meer op zit en de input veranderd is sinds de gebruiker er het laatst op gefocust heeft.

Edit: Als je geen event aan je input veld kan koppelen, gebruik je het best een cross browser scriptje om dit alsnog te doen. Ik gebruik hiervoor het volgende stukje code:
Code:
var Event = {
	add:function(obj,evt,fn) {
		if (obj.addEventListener)
			obj.addEventListener(evt,fn,false);
		else if(obj.attachEvent)
			obj.attachEvent('on'+evt,fn);},
	remove:function(obj,evt,fn) {
		if (obj.removeEventListener)
			obj.removeEventListener(evt,fn,false);
		else if(obj.detachEvent)
			obj.detachEvent('on'+evt,fn);},
	cancel:function(e){
		e=e?e:window.event;
		if(e.stopPropagation)
			e.stopPropagation();
		if(e.preventDefault)
			e.preventDefault();
		e.cancelBubble = true;
		e.cancel = true;
		e.returnValue = false;
		return false;}}
te gebruiken als volgt:
Code:
Event.add(document.getElementById('some_field'),'change',functie);

blackrabbit

Legacy Member
De reden waarom ik onKeyUp gebruik, is omdat bij elke toetsenslag een aantal 'suggesties' worden opgevraagd (~AJAX) die verschijnen in een gegeven DIV.

onChange is geen optie omdat, zoals je zelf al aanhaalt, die enkel getriggered wordt nadat de focus wordt verwijderd en de inhoud gewijzigd is.

Anyway, ik heb het iets anders aangepakt en m'n probleem eigenlijk omzeilt, waardoor ik die event-forcer niet meer nodig heb momenteel.

Maar als zoiets zou bestaan, zou het wel handig zijn moest het hier alsnog toegelicht worden :)

In ieder geval bedankt voor de hulp.

n00bslayer

Legacy Member
blackrabbit zei:
De reden waarom ik onKeyUp gebruik, is omdat bij elke toetsenslag een aantal 'suggesties' worden opgevraagd (~AJAX) die verschijnen in een gegeven DIV.

onChange is geen optie omdat, zoals je zelf al aanhaalt, die enkel getriggered wordt nadat de focus wordt verwijderd en de inhoud gewijzigd is.

Anyway, ik heb het iets anders aangepakt en m'n probleem eigenlijk omzeilt, waardoor ik die event-forcer niet meer nodig heb momenteel.

Maar als zoiets zou bestaan, zou het wel handig zijn moest het hier alsnog toegelicht worden :)

In ieder geval bedankt voor de hulp.
In dat geval zal je beter moeten toelichten wat je bedoelt met het "forcen" van een event. Wat je precies wil bereiken bvb.

Je hebt een event listener toegevoegd aan je input veld, en je leegt de inhoud ervan. En wat dan?

blackrabbit

Legacy Member
Mmmh, heb het niet echt meer nodig, maar omdat het voor anderen misschien handig kan zijn:
HTML:
<form ..>
<input type="text" ID="my1" onKeyUp="getSuggestions(this.value);doSomethingElse();">
..
</form>
...
<img src=".." alt="" title="" onClick="FORCE_EVENT(getElementById('my1').onKeyUp);">
Snel relevante code uit het hoofd getypt, is zowat het hele opzet. Niet 100% hetzelfde, maar het idee blijft wel.
- my1 zoekt bij elke keyUp naar nieuwe suggesties (afhankelijk van value-veld)
- bij het klikken op die img, zou de onKeyUp-event van my1 getriggered moeten worden

Wanneer my1 leeg wordt gemaakt (met backspace dus), minimaliseert de div waar de suggesties in verschijnen. Had in de onClick van die img eerst hetvolgende geschreven:
Code:
getElementById('my1').value='';
Die wijzigde de value inderdaad naar [niets], maar de suggestie-div verdween niet (wegens ontbreken van onKeyUp-event).
Vandaar dus mijn vraag.

Vermits er methodes als my1.focus() bestaan (voor onFocus-events), dacht ik dat er wel een soortgelijke functie voor onKeyUp zou bestaan. Kon die echter niet vinden, dus vandaar mijn vraag.

Maar zoals gezegd: heb het wat anders opgelost & werkt evengoed.

n00bslayer

Legacy Member
blackrabbit zei:
Mmmh, heb het niet echt meer nodig, maar omdat het voor anderen misschien handig kan zijn:
HTML:
<form ..>
<input type="text" ID="my1" onKeyUp="getSuggestions(this.value);doSomethingElse();">
..
</form>
...
<img src=".." alt="" title="" onClick="FORCE_EVENT(getElementById('my1').onKeyUp);">
Snel relevante code uit het hoofd getypt, is zowat het hele opzet. Niet 100% hetzelfde, maar het idee blijft wel.
- my1 zoekt bij elke keyUp naar nieuwe suggesties (afhankelijk van value-veld)
- bij het klikken op die img, zou de onKeyUp-event van my1 getriggered moeten worden

Wanneer my1 leeg wordt gemaakt (met backspace dus), minimaliseert de div waar de suggesties in verschijnen. Had in de onClick van die img eerst hetvolgende geschreven:
Code:
getElementById('my1').value='';
Die wijzigde de value inderdaad naar [niets], maar de suggestie-div verdween niet (wegens ontbreken van onKeyUp-event).
Vandaar dus mijn vraag.

Vermits er methodes als my1.focus() bestaan (voor onFocus-events), dacht ik dat er wel een soortgelijke functie voor onKeyUp zou bestaan. Kon die echter niet vinden, dus vandaar mijn vraag.

Maar zoals gezegd: heb het wat anders opgelost & werkt evengoed.
Je kan de functie die achter het event zit eventueel uitvoeren buiten het event om, maar er bestaat geen gelijkaardige functie voor onkeyup.

Hier omheen werken is natuurlijk mogelijk, wat op redelijk veel manieren kan gebeuren.

blackrabbit

Legacy Member
Nog een ander klein probleempje, dat gerelateerd is aan m'n vraag hierboven (zelfde form):
ik gebruik doorgaans getElementById() om een specifiek element aan te spreken (value opvragen of style/innerHTML aanpassen etc).

Het bovenstaande form werd uitgebreid met een 4tal radio-buttons die de naam "search_in" delen, en maw een zekere zoek-optie vormen voor de getSuggestions()-functie (button waarden: all,url,name,tags).

Probleem: hoe kan ik in 1 statement nagaan welke radio-button aangeklikt is?


Heb die radio-buttons momenteel vervangen door een select-lijst, maar dat is wat minder esthetisch op de gegeven pagina: ik zou dus graag bij de radio buttons blijven.
Eén mogelijkheid is natuurlijk om elke radio button alsnog een unieke ID te geven, en elke radio-button apart te gaan checken (moet trouwens wel eens opzoeken welke property dat is [MOD: .checked dus]). Maar het lijkt me mooier/makkelijker om alles in 1 statement te kunnen uitvoeren.

Lashknife

Legacy Member
als de image het veld leegmaakt en de suggestions-div moet hiden, laat dat klein scriptje dan de display op none zetten
en als je een onkeyup doet, zet dan gewoon elke keer opnieuw de display op block? maakt toch nie uit of het al 4 miljoen keer zichtbaar is?

of idd, zoals gezegd, niet de keyup doen, maar gewoon doen wat de keyup hoort te doen?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan