Sie sind nicht angemeldet.

1

Donnerstag, 23. März 2017, 13:23

onentervr-Event über die API registrieren

Leider kann ich keine Callbacks richtig registrieren, die aufgerufen werden, wenn das Panorama in den VR-Modus geschaltet wird.
So versuche ich es:

Quellcode

1
2
3
4
5
6
7
8
9
krpano.set('webvr.onentervr', function() {
	console.log('webvr.onentervr');
});

krpano.set('webvr.onexitvr', function() {
	console.log('webvr.onexitvr');
});

krpano.call('webvr.enterVR();');


Was allerdings funktioniert ist folgendes:

Quellcode

1
krpano.set('webvr.onentervr', 'js(alert(42));');


Zumindest das events.onloadcomplete-Event lässt sich aber auch direkt registrieren, statt über den String-Umweg. BTW: Wieso überhaupt diese String-Sytnax?
Diese Lösung hat jedenfalls den Nachteil, dass ich keine Funktion registrieren kann, die in meinem Context läuft. Ich habe zwar eine Lösung gefunden, die technisch funktioniert, aber schön ist sie eigentlich nicht:

Quellcode

1
2
3
4
5
var onEnterVrFuncName = 'krpanoWebVrOnEnterVr' + Math.random().toString(36).substr(2);
window[onEnterVrFuncName] = function() {
	alert(42);
}.bind(this);
krpano.set('webvr.onentervr', 'js(' + onEnterVrFuncName + '());');

toosten

Fortgeschrittener

Beiträge: 521

Wohnort: Berlin

Beruf: Software-Entwickler bei VR-Easy ( HTML, JS, PHP, krpano, C++, Java )

  • Nachricht senden

2

Donnerstag, 23. März 2017, 16:26

Ich vermute das Du das zu früh setzt, wenn webvr noch garnicht initialisiert ist!?

Test mal:

Zitat


alert( krpano.get('webvr.vr_cursor'));

3

Freitag, 24. März 2017, 14:03

Nein, wird direkt nach onloadcomplete gemacht. Da sollte es also geladen sein.
Die Ausgabe deines Codes: hotspot[vr_cursor]

toosten

Fortgeschrittener

Beiträge: 521

Wohnort: Berlin

Beruf: Software-Entwickler bei VR-Easy ( HTML, JS, PHP, krpano, C++, Java )

  • Nachricht senden

4

Samstag, 25. März 2017, 08:40

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
function onentervr() {
	console.log('webvr.onentervr');
}

function onexitvr() {
	console.log('webvr.onexitvr');
}

krpano.set('webvr.onentervr', 'js(onentervr())' );

krpano.set('webvr.onexitvr', 'js(onexitvr())');

krpano.call('webvr.enterVR();');

5

Montag, 27. März 2017, 20:50

Ja, das entspricht ja quasi meiner Lösung. Ich habe halt die Schwierigkeit, dass meine Callbacks an einen "Klassen-"Context gebunden werden müssen, daher muss ich das dann so umständlich formulieren.

toosten

Fortgeschrittener

Beiträge: 521

Wohnort: Berlin

Beruf: Software-Entwickler bei VR-Easy ( HTML, JS, PHP, krpano, C++, Java )

  • Nachricht senden

6

Dienstag, 28. März 2017, 07:46

Hier als Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function klasse(){

this.onentervr= function() {
	console.log('webvr.onentervr');
}

this.onexitvr= function() {
	console.log('webvr.onexitvr');
}
}

g_klasse= new klasse();

krpano.set('webvr.onentervr', 'js(g_klasse.onentervr())' );

krpano.set('webvr.onexitvr', 'js(g_klasse.onexitvr())');

krpano.call('webvr.enterVR();');


Und falls du dich komplett in HTML bewegst: https://krpano.com/docu/xml/#action.js

7

Dienstag, 28. März 2017, 14:06

Das reicht für mich auch nicht, weil mein Callback ja normalerweise in einem Objekt steckt auf das man aus dem krpano-Context nicht zugreifen kann. Ich habe sozusagen nur

Quellcode

1
new klasse();

und nicht

Quellcode

1
g_klasse= new klasse();

Deswegen habe ich dann wiederum den Callback selber unter einem zufälligen Namen (wegen mehrerer Instanzen) am globalen window-Objekt gespeichert.
Was mich ja aber wundert ist, dass dieser Umweg überhaupt nötig ist und ich nicht einfach die Funktion direkt übergeben kann, wie das mit den anderen Events ja auch funktioniert.

toosten

Fortgeschrittener

Beiträge: 521

Wohnort: Berlin

Beruf: Software-Entwickler bei VR-Easy ( HTML, JS, PHP, krpano, C++, Java )

  • Nachricht senden

8

Dienstag, 28. März 2017, 15:56

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function klasse(){

this.onentervr= function() {
	console.log('webvr.onentervr');
}

this.onexitvr= function() {
	console.log('webvr.onexitvr');
}

g_klasse= this;
krpano.set('webvr.onentervr', 'js(g_klasse.onentervr())' );
krpano.set('webvr.onexitvr', 'js(g_klasse.onexitvr())');
krpano.call('webvr.enterVR();');
}

9

Dienstag, 28. März 2017, 17:38

Du machst doch in deinen Codebeispielen exakt dasselbe wie ich in meinem ersten Beispiel. Nur dass deine Beispiele nicht vollständig funktionieren. Spätestens mit einer zweiten Instanz. Dann wird g_klasse wieder überschrieben und das erwartete Event kommt nicht an. Deswegen meine Lösung im ersten Posting.

Mir gehts auch gar nicht um eine bessere Lösung in meinem Einflußbereich. Die ist schon richtig und ordentlich so. Mir gehts eigentlich nur um die Frage wieso ich bei diesem Event keinen Callback direkt angeben kann, wie bei den anderen Events auch. Ich vermute mal es handelt sich um einen Fehler.

Ähnliche Themen