3

Sencha Touch アプリがあります。アプリケーション外 (別の Web サーバー) へのリンクを含むページを含む、さまざまなコンテンツが表示されます。私たちが行ったことは、リンクを処理するために inappbrowser プラグインを追加したことです。

this.getItemsDetail().element.on('tap', function(event, target) {
        event.preventDefault();
        window.open(target.href, '_blank');
        console.log('tap');
    }, this, {delegate : 'a'});

これは機能します - 「タップ」がログに記録されます。子ブラウザが開きます。問題は、イベントが「失敗」し、inappbrowser を見逃して、メインの Web ビューに読み込まれることがあります。inappbrowser クラスでデバッグを切り替えることができました。ログは下部にあります。

問題は、この問題が一貫していないことです。再現が難しい場合もあります。クリックしてみると、それが起こります。コアは

2013-11-18 14:11:18.362 CDVWebViewDelegate: Navigation started when state=1
2013-11-18 14:11:18.363 Failed to load webpage with error: CDVWebViewDelegate: Navigation started when state=1

メッセージの正確な意味がわかりません。コードから、「状態 1」は「STATE_WAITING_FOR_LOAD_START」のように見えます

typedef enum {
    STATE_IDLE,
    STATE_WAITING_FOR_LOAD_START,
    STATE_WAITING_FOR_LOAD_FINISH,
    STATE_IOS5_POLLING_FOR_LOAD_START,
    STATE_IOS5_POLLING_FOR_LOAD_FINISH,
    STATE_CANCELLED
} State;

それでも、何が間違っているのか、Webページを「正しい」状態でロードする方法がわかりません。

16.285 tap
16.300 webView shouldLoad=1 (before) state=0 loadCount=-1 URL=http://spokendata.com/
16.300 webView shouldLoad=1 (after) isTopLevelNavigation=1 state=1 loadCount=0
16.301 webView didStartLoad (before). state=1 loadCount=0
16.301 webView didStartLoad (after). state=2 loadCount=1 fireCallback=1
16.465 webView didFinishLoad (before). state=2 loadCount=1
16.466 webView didFinishLoad (after). state=0 loadCount=0 fireCallback=1
18.362 webView shouldLoad=1 (before) state=1 loadCount=0 URL=http://spokendata.com/
18.362 CDVWebViewDelegate: Navigation started when state=1
18.363 Failed to load webpage with error: CDVWebViewDelegate: Navigation started when state=1
18.364 webView shouldLoad=1 (after) isTopLevelNavigation=1 state=1 loadCount=0
18.438 webView didStartLoad (before). state=1 loadCount=0
18.439 webView didStartLoad (after). state=2 loadCount=1 fireCallback=1
18.439 Resetting plugins due to page load.
18.553 webView didFinishLoad (before). state=2 loadCount=1
18.553 webView didFinishLoad (after). state=0 loadCount=0 fireCallback=1
18.553 Finished load of: http://spokendata.com/
18.995 webView shouldLoad=1 (before) state=0 loadCount=0 URL=http://spokendata.com/demo
18.996 webView shouldLoad=1 (after) isTopLevelNavigation=1 state=1 loadCount=0
18.997 webView didStartLoad (before). state=1 loadCount=0
18.997 webView didStartLoad (after). state=2 loadCount=1 fireCallback=1
18.997 Resetting plugins due to page load.
19.152 webView didFinishLoad (before). state=2 loadCount=1
19.152 webView didFinishLoad (after). state=0 loadCount=0 fireCallback=1
19.153 Finished load of: http://spokendata.com/demo

Cordova 3.1.0-0.1.0 を使用しています

更新: ときどき発生します。機能する場合もあれば、機能しない場合もあります。さまざまなページ(大小)で発生します。問題を再現できるアプリ ( https://github.com/tomasfejfar/cordova-bug-01 ) を作成しました。「google.com」の代わりに「seznam.cz」を表示するのに十分な長さの「SEZNAM」リンクをクリックしてみてください...

4

1 に答える 1

3

これを回答として追加して、この質問が回答済みとしてリストされるようにします。

私たちは実際に問題を Sencha Touch イベント ハンドラーに遡りました。それらは実際の dom 要素の作成と削除を処理する必要があるため、非常に特殊です (div は定期的に作成および削除されます)。イベントは、Ext.Container のような上位レベルの「要素」に関連付けられます。これは div の Ext 表現であり、使用時に作成されます。後で削除して、しばらく再作成した後に (別の DOM 要素として) 表示することもできます。これにより、DOM イベントをバインドできなくなります。したがって、Sencha はこれを内部的に処理します。内部ハンドルはどういうわけか無視しますevent.preventDefault()、これにより、リンクが webview と childbrowser の両方に読み込まれます (つまり、そうです、あなたは非常に正しいです、Uncharted Space)。最も簡単な解決策は、依然として「非 href href」(data-href) を使用することでした。しかし、これがオプションでない場合は、内部の Sencha イベント システムを使用して解決できる場合があります。

于 2013-12-11T00:01:23.637 に答える