Autor Zpráva
hypot
Profil
Zdravím,
nevím, zda jsem srozumitelně do nadpisu napsal, o co mi jde. Narazil jsem na na následující problém:
Potřebuju, aby se po kliknutí na určité zvýrazněné části textu do pole vložil jejich atribut. Šel jsem na to přes objekt tohoto znění:
var objekt1 = {
  polozky: [],
  zaznamPolozek: function(event) {
  if ($(event.target)[0].hasAttribute("data-polozka")) {
      this.polozky.push($(event.target).attr("data-polozka"))
    }
  }
}
Metodu objektu jsem pak volal takto:
$(".polozka").on("click", objekt1.zaznamPolozek)
Jenže jsem obdržel chybu "this.polozky is undefined". Tak jsem si řekl (po počátečním zmatení, když jsem ověřoval existenci a správný zápis jmenované vlastnosti objektu), že nejspíš musím metodu objektu volat z anonymní funkce s parametrem zastupujícím událost, což zabralo:
$(".polozka").on("click", function(event) {
   objekt1.zaznamPolozek(event)
})
Mě v tomto případě nezajímá, jak problém vyřešit, ale vysvětlení, proč je třeba problém vyřešit takto. Zajímá mě, proč jsem nemohl z metody (funkce) on() ve svém případě volat funkci bez parametru, ačkoli v následujícím jednoduchém příkladu to možné je:
$("[data-polozka]").on("click", zmenaPozadi)

function zmenaPozadi(event) {
   $(event.target).css("backgroundColor", "yellow")
}
A ještě by mě zajímalo, proč jsem prve jako chybu dostal zrovna to, že je nedefinovaná vlastnost objektu.
Dostane-li se mi nějakého srozumitelného vysvětlení, děkuji za něj předem.
Mlocik97m
Profil *
nemá každá funkcia za názvom zátvorky?


lebo v prvom pripade ti tam chybajz
Kajman
Profil
hypot:

Rozdílné volání asi způsobí rozdílný objekt v this. Možná tam ten this být nemusí a polozky budou dostupné.
hypot
Profil
Mlocik97m:
nemá každá funkcia za názvom zátvorky?
V metodách on() a addEventListener() se pojmenovaná funkce zadává bez závorek. Takže v tomto případě ne (koneckonců, jak se lze přesvědčit, příklad s funkcí zmenaPozadi() je funkční (přidání závorek by jej znefunkčnilo - teoretické zdůvodnění pro to ovšem nemám).

Kajman:
Rozdílné volání asi způsobí rozdílný objekt v this.
To mě taky napadlo, ale o jaký nový objekt by se mělo jednat, už nevím.

Možná tam ten this být nemusí a polozky budou dostupné.
To sotva. Na vlastnost objektu nelze odkazovat bez uvedení jména samotného objektu a this zastupuje právě jméno objektu, v mém případě objekt1. Když mimochodem this nahradím za objekt1 (čili objekt1.polozky.push($(event.target).attr("data-polozka")), změní se jen chyba oznámená v konzoli na "objekt1.polozky is undefined", takže to vypadá, že v použití samotného this to nebude.
Mlocik97m
Profil *
hypot:
ja som nikdy nepsal funkci naprimo do parametru metod ale volal callback alebo funkci zapsal do tela metody. Vzdy mi to tak fungovalo.
hypot
Profil
Mlocik97m:
Vzdy mi to tak fungovalo.
Chápu, že v praxi to funguje tak, že většina lidí se přidržuje určité osvědčené rutiny, aniž by jí třeba rozuměla, jenže když se něco zvrtne (jako v mém případě), neznalost teorie se ukáže jako závada (člověk prostě neví, co dělá).

Ještě jsem narazil na jeden příklad s podobnými příznaky, který jsem náhodou zase vyřešil, ale stále nechápu, proč je třeba zrovna daného řešení:

Mám prototyp objektu mimo jiné s touto vlastností a metodou:
function Prototyp() {
  this.navstiveneS = [];
  this.historie = function() {
    let cisloStrany = window.location.href.slice(-4, -1);
    if (sessionStorage.getItem("navstiveneStranky"))
            this.navstiveneS = JSON.parse(sessionStorage.getItem("navstiveneStranky"));
    if (this.navstiveneS.indexOf(cisloStrany) == -1) {
            this.navstiveneS.push(cisloStrany);
            sessionStorage.setItem("navstiveneStranky", JSON.stringify(this.navstiveneS))
    }
  }
}

Následně pak z prototypu vytvořím instanci objektu a volám jeho metodu:
var objekt1 = new Prototyp();
$(window).on("beforeunload", objekt1.historie)
Výsledek: opět chyba "TypeError: this.navstiveneS is undefined" v konzoli. Teprve když volání metody objektu upravím na
$(window).on("beforeunload", function() {
  objekt1.historie()
}
žádné chyby se nevyskytnou a metoda dělá, co má.
Zkusil jsem metodu objektu volat také bez jQuery (čert mi ho byl dlužen):
window.addEventListener("beforeunload", objekt1.historie)
a také v tomto případě jsem se dobral úspěšné funkčnosti (přitom jsem nebyl nucen vložit volání metody objektu do anonymní funkce).
Takže stále by mě zajímalo vysvětlení, proč je v podobných případech třeba někdy vložit volání pojmenované funkce (metody objektu) do anonymní funkce a jindy ne.
Kcko
Profil
hypot:
Podívej se na www.youtube.com/watch?v=Ek6FHSiTXrc a pak Ti to třeba bude jasné (a můžeš si v JQ nastudovat $.proxy)

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:

0