Xamarin.Forms UWP - настройка WebView.Source как сценариев процессов HtmlWebViewSource дважды - PullRequest
0 голосов
/ 08 мая 2018

В UWP Xamarin.Forms, если у меня есть WebView, свойство Source которого установлено на тип UrlWebViewSource, оно работает как положено. НО, если для свойства Source задано значение HtmlWebViewSource, где для свойства Html задана строка, все <script> в HTML обрабатываются дважды .

Я создал совершенно новый проект Xamarin.Forms, где Content MainPage установлен в WebView в коде позади. Я настроил его так, чтобы я мог легко переключаться между установкой WebView.Source на UrlWebViewSource или HtmlWebViewSource:

public MainPage()
{
    InitializeComponent();

    var urlSource = new UrlWebViewSource { Url = "https://htmlpreview.github.io/?https://github.com/joelbyrd/external-resources/blob/master/storefulfillment/Printing/Packing/GNC-Pick.htm" };
    var htmlStringSource = new HtmlWebViewSource
    {
        Html = @"<!doctype html><html lang='en'><head><meta charset='utf-8'><meta http-equiv='x-ua-compatible' content='ie=edge'><meta name='viewport' content='width=device-width, initial-scale=1'><title>Test</title></head><body><div id='log'></div><p>some text</p><script>document.getElementById('log').innerHTML += `<p>Testing</p>`;</script></body></html>"
    };

    var webView = new WebView
    {
        Margin = new Thickness(0, 20, 0, 0),
        Source = urlSource, // displays as expected
        //Source = htmlStringSource // <script>'s are processed twice, appending "Testing" to the body twice
    };

    Content = webView;
}

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

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Test</title>
</head>
<body>
    <div id="log"></div>
    <p>some text</p>

    <script>
        document.getElementById('log').innerHTML += `<p>Testing</p>`;
    </script>
</body>
</html>

Когда я устанавливаю WebView.Source для ввода UrlWebViewSource, а для свойства Url устанавливается значение https://htmlpreview.github.io/?https://github.com/joelbyrd/external-resources/blob/master/storefulfillment/Printing/Packing/GNC-Pick.htm",, я получаю следующий ожидаемый результат:

enter image description here

НО Когда я устанавливаю WebView.Source для типа HtmlWebViewSource, со свойством Html, установленным в строку выше (пробелы вынуты и правильно экранированы), я получаю следующее:

enter image description here

Вы можете видеть, что "Тестирование" было добавлено в тело дважды. Это происходит только в UWP , поэтому я подозреваю, что это ошибка. Может кто-нибудь сказать мне, что здесь происходит, и если есть обходной путь?

...