1

私は数時間、おそらく数日を非常に奇妙な問題に費やしました:(

Wicket ソリューションに基づくアプリケーションを作成しています。IE9、IE10、Chrome、および FF で完全に動作します。奇妙なことに、IE8 でもテストしたところ、99% のケース (異なるコンピューター上の IE インスタンス + まったく同じバージョンの IE8) で動作します。しかし今、問題。

問題: AjaxLink ボタンで動的コンテンツを 作成しています。ボタンをクリックすると、WebMarkupContainer モデルが変更され、WebMarkupContainer が更新されます (Ajax に基づいているため、ページは完全に再読み込みされませんが、コンテナーのみが再読み込みされます)。

コンテナ内のすべてのアイテムに AjaxFormComponentUpdatingBehavior が追加されました。onComponentTag メソッドで、tag.put("onchange","some jsFunctionCalling...."); を追加します。問題は、アイテムをクリックした後、イベントが呼び出されないことです。.add(new AttributeModifier.....) に onchange リスナーを追加しようとしましたが、結果は同じです。私が言ったように、別の PC で同じバージョンの IE で同じコードを試してみたところ、完全に動作しました。興味深いのは、ページの更新後、WebMarkupContainer に新しい項目が追加されるまで、すべてが完璧に機能することです。その後、ページが再度更新されるまで、項目リスナーは機能しません。

私が得た最新のアイデアの 1 つは、問題はコードではなく、IE の設定 (おそらくセキュリティ) にあるということです。誰にもアイデアはありますか?どのような設定が異なると、これらの問題を引き起こす可能性がありますか? これを解決できる Wicket サイトの設定はありますか? これらのリスナーが ajax 経由で動的に追加された場合、これらのリスナーの DOM への登録をブロックできる設定はありますか?

4

3 に答える 3

1

私は試していませんが、試すことができる3つのオプションがあります。

  1. 自分で「onchange」を追加する代わりに、追加OnChangeAjaxBehaviorしてすべてを wicket で動作させます。欠点は、すべてのイベントでのサーバー ラウンドトリップです。
  2. データ属性 ( AttributeModifier.append("data-param1", "foobar")) を追加して、パラメーターを html にプッシュajaxRequestTarget.appendJavaScript("attachOnChangeHandler()"); し、AjaxLink のクリック イベントの後に呼び出します。attachOnChangeHandler()onchange ハンドラを必要とするすべてのアイテムに追加するには、js 関数にする必要があります。また、データ属性を介してパラメーターにアクセスできます。
  3. Wicket 6 以降: Wicket と多くの js が混在するのを避けるために、グローバル AJAX イベントの 1 つにサブスクライブできます。あなたの場合の解決策は、2 の場合とほぼ同じです。「/ajax/call/success」のリスナーを js に追加し (id をチェックして、呼び出しがコンポーネントに関連しているかどうかを確認してください)、そこに onchange ハンドラーを追加します。これは、カスタム js と Wicket を混在させない最適なソリューションです。

@peterchon によって提供される解決策 (DOM 内でウィケットに置き換えられる要素よりも高い位置にイベント ハンドラーをアタッチする) は、他のすべてのケースで機能しますが、input、textarea、および select 要素にのみ適用される "onchange" があります。

ところで、ページ全体がレンダリングされ、ブラウザーがハンドラーを適切にアタッチできるため、ページは更新後に「機能」しています。

于 2013-11-23T11:25:29.633 に答える
0

この方法を試すことができます:

/* this will catpure the target that triggered the event */
function getEventTarget( e ) {
  e = e || window.event;
  return e.target || e.srcElement;
}

function doSomething( e ) {
  var that = getEventTarget( e );
  if( that.tagName.toLowerCase() === 'a' ) { // specify the target, in this cas <a>
    // Do something
  }
}

parentElement.onclick = doSomething;

このスクリプトは基本的にすべてのイベントをキャプチャし、ターゲットの変数を何かを実行する関数に渡します。

うまくいけば、これはあなたのために働くでしょう。

于 2013-11-21T19:28:39.967 に答える