Autor Zpráva
Witiko
Profil *
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 *
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
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 *
"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
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();
}
tak element.onload bude při spuštění události odkazovat na mnou nově vytvořenou funkci a dojde k zacyklení, ne?
Chamurappi
Profil
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);
};
Můžeš si docela snadno vyrobit funkci, která tohle udělá za tebe.
Aichi
Profil
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 *
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
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.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: