IE8无法运行:SharePoint 2010中Ajax调用API遇No Transport错误
这个"No Transport"错误在jQuery Ajax场景里,大多和跨域请求限制或者旧版jQuery对IE的XDomainRequest支持不足有关。既然你没法修改母版页,咱们就用只需要在页面局部添加脚本的方案来解决:
方案1:升级jQuery(通过站点资产库加载,无需母版页)
如果当前用的是较老的jQuery版本(比如1.4.x及更早),它默认缺失跨域请求的transport支持。你可以把兼容SharePoint 2010的jQuery版本(比如1.12.x)上传到站点的SiteAssets库,然后在自己的Web Part里动态加载,避免和SharePoint自带的jQuery冲突:
// 先检查是否已加载合适的jQuery,没有则动态加载 if (typeof jQuery === 'undefined' || jQuery.fn.jquery < '1.12.0') { var script = document.createElement('script'); script.src = '/sites/你的站点名称/SiteAssets/jquery-1.12.4.min.js'; // 替换成你上传的jQuery路径 script.type = 'text/javascript'; document.head.appendChild(script); } // 发起Ajax请求的函数 function makeApiCall() { jQuery.ajax({ url: '你的API地址', type: 'GET', dataType: 'json', success: function(data) { console.log('请求成功:', data); // 这里处理返回的数据 }, error: function(xhr, status, error) { console.error('请求失败:', status, error); } }); } // 确保jQuery加载完成后执行请求 if (typeof jQuery !== 'undefined') { makeApiCall(); } else { script.onload = makeApiCall; }
方案2:手动添加XDomainRequest Transport(适配IE8/9)
SharePoint 2010常和IE8/9打交道,这些旧IE版本不支持标准CORS,需要用XDomainRequest。你可以在脚本里手动添加这个transport,不需要改动母版页:
// 针对IE8/9添加XDomainRequest支持 if (jQuery.support.cors === false && window.XDomainRequest) { jQuery.ajaxTransport(function(options) { if (options.crossDomain && options.async) { if (options.timeout) { options.xdrTimeout = options.timeout; delete options.timeout; } var xdr; return { send: function(headers, complete) { xdr = new XDomainRequest(); xdr.onload = function() { complete(200, 'OK', { text: xdr.responseText }, 'Content-Type: ' + xdr.contentType); }; xdr.onerror = function() { complete(404, 'Not Found', { text: xdr.responseText }); }; xdr.ontimeout = function() { complete(408, 'Request Timeout', { text: xdr.responseText }); }; xdr.timeout = options.xdrTimeout || 30000; xdr.open(options.type, options.url); xdr.send((options.data && jQuery.param(options.data)) || null); }, abort: function() { if (xdr) xdr.abort(); } }; } }); } // 正常发起Ajax请求 jQuery.ajax({ url: '你的API地址', type: 'GET', crossDomain: true, success: function(data) { console.log('请求成功'); } });
方案3:使用SharePoint自带的SP.RequestExecutor(推荐)
SharePoint 2010自带了SP.RequestExecutor对象,专门处理跨域/同域API请求,不需要依赖jQuery,也不会出现No Transport问题,而且只需要加载SharePoint内置脚本:
// 先加载SharePoint的RequestExecutor脚本 SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() { var executor = new SP.RequestExecutor('你的站点URL'); // 同域请求填当前站点URL即可 executor.executeAsync({ url: '你的API地址', method: 'GET', headers: { "Accept": "application/json; odata=verbose" }, // 调用SharePoint API时建议添加 success: function(response) { var data = JSON.parse(response.body); console.log('请求成功:', data); }, error: function(error) { console.error('请求失败:', error); } }); });
额外注意事项
- 如果调用的是外部API,要确保该API支持CORS(或对IE8/9支持XDomainRequest),否则浏览器会拦截请求。
- 把上述脚本放在内容编辑器Web Part或脚本编辑器Web Part里直接添加到页面,完全不需要修改母版页。
- 调用SharePoint自身API时,优先用
SP.RequestExecutor,这是官方推荐的方式,兼容性更好。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

