Permalänk

egen toJson fungerar inte

Som många här har upptäckt vid det här laget, så är jag inte direkt den bästa JS-fixaren här, men försöker lära mig.
To the point: Jag har ett objekt som jag vill spara i en json-sträng för att kunna lagra på en lämplig plats och sedan kalla på senare, men detta objekt har ingen inbyggd toJson-metod. Efter lite googling hittade jag ett sätt att göra en egen sådan, men delar av den koden var lite fel. Efter att ha rättat till det jag trodde var fel i den (alla +-tecken saknades och det fanns några '-tecken för mycket på dessa ställen) får jag en evighetsloop när jag kallar på min fina toJson. Dessutom kallas den på genom att skriva toJson(objekt) istället för det mer traditionsenliga objekt.toJson().

Här är min kodsnutt:

function toJson(obj) { switch (typeof obj) { case 'object': if (obj) { var list = []; if (obj instanceof Array) { for (var i=0;i < obj.length;i++) { list.push(toJson(obj[i])); } return '[' + list.join(',') + ']'; } else { for (var prop in obj) { list.push('' + prop + ':' + toJson(obj[prop])); } return '{' + list.join(',') + '}'; } } else { return 'null'; } case 'string': return '' + obj.replace(/([''])/g, '\\$1') + ''; case 'number': case 'boolean': return new String(obj); } }

och sidan jag tog koden från finns här!

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Har inte jättekoll så rätta mig gärna men om du vill ha funktionen som en klassfunktion(objekt.toJson()) så får du skriva

Object.prototype.toJson = function() { //din funktionskod här. }

Men då kommer du nog vilja skriva om funktionen att jobba med det specifika objektets värden, och inte med värden från ett objekt som kommer som en inparameter

Permalänk
Skrivet av materka:

Men då kommer du nog vilja skriva om funktionen att jobba med det specifika objektets värden, och inte med värden från ett objekt som kommer som en inparameter

Det är väl så lätt som att ändra alla obj till this och plocka bort obj som inparameter, va?

F.Ö.: testat koden på alla möjliga sätt nu och även när det inte blir eveighetsloop av det, så får den en uncaught exception som jag inte riktigt förstår mig på. Om jag skulle gissa, så är det att en rad inte returnerar rätt data.

Fel: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMHTMLInputElement.selectionStart]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: http://localhost/Test/test.html :: toJson :: line 50" data: no]

rad 50:

list.push('' + prop + ':' + toJson(obj[prop]));

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem
Skrivet av morphman86:

Det är väl så lätt som att ändra alla obj till this och plocka bort obj som inparameter, va?

F.Ö.: testat koden på alla möjliga sätt nu och även när det inte blir eveighetsloop av det, så får den en uncaught exception som jag inte riktigt förstår mig på. Om jag skulle gissa, så är det att en rad inte returnerar rätt data.

Fel: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMHTMLInputElement.selectionStart]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: http://localhost/Test/test.html :: toJson :: line 50" data: no]

rad 50:

list.push('' + prop + ':' + toJson(obj[prop]));

Det borde funka att byta ut obj mot this, ja.
Kan du lägga upp objektet du försöker använda?

Permalänk
Skrivet av materka:

Det borde funka att byta ut obj mot this, ja.
Kan du lägga upp objektet du försöker använda?

Kan göra ett steg bättre och slänga upp den bit testkod jag skrev för att testa.

