2

ommouseenter イベントを処理したいのですが、イベントが TWebBrowser から呼び出されません。onmousemove イベントを正常にキャッチしましたが。現在のブラウザ IE9。私のコード:

var
  D3: IHTMLDocument3;
begin

  if Supports(WebBrowser1.Document, IHTMLDocument3, D3) then
  begin
    eo1 := TEventObject.Create(self.EventHadler);
    D3.attachEvent('onmouseenter', eo1);
  end;
end;
4

3 に答える 3

4

その理由は、ommouseenter イベントがバブルしないためだと思います。IOW は、マウス ポインターがイベントをアタッチした要素の上に移動したときにのみ発生します。そのため、1 つの「一般的な」イベント ハンドラを使用することはできません。関与しているすべての要素にアタッチする必要があります。

于 2011-07-28T11:31:02.077 に答える
2

対象のすべての要素にイベント ハンドラーをアタッチする必要があります。すべての要素に関心がある場合は、すべての要素をループする必要があります。

var
  All: IHTMLElementCollection;
  Element2: IHTMLElement2;
  i: Integer;
begin
  Handler:= TEventObject.Create(Self.EventHandler);
  All:=(WebBrowser1.ControlInterface.Document as IHTMLDocument2).All;
  for i:=0 to All.Length-1 do
  begin
    Element2:=All.item(i,EmptyParam) as IHTMLElement2;
    Element2.AttachEvent('onmouseenter', Handler);
  end;
end;

したがって、理想的な世界ではDocumentComplete、関心のあるドキュメントを受け取った後にハンドラーをアタッチし、BeforeNavigate.

次の点に注意する必要がありますが、いくつかの問題が発生する可能性があります。

  • ドキュメントの読み込みが完了しない場合があります (これは、一部の広告サーバーがサービスを提供していないときに広告を含むフレームが原因であることが多いため、フレームによってメイン ドキュメントがDocumentComplete.
  • スクリプトはページを変更し、イベント ハンドラーがアタッチされていない要素を追加する可能性があります。
  • 手動でFRAMEs/に入りIFRAMEs、そこにハンドラーをアタッチする必要があります

また、あなたのアプローチと同じくらい簡単になることを願っています。これにより、この手間を大幅に省くことができます。

于 2011-07-28T15:55:06.783 に答える
1

ainが指摘したように、泡立ちonmouseenterませんが、MSDNが言うように、

onmouseover イベントとは異なり、onmouseenter イベントはバブルしません。つまり、ユーザーがオブジェクトに含まれる要素の上にマウス ポインターを移動しても onmouseenter イベントは発生しませんが、onmouseover は発生します。

したがって、 onmouseoverを使用できます。

このイベントは、ユーザーがマウス ポインターをオブジェクト内に移動すると発生し、ユーザーがマウス ポインターをオブジェクトの外に移動してからオブジェクト内に戻さない限り、繰り返されません。

procedure MyEvent;
var
  Doc: OleVariant;
begin
  Doc := Form1.WebBrowser1.Document;
  Form1.Label1.Caption := Doc.parentWindow.event.srcElement.outerHTML;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  D3: IHTMLDocument3;
begin
  if Supports(WebBrowser1.Document, IHTMLDocument3, D3) then
    D3.attachEvent('onmouseover', TEventObject.Create(MyEvent) as IDispatch);
end;
于 2011-07-28T16:06:29.230 に答える