繁体   English   中英

TWebBrowser:如何知道OnNewWindow2事件中的URL?

[英]TWebBrowser: How to know the URL in a OnNewWindow2 event?

我们的HTML具有:

<A target="_blank" href="http://blabla.com">

单击链接后,将OnNewWindow2

procedure TForm1.WebBrowser1NewWindow2(Sender: TObject;
  var ppDisp: IDispatch; var Cancel: WordBool);
begin
  Cancel := True;  
  // open in default browser
end;

我想在默认浏览器中打开链接:在默认浏览器中打开TWebBrowser链接

但是在我的情况下,不会BeforeNavigate2
我怎么知道TWebBrowser OnNewWindow2事件中的预期URL?


编辑:在较新版本的Delphi中有一个OnNewWindow3事件,它提供了我需要的URL。 目前,我真的很努力地开始了解如何将该事件实现到现有的TWebBrowser
如果有人这样做,获得一些帮助将是很棒的。

您可以覆盖浏览器的InvokeEvent方法,并在那里等待DISPID_NEWWINDOW3调度标识符。 对于中介类,可以这样实现OnNewWindow3事件:

uses
  ActiveX, OleCtrls, SHDocVw;

const
  DISPID_NEWWINDOW3 = 273;

type
  TWebBrowserNewWindow3 = procedure(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool;
    dwFlags: Longint; const bstrUrlContext: WideString; const bstrUrl: WideString) of object;

  TWebBrowser = class(SHDocVw.TWebBrowser)
  private
    FOnNewWindow3: TWebBrowserNewWindow3;
  protected
    procedure InvokeEvent(ADispID: TDispID; var AParams: TDispParams); override;
  public
    property OnNewWindow3: TWebBrowserNewWindow3 read FOnNewWindow3 write FOnNewWindow3;
  end;

implementation

procedure TWebBrowser.InvokeEvent(ADispID: TDispID; var AParams: TDispParams);
begin
  if (ADispID = DISPID_NEWWINDOW3) and Assigned(FOnNewWindow3) then
  begin
    FOnNewWindow3(Self, AParams.rgvarg^[4].pdispVal^, AParams.rgvarg^[3].pbool^,
      AParams.rgvarg^[2].lVal, WideString(AParams.rgvarg^[1].bstrVal), WideString(AParams.rgvarg^[0].bstrVal));
  end
  else
    inherited;
end;

我怎么知道TWebBrowser OnNewWindow2事件中的预期URL?

您可以使用DOM的getAttribute方法 但是在您加载所需的页面之前,以及在完成此操作之后,请用您自己的页面替换特定事件。 参见下面的代码:

uses
  ...
  SHDocVw, MSHTML;

type
  TForm1 = class(TForm)
    ...
    // Your auto-generated event handler
    procedure WebBrowser1DocumentComplete(ASender: TObject; 
      const pDisp: IDispatch; const URL: OleVariant);

  private
    // Your self-written event handlers
    procedure New_BeforeNavigate2(ASender: TObject;
      const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData, Headers: OleVariant; 
      var Cancel: WordBool);
    procedure New_NewWindow2(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
  end;

...

// Assign event handler in design-time
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; 
  const URL: OleVariant);
begin
  (ASender as TWebBrowser).OnBeforeNavigate2 := New_BeforeNavigate2;
  (ASender as TWebBrowser).OnNewWindow2 := New_NewWindow2;
end;

procedure TForm1.New_BeforeNavigate2(ASender: TObject; const pDisp: IDispatch; 
  const URL, Flags, TargetFrameName, PostData, Headers: OleVariant; 
  var Cancel: WordBool);
begin
  ShowMessage('New URL will be: ' + URL);
  Cancel := true;
end;

procedure TForm1.New_NewWindow2(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);
var
  S: String;
begin
  S := ((TWebBrowser(ASender).Document as IHTMLDocument2).ActiveElement as IHTMLElement).GetAttribute('href', 0);
  ShowMessage('New window''s URL is: ' + S);
  Cancel := true;
end;

现在,即使使用OnNewWindow2事件,您也可以获取URL。 对于情况target="_self" ,还存在OnBeforeNavigate2事件处理程序。 如果我正确回答了您的问题,它应该可以工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM