Autor Zpráva
návštěvník
Profil *
Ahoj,
v Jquery mám událost .mousemove. Uvnitř mám objekt dragged, který by měl obsahovat objekt dragged.point.p. Stane se že na konzoli mi to vypíše že objekt p neexistuje. Problém je ale v tom jak to odladit.

    if (dragged !== null && dragged.node !== null) {
      if ( typeof dragged != 'undefined')
        {
        console.log("UNDEFINED");
        console.log(dragged);
        console.log("A)");
        console.log(dragged.p);
        console.log("B)");
        console.log(dragged.p.x);        
        console.log("C)");
        console.log(dragged.p.y);
        testn=2;
        throw new error;
        }  
      
            dragged.point.p.x = p.x;
            dragged.point.p.y = p.y;
    }

Výpis:
"NOTE: fade++ nebyl proveden protože rodičem je Nejoblíbenější kruhy(rodič iniciátora události)" my_springyui.js:533
"UNDEFINED" my_springyui.js:299
Object { node: Object, point: Object, distance: 0.19740937107841627 } my_springyui.js:300
"A)" my_springyui.js:301
undefined my_springyui.js:302
"B)" my_springyui.js:303
"UNDEFINED" my_springyui.js:299
Object { node: Object, point: Object, distance: 0.19740937107841627 } my_springyui.js:300
"A)" my_springyui.js:301
undefined my_springyui.js:302
"B)" my_springyui.js:303
"UNDEFINED" my_springyui.js:299
Object { node: Object, point: Object, distance: 0.19740937107841627 } my_springyui.js:300
"A)" my_springyui.js:301
undefined my_springyui.js:302
"B)" my_springyui.js:303
"UNDEFINED" my_springyui.js:299
Object { node: Object, point: Object, distance: 0.19740937107841627 } my_springyui.js:300
"A)" my_springyui.js:301
undefined my_springyui.js:302
"B)" my_springyui.js:303
"UNDEFINED" my_springyui.js:299
Object { node: Object, point: Object, distance: 0.19740937107841627 } my_springyui.js:300
"A)" my_springyui.js:301
undefined my_springyui.js:302
"B)" my_springyui.js:303
TypeError: dragged.p is undefined my_springyui.js:304


Nemohu se v tom výpisu vyznat protože to vůbec neodpovídá tomu co mám v kódu. C) tam vůbec není, místo toho tam je undefined a pak zase UNDEFINED. Ale throw new Error() je až za C). Štve mě na tom to že ten kód nejde celý přerušit v ten moment kdy nastane 'undefined' a zdá se že to neukazuje ty hodnoty co tam byly v ten okamžik kdy nastal problém, prostě tam je jen link na objekt který se dál mění, takže jak mám prohlédnout ty informace co tam byly v tom daném čase?
juriad
Profil
„undefined my_springyui.js:302“ říká, že dragged nemá atribut p, což je vidět i na výpisu „Object { node: Object, point: Object, distance: 0.19740937107841627 } my_springyui.js:300“ (má jen node, point a distance).
Tedy „dragged.p.x“ způsobí, že se ptáš na atribut x undefinedu, což způsobí chybu a vykonávání JS se v ten okamžik ukončí.

Mimochodem, throw new error; je blbě. Ten konstruktor se jmenuje Error s velkým E.
juriad
Profil
Nepleteš si náhodou dragged.point a dragged.p?
návštěvník
Profil *
juriad:
To všechno ale vím. Ale ten problém se týká toho KDY se tak stane. V který okamžik. Prostě tam běží další události a je to nepřehledné. Já potřebuju zjistit jak se to stane že ten dragged.point.p není vyplněn. A nevím jak to mám vysledovat když ten script se nezastaví přesně v ten okamžik co potřebuju. Cpou se tam ještě další hlášky protože běží dál.

PS: v tom console.log jsem to napsal blbě. Dragged obsahuje point.p ne p
juriad
Profil
Přidej si breakpoint s podmínkou: www.softwareishard.com/blog/firebug/firebug-tip-conditional-breakpoints
Jelikož JS běží v jediném vláknu, nevěřím, že se objevují nějaké hlášky poté, co se zastaví na nějakém breakpointu.
návštěvník
Profil *
A co říkáš na toto:
    if (dragged !== null && dragged.node !== null) 
    {
      
      if ( typeof dragged.point.p == 'undefined')
        {
        console.log("UNDEFINED");
        console.log(dragged);
        console.log("A)");
        console.log(dragged.point.p);
        console.log("B)");
        console.log(dragged.point.p.x);        
        console.log("C)");
        console.log(dragged.point.p.y);
        testn=2;
        throw new Error();
        }
      
            dragged.point.p.x = p.x;
            dragged.point.p.y = p.y;
    }

ReferenceError: p is not defined my_springyui.js:328
ReferenceError: p is not defined my_springyui.js:328
proč se to nezastaví když dragged.point.p je undefined?


chci říct proč to neskočí do bloku s podmínkou? Jak napsat podmínku aby to skočilo jak to nastane undefined?
juriad
Profil
návštěvník:
Zřejmě je dragged.point.p definované. Ta chyba ReferenceError je způsobená až na 18. řádku kódu, který jsi ukázal, tam proměnná p neexistuje.

Co vlastně chceš? Říkáš tady slova jako nezastaví, neskočí, nejde přerušit.
Jakmile v JS dojde k výjimce, ta se vrací zásobníkem nahorů, dokud ji někdo nezachytí nebo nedojde na začátek (v takovém případě ji prohlížeč zapíše do konzole).

Asi tuším, že chceš doplit hodnotu v nějakém objektu, pokud náhodou neexistuje. Nevím však, zda máš problém s debugováním v prohlížeči nebo s kódem v JS. Tuším, že s obojím.
návštěvník
Profil *
Dal jsem tam break point ale bylo to na nic. Vyzkoušej:
http://seznamka.moxo.cz/
ikony nejsou načtené. Vlevo nahoře je "Zábava". Klikneš a táhneš v místě kde by měla být ikona a vyskočí
ReferenceError:
řádek 329.
dám tam breakpoint, reload stránky, kliknu a táhnu, pak se to zastaví na ř. 329. Pak 4x zmáčknu "step out" a zase je tam ta chyba. Jenže debuger mi neskočil na žádný konkrétní řádek (i když vím že ta chyba je na 329).


Pro vysvětlení:
dragged se nastaví na nejbližší tažený objekt node vrácený funkcí layout.getNode poté co byla vyvolána událost jQuery(canvas).mousedown.
Dále probíhá událost jQuery(canvas).mousemove - ten blok co nás zajímá je na ř. 312. Pokud dragged je null tak neskočí do bloku. Jenže z neznámých důvodů se dragged nenastavil. To by ale nemělo nastat když .mousemove nastavil dragged na objekt nejbližšího uzlu...
juriad
Profil
Na 329. řádku používáš proměnnou p, která neexistuje, na pravé straně přiřazení. Nic víc na tom není. To způsobí chybu, která sestřelí zbytek zpracování události.

Step out znamená, že se pokračuje vykonávání programu a má se opět zastavit na místě, které zavolalo poslední funkci.
To je důvod, proč 4 step out tě vynesou ven ze zpracování události do jQuery a z něj pak ven.
Proč to funguje i po té chybě mi není jasné, nejspíš jde o nějakou vlastnost firebugu.

S dragged není problém; problém je s proměnnou p.
návštěvník
Profil *
Já se pořád díval na levou stranu v přesvědčení že tam není ten člen .p .... Díky moc.

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