Как вызвать JavaScript в WebView Windows 10 UWP?

javascript c# webview uwp windows-10-universal

5230 просмотра

2 ответа

659 Репутация автора

Я пытаюсь загрузить JavaScript в WebView, чтобы сделать некоторые вычисления и получить вывод в виде строки. Я пытался использовать следующий код

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);
              };

Обновление Теперь я могу легко загружать простой javascript на основе помощи, предоставленной в ответе. Но теперь я сталкиваюсь с проблемами, когда в javascript есть более одной функции, я получаю исключение. Я пытаюсь следующий код

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>";

Пожалуйста, предложите.

Автор: Kinjan Bhavsar Источник Размещён: 18.07.2016 09:03

Ответы (2)


4 плюса

7053 Репутация автора

Решение

Документация для этой функции действительно плохая. Мне потребовалось некоторое время, чтобы понять, как вызывать Javascriptв UWPWebView

Когда вы впервые смотрите на вызов функции, webView.InvokeScriptAsync(string,string[])ваша первоначальная реакция заключается в том, что им нужно имя функции в качестве первого параметра, а затем параметр paramaeters в виде массива строк. (в основном потому, что в документации MSDN сказано это)

параметры

SCRIPTNAME

Тип: System.String [.NET] | Платформа :: Строка [C ++]

Имя функции скрипта для вызова.

аргументы

Тип: System.String [] [.NET] | Платформа :: Массив [C ++]

Массив строк, который упаковывает аргументы в функцию скрипта.

ОДНАКО, это неправильно и приведет к часам ударов головой. ДЕЙСТВИТЕЛЬНО, что они хотят, так это слово «eval» в первом параметре, а затем строковый массив функций и / или команд, которые вы хотите вычислить

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

Проработав несколько лет с API-интерфейсами Microsoft, я убежден, что это не намеченный способ использования этой функции, а что-то вроде хака. К сожалению, если вы хотите использовать JavaScript, это единственный известный мне способ, который работает в настоящее время.

Автор: Anthony Russell Размещён: 18.07.2016 12:09

0 плюса

101 Репутация автора

Энтони, попробуй проверить собственное предложение:

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

или же:

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

Так же, как предлагает Microsoft, просто вы ограничиваете имя функции одним («eval») - не обязательно. Поверьте мне, вы можете использовать любое имя функции, как я сейчас с UWP и раньше с гибридными приложениями Windows Phone.

Автор: Leonid Z Размещён: 15.11.2016 08:15
Вопросы из категории :
32x32