我正在尝试决定是否使用自定义ASP.Net Ajax Extender或jQuery来执行简单的Web服务调用。 Web服务方法接受客户ID并返回客户名称。我倾向于jQuery,因为它很简单。唯一的问题是,由于我公司的IE7组策略设置,jQuery第一次调用Web服务时会向用户提示以下消息:
脚本正在访问某些软件 (此页面上的ActiveX控件) 已被标记为安全的 脚本。你想允许吗?
Extender不会显示此消息。我假设ASP.Net Ajax库有一些抑制它的javascript伏都教。所以我的问题是,如何使用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();
}
答案 0 :(得分:2)
这对我来说听起来不对。如果有安全策略,您应该无法使用javascript覆盖它。
我会仔细检查这两个页面,看看它们是否真的访问了同一个ActiveX控件。我假设页面来自同一主机(因此不存在不同的WinInet信任区域问题)。
答案 1 :(得分: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;
}
}
我希望有所帮助。
答案 2 :(得分:1)
我通过覆盖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类的实例,然后为IE创建一个MS Ajax方式的ActiveX对象。它首先尝试最新版本,Msxml2.XMLHTTP.3.0,然后是Msxml2.XMLHTTP,最后是Microsoft.XMLHTTP。