Как вы подавляете сообщения IE7 ActiveX, используя JavaScript? - PullRequest
2 голосов
/ 26 февраля 2009

Я пытаюсь решить, использовать ли пользовательский ASP.Net Ajax Extender или jQuery для выполнения простого вызова веб-службы. Метод веб-службы принимает идентификатор клиента и возвращает имя клиента. Я склоняюсь к JQuery из-за его простоты. Единственная проблема заключается в том, что из-за настроек групповой политики IE7 моей компании, первый раз, когда jQuery вызывает веб-сервис, он предлагает пользователю следующее сообщение:

Сценарий обращается к некоторому программному обеспечению. (элемент управления ActiveX) на этой странице который был помечен как безопасный для сценарии. Вы хотите разрешить это?

Расширитель не приводит к отображению этого сообщения. Я предполагаю, что в библиотеке ASP.Net Ajax есть некоторый javascript voodoo, который его подавляет. Итак, мои вопросы: Как мне подавить это сообщение с помощью 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>

[Update]

Я предполагаю, что в сообщении указан элемент управления ActiveX XMLHttpRequest. Я также предполагаю, что внутренние компоненты jQuery и ASP.Net Ajax используют его для IE7.

[Update]

Разница заключается в том, как 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 ]

2 голосов
/ 26 февраля 2009

Это не звучит правильно для меня. Если существует политика безопасности, вы не сможете переопределить ее с помощью JavaScript.

Я бы дважды проверил две страницы и посмотрел, действительно ли они оба имеют доступ к одному элементу ActiveX. Я предполагаю, что страницы приходят с одного и того же хоста (поэтому нет проблем с разными зонами доверия WinInet).

1 голос
/ 26 февраля 2009

Я решил это, переопределив функцию xhr в jQuery следующим образом:

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 о создании экземпляра класса XMLHttpRequest для браузеров, отличных от IE, а затем создает объект ActiveX способом MS Ajax для IE. Сначала он пробует последнюю версию, Msxml2.XMLHTTP.3.0, затем Msxml2.XMLHTTP и, наконец, Microsoft.XMLHTTP.

1 голос
/ 26 февраля 2009

Я работаю над приложением 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;
  }
}

Надеюсь, это поможет некоторым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...