Delphi 如何触发HTML表单的onsubmit事件?

Delphi 如何触发HTML表单的onsubmit事件?,delphi,mshtml,twebbrowser,Delphi,Mshtml,Twebbrowser,我正在尝试使用MSHTML从Delphi应用程序触发HTML表单的onsubmit事件。我曾尝试使用IHTMLFormElement::submit和IHTMLDocument4::FireEvent方法,但都没有触发表单的onsubmit事件 这是我的第一次尝试: var Document: IHTMLDocument4; FormElement: IHTMLFormElement; begin Document := (WebBrowser.Document as IHTMLDo

我正在尝试使用MSHTML从Delphi应用程序触发HTML表单的onsubmit事件。我曾尝试使用IHTMLFormElement::submit和IHTMLDocument4::FireEvent方法,但都没有触发表单的onsubmit事件

这是我的第一次尝试:

var
  Document: IHTMLDocument4;
  FormElement: IHTMLFormElement;
begin
  Document := (WebBrowser.Document as IHTMLDocument4);
  FormElement := (Document as IHTMLDocument2).Forms.item('form', 0) as IHTMLFormElement;
  FormElement.submit;
end;
这是我的第二次尝试:

var
  Document: IHTMLDocument4;
  FormElement: IHTMLFormElement;
begin
  Document := (WebBrowser.Document as IHTMLDocument4);
  FormElement := (Document as IHTMLDocument2).Forms.item('form', 0) as IHTMLFormElement;
  Document.FireEvent('onSubmit', 'null');
  Document.FireEvent('onSubmit', FormElement.onsubmit);
end;

我做错了什么?如何激发HTML表单的onsubmit事件?

您的第一次尝试失败,因为该方法没有激发onsubmit事件,该方法的参考说明如下:

IHTMLFormElement::submit方法不调用 HTMLFormElementEvents::onsubmit事件处理程序

您的下一次尝试失败,因为您正试图在document元素上触发事件。想象一下,如果有多个子元素附加了此事件,则此元素必须执行的决策。除了你传递了错误的参数。尝试类似的方法,但不要忘记在生产代码中添加正确的错误处理:

procedure TForm1.ButtonClick(Sender: TObject);
var
  Empty: OleVariant;
  EventObj: OleVariant;
  Document: IHTMLDocument2;
  FormElement: IHTMLElement3;
begin
  // get the document interface reference
  Document := (WebBrowser.Document as IHTMLDocument2);
  // generate an event object to pass event context information
  EventObj := (Document as IHTMLDocument4).CreateEventObject(Empty);
  // get the form element and fire the event
  FormElement := Document.forms.item('form', NULL) as IHTMLElement3;
  FormElement.FireEvent('onsubmit', EventObj);
end;
下面是一个HTML示例:

函数提交形式{ 警告表单已提交!; }
强制转换为IHTMlement并调用Click方法

var
  Document: IHTMLDocument4;
  FormElement: IHTMLFormElement;
begin
  Document := (WebBrowser.Document as IHTMLDocument4);
  FormElement := (Document as IHTMLDocument2).Forms.item('form', 0) as IHTMLElement;
  FormElement.Click;
end;

点击你为什么要点击表格?这是毫无意义的。如果您是手动操作而不是以编程方式操作,您会这样做。不,您将提交它,而不是单击。