代码之家  ›  专栏  ›  技术社区  ›  jrummell

如何使用javascript禁止IE7 ActiveX消息?

  •  2
  • jrummell  · 技术社区  · 16 年前

    我正试图决定是使用自定义的ASP.NET Ajax扩展程序还是jQuery来执行简单的Web服务调用。Web服务方法接受客户ID并返回客户名称。我倾向于jquery,因为它很简单。唯一的问题是,由于我公司的IE7组策略设置,jquery第一次调用Web服务时,会向用户提示以下消息:

    脚本正在访问某些软件 (ActiveX控件)在此页上 已标记为安全 脚本编写。你想允许这样做吗?

    扩展器不会导致显示此消息。我假设ASP.NET Ajax库中有一些JavaScriptVoodoo可以抑制它。所以我的问题是, 如何使用javascript禁止显示此消息?

    这是我的ASPX标记:

    <h1>
        Finder Test</h1>
    <div>
        <h2>
            Extender</h2>
        Customer ID:
        <asp:TextBox ID="txtCustomerId" runat="server" MaxLength="9" Width="4em" />
        <belCommon:FinderExtender ID="extCustomerId" runat="server" TargetControlID="txtCustomerId"
            ResultLabelID="lblResult" ServicePath="~/Customer.asmx" ServiceMethod="Name" />
        <asp:Label ID="lblResult" runat="server" />
    </div>
    <div>
        <h2>
            jQuery</h2>
        Customer ID:
        <input id="txtCustomerId2" type="text" maxlength="9" style="width: 4em;" value="0000" />
        <span id="txtCustomerName2"></span>
    
        <script type="text/javascript">
            $(document).ready(function()
            {
                $("#txtCustomerId2").change(
                function()
                {
                    updateCustomerDescription(this.value, "txtCustomerName2");
                }).change();
            });
    
            function updateCustomerDescription(id, descriptionControlId)
            {
                // if we don't have a value, then don't bother calling the web service
                if (id == null || id.length == 0)
                {
                    $("#" + descriptionControlId).text("");
                    return;
                }
    
                jsonAjax("customer.asmx/Name", "{'id':'" + id + "'}", true,
                    function(result)
                    {
                        var name = result.d == null ? "" : result.d;
                        $("#" + descriptionControlId).text(name);
                    }, null);
            }
    
            function jsonAjax(url, data, async, onSuccess, onFailed)
            {
                $.ajax({
                    async: async,
                    type: "POST",
                    url: url,
                    data: data,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: onSuccess,
                    error: onFailed
                });
            }
        </script>
    </div>
    

    [更新]

    我假设消息中引用的ActiveX控件是XMLHttpRequest。我还假设jquery和ASP.NET Ajax的内部结构都将其用于IE7。

    [更新]

    区别似乎在于ASP.NET Ajax和JQuery如何构造XMLHttpRequest实例。

    ASP.NET AJAX(感谢@Jesse Dearing):

     window.XMLHttpRequest = function window$XMLHttpRequest() {
     var progIDs = [ 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP' ];
     for (var i = 0, l = progIDs.length; i < l; i++) {
      try {
        return new ActiveXObject(progIDs[i]);
      }
      catch (ex) { }
      }
         return null;
      }
    }
    

    jQuery 1.3.2:

    // Create the request object; Microsoft failed to properly
    // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
    // This function can be overriden by calling jQuery.ajaxSetup
    xhr:function(){
        return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
    }
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   jdigital    16 年前

    我听上去不太对劲。如果有一个安全策略,您就不能用javascript覆盖它。

    我会仔细检查这两个页面,看看它们是否真正访问同一个ActiveX控件。我假设页面来自同一个主机(因此不会出现不同wininet信任区域的问题)。

        2
  •  1
  •   user18044    16 年前

    我正在开发一个ASP.NET AJAX应用程序,因此我检查了它的源代码,并在ASP.NET AJAX代码中找到了它:

     window.XMLHttpRequest = function window$XMLHttpRequest() {
     var progIDs = [ 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP' ];
     for (var i = 0, l = progIDs.length; i < l; i++) {
      try {
        return new ActiveXObject(progIDs[i]);
      }
      catch (ex) { }
      }
         return null;
      }
    }
    

    我希望这对一些人有帮助。

        3
  •  1
  •   jrummell    16 年前

    我通过重写jquery的xhr函数解决了这个问题,如下所示:

    function overrideJqueryXhr()
    {
        $.ajaxSetup({
            xhr: function()
            {
                if (window.XMLHttpRequest)
                {
                    return new XMLHttpRequest();
                }
                else
                {
                    var progIDs = ['Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'];
    
                    for (var i = 0; i < progIDs.length; i++)
                    {
                        try
                        {
                            var xmlHttp = new ActiveXObject(progIDs[i]);
                            return xmlHttp;
                        }
                        catch (ex)
                        {
                        }
                    }
    
                    return null;
                }
            }
        });
    }
    

    这个函数告诉jquery为非IE浏览器创建一个xmlhttpRequest类的实例,然后用ms-ajax方法为IE创建一个ActiveX对象。它首先尝试最新版本,msxml2.xmlhttp.3.0,然后是msxml2.xmlhttp,最后是microsoft.xmlhttp。