2017-08-13 21 views
0

Während ich eine Anwendung auf Code-Name One auf dem Simulator entwickelt hatte, sah ich seltsames Problem.Seltsames Verhalten von Code-Name-One Browser-Komponente Im Simulator

Ich habe eine Tabs mit einer einzigen Tab, diese Registerkarte hat eine browserComponent mit HTML-Inhalt. Es hat span Element, die eine JavaScript-Funktion aufrufen onclick Ereignis, rufen Sie diese JavaScript-Funktion eine Java-Methode, die eine neue Tab erstellen und fügen Sie es an die Tabs.

Alles in diesem Moment gut geht, aber die BrowserComponent beginnt das Laden der CodeNameONe Homepage von selbst ohne Anweisung von mir, so dass ich mich gefragt, ob es ein Bug oder was. Ich benutze NetBeans 8.2 mit der letzten Version von CodeNameOne.

HINWEIS ich eine Java-Methode von JS Funktion in einem anderen Beispiel genannt mit auf Tabs und der Browser ist Ich denke, alle externen Seiten nicht geladen werden kann so im Zusammenhang Tabs mehr als irgend etwas anderes.

HINWEIS Ich bin mir sicher, dass kein Problem mit dem Code verbunden ist, aber ich habe ihn nach der Empfehlung veröffentlicht.

Dies ist die JavaScript-Funktion:

function openMessageFaceJS() 
    { 
     window.openMessageFace();     
    } 

und dies ist die Java-Methode

this.context.getWindow().//context is a JSObject 
      set("openMessageFace", (JSFunction) (who, are_you) -> 
      { 
       manager.openMessageFace(); 
       //look blow to see this method openMessageFace(); 
      }); 

Und in einer anderen Klasse die eigentliche Methode Code

public void openMessageFace() 
{ 
    //this operation is performed successfuly 
    Component component = create1(); 

    tabs.addTab("what (:", component); 
    sendMessageFacePosotiin = tabs.getTabCount() - 1; 
    tabs.setSelectedIndex(sendMessageFacePosotiin, true); 
} 
+0

Und wie genau das tun, erwarten Sie schützen sollte jemand zu helfen, wenn wir den tatsächlichen Code nicht sehen können? –

+0

@JimGarison Danke für interessante Ich habe den Code aus zwei Gründen nicht hochgeladen ** 1) ** der Code ist zu lang verteilt auf viele Klassen ** 2) ** wenn ich 'Java' Methode von 'JS' Funktion aufrufen es funktionierte gut, aber nicht in den 'Tabs' so glaube ich nicht, dass es eine Beziehung mit dem Code hat – Anas

+0

Kannst du aufhören, Codeformatierung übermäßig zu verwenden, bitte? Es ist für tatsächlichen Code, nicht für die Namen von Programmiersprachen. – bcsb1001

Antwort

1

Sie den Rückruf Aufruf bevor die Seite fertig geladen ist, so dass die "Brücke" noch nicht vollständig eingerichtet ist. Am sichersten ist es, alle JS-Bridge-Elemente in das OnLoad-Web-Event zu platzieren, um sicherzustellen, dass die Einrichtung abgeschlossen wurde.


BrowserComponent bc = new BrowserComponent(); 
bc.addWebEventListener("onLoad", e->{ 
    JavascriptContext ctx = new JavascriptContext(bc); 
    ... etc.... 
}); 

Das heißt, ich habe ein kleines Update gemacht, die gegen dieses Problem here

in der nächsten Bibliothek Update verfügbar sein wird (Freitag glaube ich)

+0

Danke @steve für interessant, aber die Rückruf "Java" -Methode wird erfolgreich aufgerufen, so dass die Seite vollständig erfolgreich geladen wird und auch wenn der Code verwendet wird, den Sie das Problem noch postete , ** das Problem ** ist wörtlich "Nachdem der Rückruf Java-Methode erfolgreich aufgerufen wird lädt der Browser eine Seite von selbst diese Seite ist Codename eine Homepage – Anas

+0

Ich schlage auch vor, eine Warteschlange für Skripte zu erstellen, die t ist Sie müssen ausgeführt werden, bevor die Seite vollständig geladen wurde, und wenn sie erfolgreich geladen wurde, führen wir sie sequenziell aus - (: – Anas

+0

Steve, ist es möglich, dass dies ein Nebeneffekt dieses Commits ist? https://github.com/codenameone/CodenameOne/commit/ce5bbd28e5e1bc297f292ccf30e550de08810250 –