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

时间:2015-08-19 19:25:51

标签: delphi mshtml twebbrowser

我正在尝试使用MSHTML从Delphi应用程序激活HTML表单的onsubmit事件。我尝试使用IHTMLFormElement::submitIHTMLDocument4::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事件?

2 个答案:

答案 0 :(得分:4)

您的首次尝试失败,因为IHTMLFormElement::submit方法未触发onsubmit事件,此方法的参考说明如下:

  

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

您的下一次尝试失败是因为您尝试在文档元素上触发事件(想象一下,如果有多个子元素附加了此事件,则此元素必须执行此操作)。除了你传递错误的参数。尝试这样的事情(不要忘记在生产代码中添加适当的错误处理):

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示例:

<!DOCTYPE html>
<html>
   <body>
      <form name="form" onsubmit="submitForm()">
         <input type="submit">
      </form>
      <script>
         function submitForm() {
             alert("The form was submitted!");
         }
      </script>
   </body>
</html>

答案 1 :(得分:0)

投射为IHTMLElement并调用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;