Autor | Zpráva | ||
---|---|---|---|
Witiko Profil * |
#1 · Zasláno: 10. 11. 2009, 21:50:42
S tím, že tyto dvě funkce nefungují v Internet exploreru jsem se již pomalu smířil, nicméně setkávám se s podivnou funkčnostíi u ostatních prohlížečů - problémem je pofidérní funkčnost removeEventListener, kdy k odstranění eventu podle mě vůbec nedochází.
UserListener.prototype._OnUnactive = function() { this.unactive_date=new Date(); var that=this; window.removeEventListener("click",function() {that.refreshInterval();}, false); window.removeEventListener("keydown",function() {that.refreshInterval();}, false); window.removeEventListener("mousemove",function() {that.refreshInterval();}, false); this.OnUnactive(); this._userActive=false; window.addEventListener("click",function() {that.OnActive();}, false); window.addEventListener("keydown",function() {that.OnActive();}, false); window.addEventListener("mousemove",function() {that.OnActive();}, false); window.clearInterval(this.interval); } Problém je, že i po zavolání metody se mi that.refreshInterval(); volá, eventy nejsou odstraněny. Celkově z tohohle řešení nejsem nadšený, mnohem lepší by podle mě bylo: var id=element.addEventListener(type,function,capture); element.removeEventListener(id); ale to je mimo mísu. Problém je, že k odstranění intervalu nedojde. Mohl by být problém v použití anonymních funkcí? |
||
Witiko Profil * |
#2 · Zasláno: 10. 11. 2009, 22:56:41
Dělal jsem teď víc testů a ani tohle nefunguje:
window.addEventListener("click",function(){alert("Clicked")},false); window.removeEventListener("click",function(){alert("Clicked")},false); Po kliknutí se alert spustí, addEventListener se provede, removeEventListener ne. Vzhledem k tomu, že tahle funkce nevrací jen undefined těžko hledat, kde je to psisko zakopané. |
||
Chamurappi Profil |
#3 · Zasláno: 10. 11. 2009, 23:16:40 · Upravil/a: Chamurappi
Reaguji na Witika:
„Mohl by být problém v použití anonymních funkcí?“ Jsem si skoro jistý, že ano. A můžeš si to snadno vyzkoušet, ne? Funkce, kterou odebíráš, je už jiná než ta, kterou jsi přidal. Leží na jiném místě v paměti, i když dělá totéž. „k odstranění eventu podle mě vůbec nedochází“ Není jednodušší řešení napsat tu funkci, která obsluhuje událost, tak, aby si sama nějak zjistila, jestli má něco dělat a případně se hned odreturnovala? „S tím, že tyto dvě funkce nefungují v Internet exploreru jsem se již pomalu smířil“ Proč nepoužiješ postup funkční všude? Máš nějaké výhrady vůči tomu, čemu se říká DOM 0? |
||
Witiko Profil * |
#4 · Zasláno: 10. 11. 2009, 23:48:25
"Není jednodušší řešení napsat tu funkci, která obsluhuje událost, tak, aby si sama nějak zjistila, jestli má něco dělat a případně se hned odreturnovala?"
Tak to asi nakonec vyřeším. :) Proč nepoužiješ postup funkční všude? Máš nějaké výhrady vůči tomu, čemu se říká DOM 0? Postup funkční všude? Postup pomocí document.body.on<událost> je od uvedení add/removeEventListener v DOM 2 zastaralý a hlavně - nejde připojit víc událostí stejného typu najednou, což je např. zrovna v tomhle mém scriptu zásadní, maximálně nějakým krkolomným opisem, kde bych zkopíroval aktuální obslužnou funkci události a nacpal jí do jedné metody spolu s mým kódem. A pak už je tu jen add/removeEventListener - podle DOM 2 - funkční všude kromě MSIE a attach/detachEvent - čistě MSIE záležitost. |
||
Chamurappi Profil |
#5 · Zasláno: 11. 11. 2009, 00:12:04 · Upravil/a: Chamurappi
Reaguji na Witika:
„Postup pomocí document.body.on<událost> je od uvedení add/removeEventListener v DOM 2 zastaralý“ To těžko. V roce 2000 se pořád ještě užívaly prohlížeče, které neuměly ani document.body, natož eventListenery. Za pár let vyjde HTML 5, které s těmi „atributovými funkcemi“ počítá i u událostí, které zatím víceméně neexistují. „nejde připojit víc událostí stejného typu najednou“ Jde to celkem snadno, stačí si uložit předchozí hodnotu a pak ji zevnitř nové funkce zavolat. Navíc mám i dobrou kontrolu nad tím, zda a kdy se zavolá, což je u addEventListener/attachEvent trochu problém, ne? Aha, koukám, že ty tohle dál popisuješ jako krkolomný opis. „kde bych zkopíroval aktuální obslužnou funkci události“ Zkopíroval bys referenci. Zejména s ohledem na tvoji úvodní otázku je dobré uvědomovat si rozdíl. „pak už je tu jen add/removeEventListener - podle DOM 2 - funkční všude kromě MSIE a attach/detachEvent - čistě MSIE záležitost“ Mně připadá krokolomné řešit nekompatibilitu prohlížečů, které se můžu snadno vyhnout. |
||
Witiko Profil * |
Kdybych vytvořil jen referenci:
element.onload = function() { *můj kód* element.onload(); } |
||
Chamurappi Profil |
#7 · Zasláno: 11. 11. 2009, 14:44:56
Reaguji na Witika:
var původníOnload = element.onload; element.onload = function() { // tvůj kód if(původníOnload) původníOnload.apply(this, arguments); }; |
||
Aichi Profil |
#8 · Zasláno: 11. 11. 2009, 16:37:40
Neodstrani se ti to volani v removeEventListener, protoze tomu nepredavas stejne parametry jako v addEventListener. Jelikoz pouzivas anonymni funkce, nelze listenery odebirat, pokud si ty funkce pojmenujes, odebirat ti pujdou.
function neco() {} window.addEventListener("click",neco, false); window.removeEventListener("click",neco, false); |
||
Witiko Profil * |
#9 · Zasláno: 11. 11. 2009, 16:50:48
Aichi: Dobré, už jsem to vyřešil přes jednu funkci, která si sama vybere co dělat, je to praktičtější. Ale btw - nefungovalo mi to tímhle způsobem taky, když jsem to zkoušel:
var that=this; var refresh=new function() {that.refreshInterval();} window.addEventListener("click",refresh, false); window.removeEventListener("click",refresh, false); Chamurappi: funkce apply() je pro mě celkem novinka, nejprve jsem se s ní setkal celkem nedávno. Důvod, proč tu používáš apply() je kvůli předání this odkazující na element původní funkci, pokud by s ním pracovala? Protože jinak by podle mě fungovalo i var původníOnload = element.onload; element.onload = function() { // můj kód if(původníOnload) původníOnload(); }; |
||
Chamurappi Profil |
#10 · Zasláno: 11. 11. 2009, 17:07:55
Reaguji na Aichiho:
V podstatě na totéž jsem už upozornil v [#2], ne? Reaguji na Witika: „je kvůli předání this odkazující na element původní funkci, pokud by s ním pracovala?“ Ano. Snažil jsem se ukázat obecné řešení. „jinak by podle mě fungovalo i“ Ano. |
||
Časová prodleva: 14 let
|
0