2016-07-18 20 views
1

Ich versuche, ein JavaScript in WebView zu laden, um einige Berechnungen durchzuführen und die Ausgabe in einer Zeichenfolge zu erhalten. Ich habe versucht, folgenden Code leichtWie Javascript in WebView Windows 10 UWP aufrufen?

string htmlFragment = "<html><head><script type='text/javascript'>" + 
        "function doubleIt(incoming){ " + 
        " var intIncoming = parseInt(incoming, 10);" + 
        " var doubled = intIncoming * 2;" + 
        " document.body.style.fontSize= doubled.toString() + 'px';" + 
        " return doubled.toString());" + 
        "};" + 
        "</script></head><body>" + 
        "<div id = 'myDiv'>I AM CONTENT</div></body></html>"; 
      htmlView.NavigateToString(htmlFragment); 
      htmlView.LoadCompleted += async(s1,e1) => 
       { 
        string result = await htmlView.InvokeScriptAsync("eval", new string[] { "doubleIt(25)" }); 
        Debug.WriteLine(result); 
       }; 

aktualisieren Ich bin in der Lage einfache Javascript verwenden jetzt in der Antwort zur Verfügung gestellt, basierend auf Hilfe zu laden. Aber jetzt habe ich Probleme, wenn es mehr als eine Funktion in Javascript gibt, ich bekomme eine Ausnahme. Ich versuche den folgenden Code

string htmlFragment = @"<html><head><script type='text/javascript'>" + 
        "function a(){return 10;};" + 
        "function b(){return 20;};" + 
        "function c(){return 30;};" + 
        "return (a()*b()*c());" + 
        "</script></head><body>" + 
        "<div id = 'myDiv'>I AM CONTENT</div></body></html>"; 

Bitte schlagen Sie vor.

+1

Mögliches Duplikat von [So rufen Sie JavaScript-Funktionen in einem WebView in Universal Windows App auf] (http: // stackoverflow.com/questions/36286761/how-to-invoke-javascript-funktionen-in-einem-webview-in-universal-windows-app) – Kinani

+0

@Kinani Ich verwendete die gleiche, aber nicht sicher, warum es Wert leer gibt. –

+0

Sie müssen die window.external.notify loswerden und tatsächlich eine Rückgabe Ihres Wertes –

Antwort

2

Die Dokumentation für dieses Feature ist wirklich schlecht. Es dauerte einige Zeit, um herauszufinden, wie Javascript in UWP aufzurufen WebView

Beim ersten Blick auf die Funktionsaufruf webView.InvokeScriptAsync(string,string[]) Ihre erste Reaktion ist, dass sie den Namen der Funktion als ersten Parameter wollen und dann die Funktion paramaeters als Zeichenfolge Array. (mainly because the MSDN documentation says this)

Parameter

script

Typ: System.String [.NET] | Platform :: String [C++]

Der Name der aufzurufenden Skriptfunktion.

Argumente

Typ: System.String [] [.NET] | Platform :: Array [C++]

Ein Zeichenfolgenarray, das Argumente an die Skriptfunktion packt.

JEDOCH ist das falsch und wird zu stundenlangem Hämmern führen. Wirklich, was sie wollen, ist das Wort „eval“ im ersten Parameter und dann von Funktionen eines String-Array, und oder Befehle, die Sie

var value = await webViewer.InvokeScriptAsync("eval", 
     new string[] 
     { 
     "functionName(functionParams)" 
     }); 

Nachdem arbeitete mit Microsoft APIs für ein paar Jahre eval wollen jetzt bin ich überzeugt, Das ist nicht der beabsichtigte Weg, diese Funktion zu konsumieren und ist ein bisschen wie ein Hack. Leider, wenn Sie JavaScript konsumieren möchten, ist dies die einzige Möglichkeit, die ich weiß, die derzeit funktioniert.

+0

Ich versuchte, basierend auf Ihrem Vorschlag, aber immer noch den Wert als leer. Ich habe meinen Code im 'LoadCompleted' Event aktualisiert. Können Sie bitte vorschlagen? –

+0

Werden Sie das Fenster los.Notify und tatsächlich eine Rückgabe Ihres Wertes –

+0

Dank jetzt funktioniert es. Können Sie vorschlagen, warum aufgrund von window.notify, verursacht es Problem? –

0

Anthony, Versuchen Sie, Ihren eigenen Vorschlag zu überprüfen:

await webViewer.InvokeScriptAsync("eval", 
    new string[] 
    { 
    "functionName(functionParams)" 
    }); 

oder:

await webViewer.InvokeScriptAsync(functionName, new string[]{ functionParameters }); 

Die gleichen wie Microsoft schlägt vor, nur werden Sie von einem einen Funktionsnamen zu begrenzen ("eval") - nicht nötig. Vertrau mir, du kannst einen beliebigen Funktionsnamen verwenden, wie ich jetzt bei UWP bin und vorher mit Windows Phone Hybrid Apps.