2011-12-23 23 views
1

Windows PhoneアプリのWebブラウザーコントロールに履歴があるかどうかを確認する必要があります。その方法は、browser.InvokeScript("eval", "if(history.length > 0){ history.go(-1) }");を使用して行います。 WebBrowserに履歴がある場合にのみ関数を呼び出すことができるように、変数を設定するためにこのメソッドまたは他のメソッドを使用する必要があります。私はそれを設定する方法を把握することはできません。InvokeScriptでC#変数を変更する

私が使用している完全なコードはこれです:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
     { 

      var hasHistory = true; 

      browser.InvokeScript("eval", "if(history.length > 0){ history.go(-1) }"); 

      if (AppSettings.Default.ExitWarning) 
      { 
       if (!hasHistory) {      
        if (MessageBox.Show("Are you sure you want to exit?", "Exit?", MessageBoxButton.OKCancel) != MessageBoxResult.OK) 
        { 
         e.Cancel = true; 
        } 
       } 
      } 
     } 

答えて

1
hasHistory = (bool)browser.InvokeScript("eval", "return (history.length > 0);"); 

あなたが実行されるスクリプトによって返されるオブジェクトであるobjectを返すInvokeScript方法。

次のコードは少しハッキリですが、ほとんどの場合は正常に動作するようです。

 bool hasHistory = false; 
     try 
     { 
      webBrowser1.InvokeScript("eval"); 
      hasHistory = true; 
     } 
     catch (SystemException ex) 
     { 
      hasHistory = false; 
     } 
+0

は私がSystemExceptionは80020101を取得します。どんな考え? – JacobTheDev

+0

JavaScriptが無効であると思われます。私はストレートJSに精通していない、ちょうどjQuery、リターン関数はどのように機能しますか? – JacobTheDev

+1

'eval'はjavascript組み込み関数です。何らかの理由で空のeval文字列でも例外がスローされます。 –

3

あなたのアプローチに欠陥がありますか? history.lengthの値を使用して、現在のページを示すことはできません。前方と後方をナビゲートすると、履歴の長さは2になり、前方へのナビゲーションが可能になります。

私はC#のコードでナビゲーションを追跡することによってこの問題を解決:このブログの記事で説明したように

/// <summary> 
/// Handles the back-button for a PhoneGap application. When the back-button 
/// is pressed, the browser history is navigated. If no history is present, 
/// the application will exit. 
/// </summary> 
public class BackButtonHandler 
{ 
    private int _browserHistoryLength = 0; 
    private PGView _phoneGapView; 

    public BackButtonHandler(PhoneApplicationPage page, PGView phoneGapView) 
    { 
    // subscribe to the hardware back-button 
    page.BackKeyPress += Page_BackKeyPress; 

    // handle navigation events 
    phoneGapView.Browser.Navigated += Browser_Navigated; 

    _phoneGapView = phoneGapView; 
    } 

    private void Browser_Navigated(object sender, NavigationEventArgs e) 
    { 
    if (e.NavigationMode == NavigationMode.New) 
    { 
     _browserHistoryLength++; 
    } 
    } 

    private void Page_BackKeyPress(object sender, CancelEventArgs e) 
    { 
    if (_browserHistoryLength > 1) 
    { 
     _phoneGapView.Browser.InvokeScript("eval", "history.go(-1)"); 
     _browserHistoryLength -= 2; 
     e.Cancel = true; 
    } 
    } 
} 

:私はいくつかの理由であることを使用する場合

http://www.scottlogic.co.uk/blog/colin/2011/12/a-simple-multi-page-windows-phone-7-phonegap-example/

関連する問題