1. 程式人生 > >IE11中OCX控制元件的事件不能夠被IE捕獲的解決辦法

IE11中OCX控制元件的事件不能夠被IE捕獲的解決辦法

寫了一個OCX控制元件,在OCX控制元件中觸發一事件,在IE11之前的版本使用attachEvent註冊一個回撥函式後IE11可以捕獲到事件,但IE11中提示attachEvent不支援.

In IE11, the attachEvent has been dropped in favour of addEventListener.

Nevertheless, when I replace all the attachEvent instances that were used to bind to events triggered by the activeX, such events are no longer triggered.

Here are some html code examples that illustrate the problem.

(I have created a simple activeX based on an MFC activeX control that simply triggers an event inside OnCreate. This event sends 2 strings as parameters. If you need the code or even the ocx file for the activeX, please let me know.)

Test 1 uses the "for" tag to setup the callback to the activeX event. This is successful on all versions IE8, 9, 10 and 11.


<!DOCTYPE html>
<html>
	<head>
		<title>TestEvent Example HTML</title>
		<meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
		<script language='javascript' for="testAxEvent" event="testEvent(szType, szValue)">
		// Test 1 - statically load the script (This is the basis for the hack)
		// Works on IE8, IE9, IE10 and IE11
			var MSG = document.getElementById("msg");
			MSG.innerHTML = szType + " : " + szValue;
		</script>
	</head>
	<body>
		<table>
			<tr>
				<td>
					<OBJECT ID='testAxEvent' CLASSID='CLSID:BA19A985-C93E-491B-B801-2EB7F903C8CE' codebase="testAxEvent.cab"></OBJECT>
				</td>
			</tr>
			<tr><td  height='30'></td></tr>
			<tr>
				<td align=center><font size=5><div id='msg'></div></font>	
			</tr>
		</table>
	</body>
</html>
Test 2 uses attachEvent to bind the callback to the object element. The callback is correctly called on IE8, 9 and 10 but not on IE11, as was expected.
<!DOCTYPE html>
<html>
	<head>
		<title>TestEvent Example HTML</title>
		<meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
	</head>
	<body>
		<table>
			<tr>
				<td>
					<OBJECT ID='testAxEvent' CLASSID='CLSID:BA19A985-C93E-491B-B801-2EB7F903C8CE' codebase="testAxEvent.cab" width='120' height='80'></OBJECT>
				</td>
			</tr>
			<tr><td  height='30'></td></tr>
			<tr>
				<td align=center><font size=5><div id='msg'></div></font>	
			</tr>
		</table>
	</body>
	<script>
		// Test 2 - attachEvent
		// Works on IE8, IE9 and IE10
		// Does not work on IE11
		function onTestEvent(szType, szValue)
		{
			var MSG = document.getElementById("msg");
			MSG.innerHTML = szType + " : " + szValue;
		}
		var elem = document.getElementById("testAxEvent");
		elem.attachEvent("testEvent", onTestEvent);
	</script>
</html>

Test 3 replaces attachEvent with addEventListener. Still the event is not triggered on IE11.
<!DOCTYPE html>
<html>
	<head>
		<title>TestEvent Example HTML</title>
		<meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
	</head>
	<body>
		<table>
			<tr>
				<td>
					<OBJECT ID='testAxEvent' CLASSID='CLSID:BA19A985-C93E-491B-B801-2EB7F903C8CE' codebase="testAxEvent.cab" width='120' height='80'></OBJECT>
				</td>
			</tr>
			<tr><td  height='30'></td></tr>
			<tr>
				<td align=center><font size=5><div id='msg'></div></font>	
			</tr>
		</table>
	</body>
	<script>
		function onTestEvent(szType, szValue)
		{
			var MSG = document.getElementById("msg");
			MSG.innerHTML = szType + " : " + szValue;
		}
		var elem = document.getElementById("testAxEvent");
		// Test 3 - addEventListener
		// Does not work on IE11 !
		elem.addEventListener("testEvent", onTestEvent, true);
		elem.addEventListener("testEvent", onTestEvent, false);
	</script>
</html>

We've been experiencing the same issue. We use an ActiveX component to control machinery via COM port. As many of our customers have recently received IE 11 as an automatic update, we have been receiving reports that the tool no longer works as expected. The ActiveX component is quite obviously running, because the machinery is being controlled, but none of the events produced are being registered in the browser window, reglardless of whether `attachEvent` or `addEventListener` is used.

Fortunately, there is a simple work-around: force IE 10 emulation, by adding the following to the document's `<head>`:

<meta http-equiv="X-UA-Compatible" content="IE=10" />

and then use `attachEvent`, as before.

IE 11 裡,OCX控制元件的FireEvent函式無效。 

原因是 CConnectionPoint類物件中的 m_pConnections為NULL值。

在原有的attachEvent會向OCX註冊一個event,用於外掛內部的回撥;

IE 11 去掉了attachEvent函式,新加入了addEventListenner卻並沒有把註冊的event物件加入外掛的事件佇列裡!!

IE 11 既然是拿NPAPI作為核心的重新封裝的瀏覽器,既然非要支援原有的OCX控制元件,為何卻要鬧出這種烏龍!

最終只能使用 for ... event來處理了。