2016-05-10 6 views
1

Я действительно новичок в браузере CefSharps Chromium и затрудняюсь выяснить, как получить результат запроса jQuery ajax.CefSharp - Получить результат запроса AJAX

Моя первая попытка состояла в том, чтобы передать мой запрос AJAX EvaluateScriptAsync. На самом деле скрипт работает. Он делает именно то, что я хочу, но я не получаю никаких кодов результатов/статусов, потому что моя Cef-Task не ждет, пока AJAX завершит свою работу.

Вот пример (всего лишь пример кода):

var tasks = pdBrowser.EvaluateScriptAsync(@" 
    (function(){ 
     $.ajax({ 
      type: ""POST"", 
      dataType: ""json"", 
      cache: false, 
      url: ""_resources/php/ajaxRequests.php"", 
      async: false, 
      data: { 
       action: ""insertCrossPlatform"", 
       type: """", 
       values: JSON.stringify(""foo bar"") 
      }, 
      success: function(response) { 
       if (typeof response === 'string' && response.substring(0, 5) == ""ERROR"") 
       { 
        return response; 
       } 
        else 
       { 
        //pageReload(); 
        return ""OK""; 
       } 
      }, 
      error: function(xhr, textStatus, errorThrown) { 
       return errorThrown + ""\n"" + xhr.responseText; 
      }, 
      complete: function() { 
       return ""COMPLETE""; 
      } 
     }); 
    })();", null); 

tasks.ContinueWith(t => 
{ 
    if (!t.IsFaulted) 
    { 
     var response = t.Result; 
     if (response.Success) 
     { 
      if (response.Result != null) 
      { 
       MessageBox.Show(response.Result.ToString()); 
      } 
     } 
     else 
     { 
      MessageBox.Show(response.Message, "Ein Fehler ist aufgetreten", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     } 
    } 
}, TaskScheduler.Default); 

Потом я прочитал, что есть SchemeHandler, но я не правильно понять, как его реализовать. Может кто-нибудь мне помочь?

Заранее спасибо.

+0

Если вы вернули значение в своем анонимном закрытии, это будет возвращено в результате 'EvaluateScriptAsync'. Вы можете вернуть params как json, а затем выполнить 'WebRequest' в' C#', после чего выполните более 'JS', чтобы обновить свой' UI'. Я не особо рекомендую этот подход, см. Альтернативы ниже. – amaitland

ответ

1

Во-первых, SchemeHandler вряд ли будет подходящим в этом сценарии, вы обычно применяете SchemeHandler, когда вы предоставляете ответ.

Большинство людей предпочитает связывать объект и вызывать метод на своем связанном объекте, когда они хотят общаться с родительским приложением. См. Пример FAQ. https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#3-how-do-you-expose-a-net-class-to-javascript

С 49.0.0 вы можете реализовать ResponseFilter, чтобы получить доступ к основному буферу ответа, это сложное и не очень хорошо документирован, так что если вы не удобно рыться ссылки C++ код, то этот вариант не для вас. Вот ссылка https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Example/Filters/PassThruResponseFilter.cs#L17

+0

ссылка на wiki действительно полезна. я не думал привязывать объект ... это действительно может быть хорошим решением для меня. Сегодня вечером я собираюсь проверить это как можно скорее. На самом деле, нет, мне не очень нравится C++. Я знаю некоторые основные C++, но я думаю, что это не так глубоко, чтобы понять, как использовать этот метод. Я дам ему попробовать, как только у меня будет свободная минута, но тем временем я уверен, что я пойду на первое решение, связав этот объект. –

-1

Что-то, что я сделал, это создать элемент на странице через javascript с идентификатором, который является ответом вызова ajax. Так, например, когда вы делаете вызов ajax, назначьте ID для вызова ajax.

Когда вызов ajax возвращается, напишите элемент на странице с предварительно назначенным идентификатором и информацией обратного вызова. Затем вы можете просто использовать cefsharp для чтения содержимого элемента со страницы, и это будет ваша информация обратного вызова.

var myDivElement =document.getElementById('textareaInfo'); 

if(myDivElement === null) 
{ 
var input = document.createElement('textarea'); 
input.id = "textareaInfo"; 
input.value = "Test" 
input.rows="4"; 
input.cols="50"; 
input.style="height:100%;width:900px;" 

var dom = document.getElementsByClassName("page-body")[0]; 
dom.insertAdjacentElement('afterbegin', input) 
} 

Затем позже с помощью AJAX

var root = 'https://jsonplaceholder.typicode.com'; 

var _holder = callbackObj; 

callbackObj.showMessage(""ajax""); 

$.ajax({ 

    url: root + '/posts/1', 
contentType: 'application/json; charset=utf-8', 
    method: 'GET', 
complete: function(data){ 

}, 
success: function(response) { 

    $(#'textareaInfo').value(response);     
         } 
}).then(function(data) { 
    callbackObj.showMessage(data); 
}); 

Затем прочитать texarea из cefsharp в C#

chromeBrowser.GetMainFrame(). EvaluateScriptAsync (функция(). .. $ (textareaInfo) .value). Результат

Смежные вопросы