본문 바로가기

프로그래밍/Delphi

델파이 TWebBrowser 컴포넌트에서 자바스크립트 직접 실행하는 방법

1. 개요


  TWebBrowser를 이용하여 웹페이지 네비게이션 관련 프로그램을 작성할 경우에 한 번 로딩된 페이지에서 페이지에 포함된 자바 스크립트를 직접 실행 시켜야 하는 경우가 있는데 이때 쉽게 현재 로딩된 웹페이지에 자바스크립트를 실행시키는 방법이다.


2. 해결 방법

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

  execScript는 자바스크립트 뿐만 아니라 웹브라우저가 실행 가능한 스크립트 언어면 어떤 것이든 실행이 가능한데 첫 번째 파라미터는 스크립트 문자열(예:foo(a, b))이며, 두 번째 파라미터가 스크립트 언어의 종류로 "JavaScript" 또는 "VBScript" 등 기타 실행시키고자 하는 스크립트 랭기지명을 문자열로 기술하면 된다. 이번 처럼 자바스크립트의 경우는 "JavaScript"라고 적으면 된다.

  window 객체를 얻기 위해서는 현재 TWebBrowser에 로딩된 문서의 부모 윈도우(doc.parentWindow) 를 얻으면 된다.

주의 할 것은 Document객체는 TWebBrowser가 모두 로딩되어 OnDocumentComplete 이벤트가 완료 되어야만 얻을 수 있으니 참고 하자.


3. 구현 코드


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;


4. 참고할 사항

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