본문 바로가기
delphi

TWebBrowser에서 자바스크립트 실행 방법

by doran365 2024. 8. 7.

개요

TWebBrowser를 이용하여 웹페이지 네비게이션 관련 프로그램을 작성할 경우, 한 번 로딩된 페이지에서 페이지에 포함된 자바스크립트를 직접 실행시켜야 하는 상황이 발생할 수 있습니다. 이때, 현재 로딩된 웹페이지에 자바스크립트를 실행시키는 방법을 알아보겠습니다.

해결 방법

현재 로딩된 HTML 문서 웹페이지는 윈도우(Window) 객체를 통해 해당 문서에 대한 액션을 취할 수 있습니다. 이때 사용할 수 있는 Window 객체의 자바스크립트 실행 메소드가 자바스크립트 호출을 활성화시키는 execScript 함수입니다.

execScript 함수 사용법:

  • 첫 번째 파라미터: 스크립트 문자열(예: foo(a, b))
  • 두 번째 파라미터: 스크립트 언어의 종류로 "JavaScript" 또는 "VBScript" 등 기타 실행시키고자 하는 스크립트 언어명을 문자열로 기술

예를 들어, 자바스크립트의 경우는 "JavaScript"라고 적습니다.

Window 객체 얻기:

현재 TWebBrowser에 로딩된 문서의 부모 윈도우(doc.parentWindow)를 얻으면 됩니다.

주의할 점은 Document 객체는 TWebBrowser가 모두 로딩되어 OnDocumentComplete 이벤트가 완료되어야만 얻을 수 있다는 것입니다.

 

구현 코드

다음은 TWebBrowser에서 자바스크립트를 실행시키는 구현 코드입니다.

uses
  MSHTML;

procedure TForm1.CallFoo(S: string; I: Integer);
  { 예 : JavaScript foo() 함수 호출  - 이 함수는 현재 로딩된 HTML페이지에서 Access 가능한 함수여야 한다. }
var
  Doc: IHTMLDocument2;      // 현재 TWebBrowser에 로딩이 완료된  HTML document
  HTMLWindow: IHTMLWindow2; // 현재 로딩된 문서의 부모 윈도(Window) 객체
  JSFn: string;             // 호출할 자바스크립트 문자열
begin
  // 현재 문서의 Reference를 얻는다.
  Doc := WebBrowser1.Document as IHTMLDocument2;
  if not Assigned(Doc) then
    Exit;
  // 현재 문서의 부모 윈도 객체 Reference를 얻는다.
  HTMLWindow := Doc.parentWindow;
  if not Assigned(HTMLWindow) then
    Exit;
  // 자바스크립트를 실행한다.
  try
    JSFn := Format('foo("%s",%d)', [S, I]);  // 자바스크립트 문자열 완성
    HTMLWindow.execScript(JSFn, 'JavaScript'); // 자바스크립트 실행
  except
    // 예외처리 핸들링
  end;
end;
 

참고할 사항

웹브라우저에서 사용자 클릭에 의한 자바스크립트 실행과 다르게 OnBeforeNavigate2, OnDownloadBegin, OnDownloadEnd, OnDocumentComplete 등의 이벤트가 발생하지 않으므로, 자바스크립트 강제 실행 이후에 해당 웹페이지에 대한 동작 처리를 직접 해야 합니다.

execScript 함수의 유용성

execScript 함수는 자바스크립트뿐만 아니라 웹브라우저가 실행 가능한 스크립트 언어라면 어떤 것이든 실행이 가능합니다. 첫 번째 파라미터는 스크립트 문자열이고, 두 번째 파라미터는 스크립트 언어의 종류입니다. 예를 들어, 자바스크립트의 경우 "JavaScript"라고 명시하면 됩니다.

Window 객체 얻는 방법

현재 TWebBrowser에 로딩된 문서의 부모 윈도우 객체는 doc.parentWindow를 통해 얻을 수 있습니다. 주의할 점은 Document 객체는 TWebBrowser가 모두 로딩되어 OnDocumentComplete 이벤트가 완료되어야만 얻을 수 있다는 점입니다.

자바스크립트 실행의 예외 처리

자바스크립트를 실행할 때 예외가 발생할 수 있으므로, try-except 블록을 사용하여 예외를 처리해야 합니다. 자바스크립트 실행 중 발생할 수 있는 예외를 처리함으로써 프로그램이 예기치 않게 종료되는 것을 방지할 수 있습니다.

OnDocumentComplete 이벤트와의 관계

OnDocumentComplete 이벤트는 TWebBrowser가 모든 문서를 로딩한 후 발생합니다. 따라서 자바스크립트를 실행하기 위해서는 이 이벤트가 완료된 후에 Document 객체를 얻어야 합니다. 이는 자바스크립트를 실행할 때 현재 로딩된 문서의 상태를 확인하기 위함입니다.

결론

TWebBrowser에서 자바스크립트를 실행하는 방법에 대해 알아보았습니다. execScript 함수를 사용하여 자바스크립트를 실행할 수 있으며, 이를 위해 Window 객체를 얻는 방법과 주의사항에 대해 설명했습니다. 구현 코드를 통해 실제로 자바스크립트를 실행하는 방법을 구체적으로 제시하였습니다. 자바스크립트 실행 후 발생할 수 있는 예외를 처리하는 방법과 OnDocumentComplete 이벤트와의 관계도 설명하여, TWebBrowser를 이용한 웹페이지 네비게이션 프로그램을 작성할 때 도움이 되도록 했습니다.