Как открыть всплывающие окна в том же WebView (не в новом окне) в Windows UWP?

У меня есть WebView в моей программе UWP, которая отлично работает EXCEPT, когда я нажимаю кнопку, которая обычно открывается в новом окне (всплывающее окно).

Когда я нажимаю кнопку, которая обычно открывается в новом окне, я просто хочу, чтобы она открывалась в том же WebView, но она открывается в моем браузере по умолчанию. Есть ли настройка, которую я могу установить, чтобы исправить это?

Update:

Я ответил на свой первоначальный вопрос. Я добавил обработчик событий NewWindowRequested, открыл

args.uri

в том же webview, а затем сказал

e.handled=true

У меня есть новая проблема, хотя это, вероятно, только с jeopardy.com. Я пытаюсь сделать "Watson", который будет отвечать на вопросы Google, но когда я открою тест практики, он никогда не запустится.

Итак, в основном в моем WebView я перехожу в https://www.jeopardy.com/be-a-contestant/practice-tests  и нажмите "Принять практический тест". Когда он открывает новые окна, таймер не запускается. Я думаю, они пытаются помешать людям использовать программы по их вопросам. У кого-нибудь есть обход?

Также он работает для меня

введите описание изображения здесь

В отличие от Webview, который выглядит как (правая сторона)

введите описание изображения здесь

Вы думаете, что это может быть связано с функцией javascript или размером окна?

UPDATE2:

Для тех, кто хочет помочь, вот github repo:

https://github.com/SethKitchen/JeopardyWinner

Ответы

Ответ 1

Я посмотрел на вашу проблему. Фактически, вам нужно инициализировать вторую страницу, с некоторыми данными, созданными на первой странице. Если вы напрямую переходите ко второй странице (https://www.jeopardy.com/be-a-contestant/practice-test-client) со стандартным браузером, вы будете иметь то же поведение, что и тот, который у вас есть в вашем UWP приложение.

Если вы запустили инструмент отладчика своего браузера (F12), вы увидите, что основные сценарии:

Итак, мне удалось запустить таймер, введя некоторый контент на второй странице с помощью консоли отладчика (я протестировал это с помощью Firefox). Вот шаги для выполнения (скопируйте/вставьте все это в свою консоль и выполните его):

var s = document.createElement("script");s.type = "text/javascript";s.src = "https://www.jeopardy.com/Assets/jeopardy/easyxdm/exdm_helper.js";$("head").append(s); 

s.src = "https://www.jeopardy.com/Assets/jeopardy/js/main.js";$("head").append(s);

s.src = "https://www.jeopardy.com/Assets/jeopardy/js/practice_test_launcher.js";$("head").append(s);

backendUserCheck(); test_launcher.init();test_launcher.testWindow = window;

$('body').append('<div data - testfile = "/Assets/jeopardy/json/test_practice_2011.json" data - testid = "1" class="button launch_practice_test" data-testtype="adult">Take the practice test</div>');

var button = $('.launch_practice_test');test_launcher.testQuestionsFile = button.attr('data-testfile');test_launcher.testType = button.attr('data-testtype');test_launcher.testTitle = button.attr('data-testtitle');test_launcher.testID = button.attr('data-testid');

testModule.parentRef=test_launcher;

testModule.deleteLocalStorage();
testModule.checkLocalStorage();
testModule.getLocalStorage();
testModule.testID = testModule.parentRef.getTestID();
testModule.testType = testModule.parentRef.getTestType();
testModule.testFile = testModule.parentRef.getFile();
testModule.hardwareTest = testModule.parentRef.checkIfDryRun();

testModule.sendTestStart();

trace = function(){};

trace = {
    output  : true,
    queue   : [],

    push    : function(data)
    {
        trace.queue.push(data);
        if(trace.output)
        {
            trace.post();
        }
        return
    },

    post    : function()
    {
        $.each(trace.queue, function(i,arr)
        {
            trace.log(arr);
        });
        trace.queue = [];
        return
    },

    dump    : function()
    {
        trace.post();
        return
    },

    log     : function(data)
    {
        if (!window.console){ console = {log: function() {}} };
        console.log(data);
        return
    }
};

testModule.loadQuiz();
testModule.parentRef=test_launcher;
testModule.startDate = testModule.parentRef.getStartDateInMS();

Этот код инициализации извлекается из событий onload или методов init из 2 основных сценариев, о которых я говорил ранее. Таймер отменяется, но после этого вопросы не появляются. Я думаю, что ему не хватает кода из alertParent и setTestData, расположенного в practice_test_client.js. Я разрешаю вам отлаживать веб-страницу и находить необходимые методы для выполнения.

Чтобы заставить его работать в вашем UWP, вы должны вводить эти данные в свой веб-просмотр. Для этого вы можете попробовать метод InvokeScriptAsync или загрузить страницу с помощью HttpClient и добавить в нее команду инициализации перед загрузкой результирующей страницы в ваш webView:

string content = "";
using (HttpClient client = new HttpClient())
{
    content = await client.GetStringAsync(new Uri("https://www.jeopardy.com/be-a-contestant/practice-test-client"));
}

Ответ 2

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