2009-02-26 2 views
2

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

Скрипт обращающегося некоторое программное обеспечение (элемент управления 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(); 
} 

ответ

1

Я решил эту проблему с помощью переопределения функции 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.

2

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

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

+0

Оба варианта реализации ASP.Net Ajax и jQuery находятся на одной странице, и только сообщение вызывает метод jQuery. Я уверен, что обе реализации используют объект XMLHttpRequest ActiveX. – jrummell

+0

Я бы посмотрел на источник страницы, а не на предположение. – jdigital

1

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

Я надеюсь, что помогает некоторым.

+0

Человек, они даже не следуют своим советам относительно того, что использовать для Ид. :) http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx – epascarello

Смежные вопросы