|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Announcements
Chapters
Services
Feature Zones
|
IntroductionAs a result of the Eolas patent, Microsoft has changed the way that Internet Explorer loads ActiveX controls. All interactive controls which are embedded directly within a page must now be activated before they can be used.
An article on MSDN[^] provides instructions on a workaround for this change. The work-around involves creating an external script file for every control instance, which may not be practical in a dynamic site. Terrence Sheflin, of Dundas Software, recently posted an article[^] and a control which attempts to make the workaround more reusable. However, the control has several problems: The control creates a new JavaScript file for every instance created:
The control modifies the page flow:For example, if the control is applied to <form runat="server">
<h1>Page Heading</h1>
<div class="container">
<xyz:someControl id="TargetControl" runat="server" ... />
</div>
</form>
will actually be rendered as: <form runat="server">
<script src="/embed.js"></script> <-- This line renders TargetControl
<h1>Page Heading</h1>
<div class="container">
</div>
</form>
The control cannot be used declaratively:The control does not expose a parameter-less constructor, so it cannot be used declaratively. Instead, the code in the Other issues:
A better way...Internet Explorer doesn't actually need a unique external JavaScript file for every control instance. Instead, you can create a single external JavaScript file with a single method: window.AutoActivateControl_WriteObjectElement =
function(elementData)
{
if ("string" != typeof(elementData) || 0 == elementData.length) return;
document.write(elementData);
};
You can then call this method from script within the page, and the control will be rendered without activation. The original control uses the The solution is to create a container control which will contain all of the controls to be modified. It can then use the The new control is designed to be used declaratively, and can be used anywhere on the page. It will only affect browsers which support ActiveX controls (as detected by the Using the control
In .NET 2.0, the script will be loaded from an embedded resource, so it is not necessary to distribute the JavaScript file. If you want to override this behavior, you can set the If you want to move the JavaScript file to a different location, you will need to set the <tri:autoActivateControl runat="server"
scriptLocation="~/scripts/AutoActivateControl.js">
An alternative solutionAs Mark Werner and FunkyMonkey have pointed out, it is also possible to avoid control activation by modifying the HTML DOM from an external script file [^] once the page has loaded. This method works with all pages, not just ASP.NET, and only requires a single line addition to each page. History
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||