C#의 ActiveX Webbrowser에서 JavaScript 변수를 설정/얻으려고합니다.
-
02-07-2019 - |
문제
ActiveX Webbrowser 컨트롤이 포함 된 Windows 응용 프로그램이 있습니다. 이 응용 프로그램의 정기적 인 작동의 일부로 ActiveX Webbrowser 컨트롤에서 표시되는 페이지로 수정됩니다. 이러한 수정의 일부에는 ActiveX WebBrowser에로드되는 웹 페이지에서 JavaScript 변수를 설정하는 것이 포함됩니다.
C# 내 에서이 변수를 초기화해야합니다 (원래 VB6 코드는 값을 초기화했습니다). 이 변수의 값은 com-visible 클래스 객체입니다.
그러나 단순화를 위해 문자열 값을 설정하는 데 문제가 줄었습니다. 우리의 원래 페이지는 프레임 등이 포함되지만 동일한 문제는 다음과 같은 페이지에서 발생합니다.
<HTML>
<HEAD>
<TITLE>Test</TITLE>
<SCRIPT type="text/javascript">
var field = 'hello world';
</SCRIPT>
</HEAD>
<BODY>
<input type="button" value="See field" onclick="javascript:alert(field);"/>
</BODY>
</HTML>
우리는 액세스하고 싶습니다 필드 변수 및 값을 할당합니다. VB6에서 이에 대한 코드는 매우 간단했습니다.
doc.Script.field = 'newValue'
그러나 C#에서는 다음과 같은 다른 트릭에 의지해야했습니다.
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);
페이지의 요점은 C#에 의해 변수가 올바르게 할당되었는지 여부를 테스트하는 것입니다. 버튼을 클릭하면 C#에 의해 새 값이 주입 된 모든 것을 얻을 수 있습니다. 예를 들어, 페이지의 버튼을 클릭하면 "NewValue"라는 경고가 표시됩니다.
처음으로 작동하지만 페이지를 다시로드하면 작동하지 않습니다. 후속 통화에서는 변수의 값을 설정할 수 없습니다. field
.
이 유형의 작업을 수행 한 경험이 있습니까?
해결책 3
이 두 기사는 우리의 문제에 대한 해결책을 찾는 데 도움이되었습니다. 그들은 알아야 할 것이 무엇인지에 대한 기본 사항을 설명합니다.
그래서 우리는 Dochostuihandler 인터페이스를 구현하여 Uihandler를 설정하여 JavaScript의 메소드를 참조 할 수있었습니다.
다른 팁
나는 당신이 찾고있는 것이 eval()
JavaScript의 메소드. 다음과 같이 C#에서 호출 할 수 있습니다.
webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
이 코드는 평가됩니다 "1 + 2"
그리고 반환 "3"
. 당신이 들어가면
InvokeScript("eval", new String[] {"varName = 3"})
파일에 전 세계적으로 표시되면 변수를 3으로 지정할 수 있습니다.
WebBrowser 컨트롤을 사용하는 경우 AC# 객체를 ObjectForscripting 속성에 할당 할 수 있습니다.http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx
그런 다음 JavaScript에서 window.external을 사용하여 JavaScript에서 C# 객체와 상호 작용할 수 있습니다.
어떤 이유로 ActiveX 버전을 사용하는 경우 JavaScript : URL을 전달하여 변수를 프로그래밍 방식으로 설정하거나 WebService/ Database/ File을 사용하여 스크립트를 동기화하거나 제안한 메소드를 사용하여 스크립트를 동기화 할 수 있습니다.
우리가 사용하는 일반적인 방법은 페이지에 숨겨진 텍스트 입력 상자 (ASP.NET 제어 버전)를 추가하는 것입니다. 이렇게하면 C# CodeBehind에서 값을 쉽게 설정하고 클라이언트 측 JavaScript에서 값을 읽을 수 있습니다 (물론 그 반대로).