2016-07-28 28 views
0

Ich verwende GeckoWebBrowser innerhalb meines VB.NET (Windows Form App) Programms. Die GeckoWebBrowser lädt eine lokale html Datei. Diese html hat inline eine svg Datei (human body diagram with bones and internal organs) mit einer javascript Funktion für die Aufnahme aller "IDs" der Elemente aus dem Dokument svg eingebettet. Ich möchte die oben genannte javascript Funktion von VB.NET (Windows Form App) anrufen, aber ich weiß nicht, wie es geht. Kann mir jemand helfen oder geben Sie mir bitte einen Quellcode? All das, was ich gefunden habe, mit Sitz in C# ... Dies ist meine javascript Funktion in meiner html Datei:VB.NET Gecko Web Browser Javascript Funktion aufrufen?

<script type="text/javascript"> 

(funcion() { 

// Function to be called in VB.NET when the DOM is loaded 


var SVGHandler = function() { 

    // Picking up the id Root Node="CUERPO_HUMANO" into svg variable 

    var svg = document.querySelector('#CUERPO_HUMANO'); 


    // In Items we save all the <g> which have an ID 

    var items = svg.querySelectorAll('g[id], path[id]'); 

    //var items = svg.querySelectorAll('g[id]'); 

    // We loop all the nodes saved in Items and add them to click event listener 

    forEach(items, function (index, value) { 

     value.addEventListener('click', function (event) { 



       event.preventDefault(); 

       //We avoid the spread of events 
       event.stopPropagation(); 





       return event.currentTarget.id 

       // console.log(event.currentTarget.id) 

      }); 

    }); 



} 

// https://toddmotto.com/ditch-the-array-foreach-call-nodelist-hack/ 

var forEach = function (array, callback, scope) { 

    for (var i = 0; i < array.length; i++) { 

    callback.call(scope, i, array[i]); // passes back stuff we need 

    } 

}; 



// With this method, we call a SVGHandler when DOM is totally loaded 

document.addEventListener('DOMContentLoaded', SVGHandler); 

})(); 

</script> 

Welcher Code sollte ich in VB.NET für den Aufruf meiner javascript Funktion jedes Mal, wenn ich auf einen Klick spezifischer Knochen oder Organ im menschlichen Körper Diagramm geladen in GeckoWebBrowser? Ich möchte die "ID" speichern, die mit dem Aufruf in eine string Variable aufgenommen wurde, um es als einen Parameter in einer SQL-Anweisung zu verwenden und eine DataGridView aufzufüllen. Ich habe gesucht und alles, was ich finden konnte, war im Zusammenhang mit C#, kein einziges VB.NET Beispiel. Obwohl ich versuchte, die Äquivalenz in VB.NET herauszufinden, die C# Beispiele zu VB.NET zu konvertieren, habe ich einige Zweifel, wie man den javascript Aufruf macht. Nach meiner javascript Funktion so etwas wie dies Es könnte sein:

browserControl.Navigate("javascript:void(funcion())"); 

Bitte, Kann jemand mir helfen, dieses Problem zu lösen? Ich wäre sehr dankbar ...

Antwort

1

Nun, seit Sie festgelegt haben, klicken Sie EventListener 's Ich denke, dass Sie nicht nach einer Möglichkeit suchen, die schließliche Funktion von VB.NET anrufen, aber das ist ziemlich unklar, nach Ihrem Beitrag, damit ich Ich werde Ihnen Beispiele geben, wie Sie eine javascript Funktion aufrufen und wie Sie eine Reaktion in Ihrem VB.NET Code durch javascript unter Verwendung von GeckoWebBrowser auslösen können.

Ihr Code-Snippet Ihres Versuches, eine js-Funktion von Ihrem Vb-Code aufzurufen, ist korrekt. Das einzige Problem ist, dass Sie in Ihrer html Datei keine aufrufbare js Funktion definiert haben. In Ihrem Fall sollten Sie dies tun, um Ihre Haupt js Funktion von vb auslösen:

//Sorry I don't know vb. I'll give example in c# keeping it as simple as possible so that you can easily convert it to vb 

Gecko.GeckoHtmlElement humanBodyPart = (Gecko.GeckoHtmlElement) browserControl.Document.GetElementById("your id"); 
humanBodyPart.Click(); 

Der obige Code findet das Element mit der entsprechenden ID im GeckoWebBrowser und darauf klickt. Da Sie auf EventListener geklickt haben, wird durch Klicken auf eines der Elemente die ihnen zugewiesene Funktion ausgelöst.

Weiter, um die ID der Elemente zu einer string Variable in Ihrem Vb-Code zu speichern, müssen Sie diese kleine js-Code in den Code hinzufügen, die Sie als 'Rückruf' Parameter in Ihrem übergeben forEach Funktion:

var event = document.createEvent('MessageEvent'); 
var origin = window.location.protocol + '//' + window.location.host; 
var event = new MessageEvent('jsCall', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': 'YOUR EVENTUAL ID AS A STRING (THIS STUFF GOES BACK TO THE VB/C# CODE)' }); 
document.dispatchEvent (event); 

Dann wurde das obige snippet sollte in Ihrem vb Code wie folgt behandelt werden:

browserControl.AddMessageEventListener("jsCall", (id) => 
{ 
    //Here in the variable id you have your clicked id as a string. Do what you wanted to do... 
}); 
0

VB Seite: Sie warten müssen, bis das Dokument Hörer hinzufügen abgeschlossen ist zum Beispiel: _DocumentCompleted

Private Sub GeckoWebBrowser1_DocumentCompleted(sender As Object, e As Gecko.Events.GeckoDocumentCompletedEventArgs) Handles GeckoWebBrowser1.DocumentCompleted GeckoWebBrowser1.AddMessageEventListener("my_function_name JS_side", AddressOf my_sub_for_treatment) End Sub

JS side:

var event = document.createEvent('MessageEvent'); 
 
var origin = window.location.protocol + '//' + window.location.host; 
 
var event = new MessageEvent('my_function_name JS_side', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': my_data_to transfer }); 
 
document.dispatchEvent (event);