var stage1 = new Kinetic.Stage("container", 100, 100); var layer = new Kinetic.Layer(); var rect = new Kinetic.Rect({ x: 10, y: 10, width: 80, height: 80, fill: "red", stroke: "black", strokeWidth: 5 }); window.onload = function() { layer.add(rect); stage1.add(layer); } function transferStage(){ //Har en knapp med onclick för att aktivera toJson var json = stage1.toJson(); var stage2 = new Kinetic.Stage(json); stage2.draw(); } Kinetic.Stage.prototype.toJson = function() { switch (typeof this) { case 'Stage': if (this) { var list = []; if (this instanceof Array) { for (var i=0;i < this.length;i++) { list.push(toJson(this[i])); } return '[' + list.join(',') + ']'; } else { for (var prop in this) { list.push('' + prop + ':' + toJson(this[prop])); } return '{' + list.join(',') + '}'; } } else { return 'null'; } case 'string': return '' + this.replace(/([''])/g, '\\$1') + ''; case 'number': case 'boolean': return new String(this); } }

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Verkar lite skumt att du först switchar på typeof this och sedan kollar om this är definierat med if (this) { .... I en webbmiljö kommer det alltid vara definierat, antingen till det anropande objektet, eller till window. Som jag läser det kommer du aldrig få svaret 'null' från funktionen.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Jag antar att det var menat som en failsafe, men jag har testat att alerta på varje rad i funktionen som tillåter en alert och det verkar som om den inte tar något case is switchen, inte ens om jag lägger till en default. Av någon anledning går allt bara rätt genom och returnerar undefined, även med vanliga objekt (självklart med ändring till Object istället för Kinetic.Stage).

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Legendarisk

Om du måste stödja browsers saknar en egen implementation av JSON så skulle jag rekommendera att du använder det här projektet istället. Du får då samma interface som i modernare browsers och slipper ändra på din arbetsmetod.

https://github.com/douglascrockford/JSON-js.

Angående din kod:
I toJson() kommer typeof this bli "object", inte "Stage", använd hellre instanceof för att kontrollera om ett objekt är av en viss typ.

if(foo instanceof Kinetic.Stage) { ... }

Dock en underlig kontroll att göra av 'this', som dessutom alltid kommer vara definierat. Metoden bör istället samla all data i en array / objekt och serialisera det via JSON.stringify();

Du nämnde även att du debuggar med alerts. Vill tipsa om console.log() istället, stöds av alla moderna browsers och är mycket smidigare att använda. Vissa browsers, t.ex. Chrome, har även utmärkta debuggers som låter dig sätta breakpoints och stega igenom koden dynamiskt.

http://www.youtube.com/watch?v=c_oiQYirKuY

Skickades från m.sweclockers.com

Visa signatur

Abstractions all the way down.

Permalänk
Skrivet av Tunnelsork:

Om du måste stödja browsers saknar en egen implementation av JSON så skulle jag rekommendera att du använder det här projektet istället. Du får då samma interface som i modernare browsers och slipper ändra på din arbetsmetod.

https://github.com/douglascrockford/JSON-js.

Det är inga problem, behöver inget äldre än IE9 och jag kör själv på senaste FireFox.

Skrivet av Tunnelsork:

Angående din kod:
I toJson() kommer typeof this bli "object", inte "Stage", använd hellre instanceof för att kontrollera om ett objekt är av en viss typ.

if(foo instanceof Kinetic.Stage) { ... }

Testade att ändra till Object, men den ger samma fel ("this.container is not defined").

Skrivet av Tunnelsork:

Dock en underlig kontroll att göra av 'this', som dessutom alltid kommer vara definierat. Metoden bör istället samla all data i en array / objekt och serialisera det via JSON.stringify();

Fixat, plockade bort if-satsen helt då den inte gör något.

Skrivet av Tunnelsork:

Du nämnde även att du debuggar med alerts. Vill tipsa om console.log() istället, stöds av alla moderna browsers och är mycket smidigare att använda. Vissa browsers, t.ex. Chrome, har även utmärkta debuggers som låter dig sätta breakpoints och stega igenom koden dynamiskt.

Alerts låter mig snabbt se vart i koden jag är någonstans utan att behöva kolla andra fönster eller loggar. Använder det bara när Firebug inte ger något tips om vart det går snett eller när jag behöver veta exakt vilken rad jag är på och tycker det går snabbare än att stega genom 1500+ rader kod

EDIT: Bantade ner koden, då jag inte riktigt behövde en switch i en metod som bara skall ta in Stage ändå. Den nya koden ser ut så här:

function toJson(Stage){ //Kinetic.Stage.prototype.toJson = function() { var list = []; if (this instanceof Array) { for (var i=0;i < this.length;i++) { list.push(toJson(this[i])); } return '[' + list.join(',') + ']'; } else { for (var prop in this) { list.push('"' + prop + '":' + toJson(this[prop])); } return '{' + list.join(',') + '}'; } }

Men på raden med toJson(this[prop]) ger den error "Too much recursion", och jag undrar vilken property i Stage som kan orsaka evighetsloop... För jag antar att det händer någonstans i en property av en property av en property någonstans (typ Stage.Layer.Rect.Draggable eller liknande). Får sätta mig och läsa på mer om de properties som finns för Stage för att få reda på vad det kan vara.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem
Skrivet av morphman86:

Det är inga problem, behöver inget äldre än IE9 och jag kör själv på senaste FireFox.

Testade att ändra till Object, men den ger samma fel ("this.container is not defined").

Det beror antagligen på att du inte kollar om prop finns som egen property på this med this.hasOwnProperty(prop).

Skrivet av morphman86:

Fixat, plockade bort if-satsen helt då den inte gör något.

Skrivet av morphman86:

Alerts låter mig snabbt se vart i koden jag är någonstans utan att behöva kolla andra fönster eller loggar. Använder det bara när Firebug inte ger något tips om vart det går snett eller när jag behöver veta exakt vilken rad jag är på och tycker det går snabbare än att stega genom 1500+ rader kod

Du arbetar mot dig själv om du använder alerts istället för console.log. Just saying..

Sedan har du låtit bli att sätta break; efter varje case vilket leder till fall through:

var foo = 2; switch (foo) { case 1: console.log('foo is 1'); case 2: console.log('foo is 2'); case 3: console.log('foo is 3'); default: console.log('foo is not 1, 2 or 3'); } // resultat: // foo is 2 // foo is 3 // foo is not 1, 2 or 3

edit:

Skrivet av morphman86:

Men på raden med toJson(this[prop]) ger den error "Too much recursion", och jag undrar vilken property i Stage som kan orsaka evighetsloop... För jag antar att det händer någonstans i en property av en property av en property någonstans (typ Stage.Layer.Rect.Draggable eller liknande). Får sätta mig och läsa på mer om de properties som finns för Stage för att få reda på vad det kan vara.

Nu tar funktionen emot en Stage som inte används. Dessutom binds this till window, vilket innebär att du i din for-loop går över varenda property som window har, inklusive din egen funktion.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

var json = toJson(stage1);

Där tar den ju emot en stage.... eller vad menar du med "inte används"?

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Avstängd

Detta är inbyggt i alla moderna browsers

JSON.stringify

För älrdre läsare kan du inkludera json2.js

Visa signatur
Permalänk
Medlem
Skrivet av morphman86:

Kolla min edit, Switch är borta nu, använder ju inte mer än ett case endå.

Tanken med switchen var väl att du skulle kunna serialisera ett null-värde? Jag tror ändå ditt bästa alternativ är att använda en av de färdiga implementationer som finns.

Skrivet av morphman86:

var json = toJson(stage1);

Där tar den ju emot en stage.... eller vad menar du med "inte används"?

Jag menar:

Skrivet av morphman86:

function toJson(Stage){

Stage används inte i din kod.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av CyberVillain:

Detta är inbyggt i alla moderna browsers

JSON.stringify

För älrdre läsare kan du inkludera json2.js

Det fungerar ju inte med cykliska värden, som stage tydligen är >.<

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Skrivet av Teknocide:

Stage används inte i din kod.

Är inte det man skriver som parameter en parametertyp? stage1 är ju en Kinetic.Stage. Eller har jag missuppfattat JavaScript-funktioner helt nu?

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Avstängd

Jag tror nog inte tanken är att du ska spara ner hela staten på Kinetic ytan?

Visa signatur
Permalänk
Skrivet av CyberVillain:

Jag tror nog inte tanken är att du ska spara ner hela staten på Kinetic ytan?

Det är ju just det jag är ute efter. Jag håller på med en "spara"-funktion till kinetic-ytan, så att man senare kan "ladda" den till en ny yta. Alternativet är att man måste börja om från början om något behöver ändras i efterhand.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Avstängd

Vad är det du försöker åstakomma? Att spelaren kan spara sitt spel och sedan återgå vid ett senare tillfälle?

Visa signatur
Permalänk
Skrivet av CyberVillain:

Vad är det du försöker åstakomma? Att spelaren kan spara sitt spel och sedan återgå vid ett senare tillfälle?

På ett ungefär, det är inget spel, men jag antar att principen är densamma. Det är en webbapp där användaren har ett antal produktbilder i en meny som de kan klicka på, så dyker de upp på ritytan, där de kan placeras. Googla Planogram så ser du ungefär vad jag menar.
När ett planogram är klart, så sparas bilden och all info i en fil, som kan accessas senare, men då är bilden statisk. Just nu, om någon kommer på att produkt X sitter fel, eller behöver bytas ut, så måste då användaren göra en ny fil och börja om från början, istället för att bara plocka bort DEN bilden och ersätta.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Avstängd

Känns mer korrekt att spara staten på datat, inte hela staten på vyn...

Visa signatur
Permalänk
Skrivet av CyberVillain:

Känns mer korrekt att spara staten på datat, inte hela staten på vyn...

Och hur gör man detta? Det var änna vad jag trodde att jag gjorde när jag sparade alla parametrar i vyn. Det finns ju flera lager i stage, så att bara spara lagret är ju ingen större idé. Sen har ju varje lager flera objekt, olika antal och typer, så att spara objektets parametrar känns också lite udda.
Enda sättet jag kan se (och som också diskuteras vilt i kinetics forum) är att spara hela stage med parametrar och allt i en json-sträng.

Jag skulle kunna försöka loopa genom samtliga layers och samtliga objekt och skriva ut dess parametrars data i en fil, men det känns som om det är lite samma sak.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Avstängd

Jag brukar ha en egen datamodell som abstraherar vyimplementationen från modellen, även så kallad MVVM. Jag vet inte hur bra kinetics stödjer detta. Men tanken är att alla förändringar du gör i vyn återspeglas på din vymodell och vicevärsa. Sedan spar du bara vymodellen, sedan laddas denna vid ett senare tillfälle

Visa signatur
Permalänk
Medlem
Skrivet av morphman86:

Är inte det man skriver som parameter en parametertyp? stage1 är ju en Kinetic.Stage. Eller har jag missuppfattat JavaScript-funktioner helt nu?

Jag vet inte vad det är du har missuppfattat, men du har definierat en funktion som gör en parameter åtkomlig under namnet "Stage". Denna parameter används aldrig i funktionen. Som funktionen ser ut nu kan lika gärna anropa den med strängen 'slanggurka'; du får precis samma resultat (eller fel) som med stage1.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av CyberVillain:

Jag brukar ha en egen datamodell som abstraherar vyimplementationen från modellen, även så kallad MVVM. Jag vet inte hur bra kinetics stödjer detta. Men tanken är att alla förändringar du gör i vyn återspeglas på din vymodell och vicevärsa. Sedan spar du bara vymodellen, sedan laddas denna vid ett senare tillfälle

Åh herre... Jag är förstaårs-student, behöver nog veta lite mer om vad en datamodell innebär.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem
Skrivet av morphman86:

Är inte det man skriver som parameter en parametertyp? stage1 är ju en Kinetic.Stage. Eller har jag missuppfattat JavaScript-funktioner helt nu?

Ta en godtycklig funktion:

function lunch(namn) { console.log('Dagens lunch: '+namn); }

Anropa den med godtycklig parameter:

var stage1 = "grus"; lunch(stage1);

Värdet som skickas in i funktionen (stage1) görs tillgängligt inuti funktionen under det funktionsdefinierade parameternamnet (namn)
Din funktion tar en parameter och kallar den internt för Stage, men parametern används aldrig av funktionskoden.

edit: felcitering

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Kolla igen vem jag citerade, Teknocide

Men ja, jag förstår vad du menar. Jag behöver ändra "this" till "Stage" i funktionen för att det skall göra något.

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Har fått till något som verkar funka fint, förutom då att container fortfarande verkar vara tom. Med en snabbkoll på den JSON-sträng som kommer ut, verkar det som om container-property blir container:[object HTMLDivElement] och jag vill ha det till att det skall bli container:"container"...
För den som orkar läsa kan hela json-strängen läsas här: http://pastebin.com/atGA0cze

Edit: Detta är alltså den JSON jag får av funktionen på en stage med ett lager, med en fyrkant i mitten.

function toJson(Stage){ var list = []; if (Stage instanceof Array) { for (var i=0;i < Stage.length;i++) { var stringTxt = "" + Stage[i]; list.push(stringTxt); } return '[' + list.join(',') + ']'; } else { for (var prop in Stage) { var stringTxt = "" + prop + ":" + Stage[prop]; list.push(stringTxt); } return '{' + list.join(',') + '}'; } }

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk

Fått något som verkar ge en json-liknande sträng, men när den skall användas (var stage2 = new Kinetic.Stage(json)), så får firebug fram "invalid label" på andra propertien, oavsett vad det råkar vara där.
Så här ser strängen ut:

{ container : "container", width : "100", height : "100", scale : "[object Object]", dblClickWindow : "400", targetShape : "undefined", clickStart : "false", mousePos : "undefined", mouseDown : "false", mouseUp : "false", touchPos : "undefined", touchStart : "false", touchEnd : "false", bufferLayer : "[object Object]", backstageLayer : "[object Object]", id : "0", isAnimating : "false", onFrameFunc : "undefined", children : "[object Object]", childrenNames : "[object Object]", onFrame : "function (func)...(MYCKET mera kod, men inget relevant här)

I denna sträng säger FireBug att width är en "invalid label".

Knapp ett triggar transferStage, knapp två triggar loadStage och vad jag har fattat det som så skall allt som var i stage1 nu hamna i stage2, dock händer inget mer än "invalid label" på width när man klickar på load.

function transferStage(){ json = toJson(stage1); document.getElementById('container2').innerHTML = json; stage1.clear(); } function loadStage(){ var obj = eval(json); var stage2 = new Kinetic.Stage(obj); stage2.draw(); }

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Width och height ska antagligen vara nummer. Dessutom borde du använda quotes runt JSON-objektets nycklar,
ex: { "korv" : 42 }

Hoppas du inte behöver komma åt scale..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Width och height ska antagligen vara nummer. Dessutom borde du använda quotes runt JSON-objektets nycklar,
ex: { "korv" : 42 }

Hoppas du inte behöver komma åt scale..

Nej, Scale är irrelevant. När jag tog bort alla quotes fick jag en bättre sträng, men nu klagar den på "expected property name or }" istället... Jag har kollat genom den (extremt) långa strängen och alla måsvingar som öppnas är slutna.
Om det behövs, så har ni hela strängen här:

{ container : container; width : 100 ; height : 100 ; scale : [object Object] ; dblClickWindow : 400 ; targetShape : undefined ; clickStart : false ; mousePos : undefined ; mouseDown : false ; mouseUp : false ; touchPos : undefined ; touchStart : false ; touchEnd : false ; bufferLayer : [object Object] ; backstageLayer : [object Object] ; id : 0 ; isAnimating : false ; onFrameFunc : undefined ; children : [object Object] ; childrenNames : [object Object] ; onFrame : function (func) { this.onFrameFunc = func; } ; start : function () { this.isAnimating = true; Kinetic.GlobalObject._handleAnimation(); } ; stop : function () { this.isAnimating = false; Kinetic.GlobalObject._handleAnimation(); } ; draw : function () { this._drawChildren(); } ; _stripLayer : function (layer) { layer.context.stroke = function () {}; layer.context.fill = function () {}; layer.context.fillRect = function (x, y, width, height) {layer.context.rect(x, y, width, height);}; layer.context.strokeRect = function (x, y, width, height) {layer.context.rect(x, y, width, height);}; layer.context.drawImage = function () {}; layer.context.fillText = function () {}; layer.context.strokeText = function () {}; } ; _endDrag : function (evt) { if (this.nodeDragging) { if (this.nodeDragging.drag.moving) { this.nodeDragging.drag.moving = false; this.nodeDragging._handleEvents("ondragend", evt); } } this.nodeDragging = undefined; } ; _prepareDrag : function () { var that = this; this.on("mousemove touchmove", function (evt) {if (that.nodeDragging) {var pos = that.getUserPosition();if (that.nodeDragging.drag.x) {that.nodeDragging.x = pos.x - that.nodeDragging.offset.x;}if (that.nodeDragging.drag.y) {that.nodeDragging.y = pos.y - that.nodeDragging.offset.y;}that.nodeDragging.getLayer().draw();if (!that.nodeDragging.drag.moving) {that.nodeDragging.drag.moving = true;that.nodeDragging._handleEvents("ondragstart", evt);}that.nodeDragging._handleEvents("ondragmove", evt);}}, false); this.on("mouseup touchend mouseout", function (evt) {that._endDrag(evt);}); } ; setSize : function (width, height) { var layers = this.children; for (var n = 0; n < layers.length; n++) { var layer = layers[n]; layer.getCanvas().width = width; layer.getCanvas().height = height; layer.draw(); } this.width = width; this.height = height; this.bufferLayer.getCanvas().width = width; this.bufferLayer.getCanvas().height = height; this.backstageLayer.getCanvas().width = width; this.backstageLayer.getCanvas().height = height; } ; setScale : function (scaleX, scaleY) { var oldScaleX = this.scale.x; var oldScaleY = this.scale.y; if (scaleY) { this.scale.x = scaleX; this.scale.y = scaleY; } else { this.scale.x = scaleX; this.scale.y = scaleX; } var layers = this.children; var that = this; function scaleChildren(children) { for (var i = 0; i < children.length; i++) { var child = children[i]; child.x *= that.scale.x / oldScaleX; child.y *= that.scale.y / oldScaleY; if (child.children) { scaleChildren(child.children); } } } scaleChildren(layers); } ; getScale : function () { return this.scale; } ; clear : function () { var layers = this.children; for (var n = 0; n < layers.length; n++) { layers[n].clear(); } } ; toDataURL : function (callback) { var bufferLayer = this.bufferLayer; var bufferContext = bufferLayer.getContext(); var layers = this.children; function addLayer(n) { var dataURL = layers[n].getCanvas().toDataURL(); var imageObj = new Image; imageObj.onload = function () {bufferContext.drawImage(this, 0, 0);n++;if (n < layers.length) {addLayer(n);} else {callback(bufferLayer.getCanvas().toDataURL());}}; imageObj.src = dataURL; } bufferLayer.clear(); addLayer(0); } ; remove : function (layer) { this.container.removeChild(layer.canvas); this._remove(layer); } ; on : function (typesStr, handler) { var types = typesStr.split(" "); for (var n = 0; n < types.length; n++) { var baseEvent = types[n]; this.container.addEventListener(baseEvent, handler, false); } } ; add : function (layer) { if (layer.name) { this.childrenNames[layer.name] = layer; } layer.canvas.width = this.width; layer.canvas.height = this.height; this._add(layer); layer.draw(); this.container.appendChild(layer.canvas); } ; _handleEvent : function (evt) { if (!evt) { evt = window.event; } this._setMousePosition(evt); this._setTouchPosition(evt); var backstageLayer = this.backstageLayer; var backstageLayerContext = backstageLayer.getContext(); var that = this; backstageLayer.clear(); var targetFound = false; function detectEvent(shape) { shape._draw(backstageLayer); var pos = that.getUserPosition(); var el = shape.eventListeners; if (that.targetShape && shape.id === that.targetShape.id) { targetFound = true; } if (shape.visible && pos !== undefined && backstageLayerContext.isPointInPath(pos.x, pos.y)) { if (that.mouseDown) { that.mouseDown = false; that.clickStart = true; shape._handleEvents("onmousedown", evt); return true; } else if (that.mouseUp) { that.mouseUp = false; shape._handleEvents("onmouseup", evt); if (that.clickStart) { if (that.nodeDragging && !that.nodeDragging.drag.moving || !that.nodeDragging) { shape._handleEvents("onclick", evt); if (shape.inDoubleClickWindow) { shape._handleEvents("ondblclick", evt); } shape.inDoubleClickWindow = true; setTimeout(function () {shape.inDoubleClickWindow = false;}, that.dblClickWindow); } } return true; } else if (that.touchStart) { that.touchStart = false; shape._handleEvents("touchstart", evt); if (el.ondbltap && shape.inDoubleClickWindow) { var events = el.ondbltap; for (var i = 0; i < events.length; i++) { events[i].handler.apply(shape, [evt]); } } shape.inDoubleClickWindow = true; setTimeout(function () {shape.inDoubleClickWindow = false;}, that.dblClickWindow); return true; } else if (that.touchEnd) { that.touchEnd = false; shape._handleEvents("touchend", evt); return true; } else if (el.touchmove) { shape._handleEvents("touchmove", evt); return true; } else if (!that.targetShape || !targetFound && shape.id !== that.targetShape.id) { if (that.targetShape) { var oldEl = that.targetShape.eventListeners; if (oldEl) { that.targetShape._handleEvents("onmouseout", evt); } } that.targetShape = shape; shape._handleEvents("onmouseover", evt); return true; } else { shape._handleEvents("onmousemove", evt); return true; } } else if (that.targetShape && that.targetShape.id === shape.id) { that.targetShape = undefined; shape._handleEvents("onmouseout", evt); return true; } return false; } function traverseChildren(obj) { var children = obj.children; for (var i = children.length - 1; i >= 0; i--) { var child = children[i]; if (child.className === "Shape") { var exit = detectEvent(child); if (exit) { return true; } } else { traverseChildren(child); } } return false; } for (var n = this.children.length - 1; n >= 0; n--) { var layer = this.children[n]; if (layer.visible && n >= 0 && layer.isListening) { if (traverseChildren(layer)) { n = -1; } } } } ; _listen : function () { var that = this; this.container.addEventListener("mousedown", function (evt) {that.mouseDown = true;that._handleEvent(evt);}, false); this.container.addEventListener("mousemove", function (evt) {that.mouseUp = false;that.mouseDown = false;that._handleEvent(evt);}, false); this.container.addEventListener("mouseup", function (evt) {that.mouseUp = true;that.mouseDown = false;that._handleEvent(evt);that.clickStart = false;}, false); this.container.addEventListener("mouseover", function (evt) {that._handleEvent(evt);}, false); this.container.addEventListener("mouseout", function (evt) {that.mousePos = undefined;}, false); this.container.addEventListener("touchstart", function (evt) {evt.preventDefault();that.touchStart = true;that._handleEvent(evt);}, false); this.container.addEventListener("touchmove", function (evt) {evt.preventDefault();that._handleEvent(evt);}, false); this.container.addEventListener("touchend", function (evt) {evt.preventDefault();that.touchEnd = true;that._handleEvent(evt);}, false); } ; getMousePosition : function (evt) { return this.mousePos; } ; getTouchPosition : function (evt) { return this.touchPos; } ; getUserPosition : function (evt) { return this.getTouchPosition() || this.getMousePosition(); } ; _setMousePosition : function (evt) { var mouseX = evt.clientX - this._getContainerPosition().left + window.pageXOffset; var mouseY = evt.clientY - this._getContainerPosition().top + window.pageYOffset; this.mousePos = {x: mouseX, y: mouseY}; } ; _setTouchPosition : function (evt) { if (evt.touches !== undefined && evt.touches.length === 1) { var touch = evt.touches[0]; var touchX = touch.clientX - this._getContainerPosition().left + window.pageXOffset; var touchY = touch.clientY - this._getContainerPosition().top + window.pageYOffset; this.touchPos = {x: touchX, y: touchY}; } } ; _getContainerPosition : function () { var obj = this.container; var top = 0; var left = 0; while (obj && obj.tagName !== "BODY") { top += obj.offsetTop; left += obj.offsetLeft; obj = obj.offsetParent; } return {top: top, left: left}; } ; getContainer : function () { return this.container; } ; getStage : function () { return this; } ; getTargetShape : function () { return this.targetShape; } ; _setChildrenIndices : function () { if (this.className === "Stage") { var canvases = this.container.childNodes; var bufferCanvas = canvases[0]; var backstageCanvas = canvases[1]; this.container.innerHTML = ""; this.container.appendChild(bufferCanvas); this.container.appendChild(backstageCanvas); } for (var n = 0; n < this.children.length; n++) { this.children[n].index = n; if (this.className === "Stage") { this.container.appendChild(this.children[n].canvas); } } } ; _drawChildren : function () { var children = this.children; for (var n = 0; n < children.length; n++) { var child = children[n]; if (child.className === "Shape") { child._draw(child.getLayer()); } else { child._draw(); } } } ; getChildren : function () { return this.children; } ; getChild : function (name) { return this.childrenNames[name]; } ; _add : function (child) { if (child.name) { this.childrenNames[child.name] = child; } child.id = Kinetic.GlobalObject.idCounter++; child.index = this.children.length; child.parent = this; this.children.push(child); } ; _remove : function (child) { if (child.name !== undefined) { this.childrenNames[child.name] = undefined; } this.children.splice(child.index, 1); this._setChildrenIndices(); child = undefined; } }

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10