2016-05-10 8 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として返し、 'C#で' WebRequest'を実行します。完了すると 'UI'を更新するために' JS'を実行します。私はこのアプローチを特にお勧めしません。下記の代替案を見てください。 – amaitland

答えて

1

まず、SchemeHandlerはこのシナリオでは適していない可能性があります。回答を提供する際には通常SchemeHandlerを実装します。

ほとんどの人は、オブジェクトをバインドすることを選択し、親アプリケーションと通信したいときにバインドされたオブジェクトに対してメソッドを呼び出します。例はFAQを参照してください。 49.0.0https://github.com/cefsharp/CefSharp/wiki/Frequently-asked-questions#3-how-do-you-expose-a-net-class-to-javascript

あなたは根本的な応答バッファへのアクセスを得るためにResponseFilterを実装することができ、それは十分に文書化、複雑ではありませんので、あなたが快適ではない参照C++コードを掘り場合は、このオプションはあなたのためではありません。ここに参照がありますhttps://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Example/Filters/PassThruResponseFilter.cs#L17

+0

wikiへのリンクは本当に役に立ちます。私はオブジェクトを束縛するとは思わなかった...これは本当に私にとっては良い解決策になるかもしれない。私は今晩早くそれをテストするつもりです。 実際、いいえ、私はC++にはあまり慣れていません。私は基本的なC++をいくつか知っていますが、その方法の使い方を理解するのに十分な深さではないと思います。私は自由な時間があるとすぐにそれを試してみますが、その間に私は最初の解決策に行くことを確信しています。 –

-1

私がしたことは、ajax呼び出しの応答であるIDを使ってjavascriptでページに要素を作成したことです。たとえば、ajax呼び出しを行うと、ajax呼び出しにIDを割り当てます。

ajax呼び出しが返ってくると、あらかじめ割り当てられたIDとコールバック情報を持つ要素をページに書き出します。次に、cefsharpを使用してページから要素の内容を読み取ることができます。これがコールバック情報になります。 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); 
}); 

と後そして

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

そして

chromeBrowser.GetMainFrame(C#でcefsharpからTexAreaはを読み取る)。EvaluateScriptAsync(関数()。 .. $(textareaInfo).value)。結果

関連する問題