浏览器未检测到与x-ua兼容的元标记,并在使用javascript动态更改后设置为新的IE浏览器版本
我们在运行IE11的旧Sharepoint 2010网站中有许多旧的Infopath表单。他们希望网站运行IE9或更高版本,这样我们就可以运行youtube视频。就Infopath表单以外的所有内容而言,IE9-IE11的功能非常适合我们使用。问题是Infopath表单不会在IE8以外的任何浏览器中打开。我相信这与点击为IE8编写的Infopath链接时触发的代码有关,但在更高版本中不起作用 我尝试编写javascript来检查页面中是否有任何.xsn文本(指向Infopath文件的所有链接的链接文本中都有.xsn),如果找到了,它会动态地向页面中注入一个标记,以强制启用IE8兼容模式。这显然不起作用,因为浏览器已经读取了元数据信息,并在默认的IE11模式下运行。因此,我尝试了一个使用localStorage的实验,看看在浏览器选择默认版本的IE11之前,是否有可能让javascript写入与x-ua兼容的元标记中。基本上,代码会检查页面中的.xsn文本,如果找到了,则将localStorage属性设置为true,然后触发浏览器重新加载。另一段代码检查localStorage的属性值,如果为true,则将与x-ua兼容的meta标记呈现到。该代码可以正确地获取/设置localStorage属性,并呈现正确的x-ua兼容元标记。我在页面加载后检查HTML,并且meta标记将在任何包含Infopath表单的页面上更改为IE兼容模式。然而,在将meta标记写入浏览器之前,浏览器似乎已经选择了它的版本模式浏览器未检测到与x-ua兼容的元标记,并在使用javascript动态更改后设置为新的IE浏览器版本,javascript,internet-explorer,dynamic,compatibility,meta-tags,Javascript,Internet Explorer,Dynamic,Compatibility,Meta Tags,我们在运行IE11的旧Sharepoint 2010网站中有许多旧的Infopath表单。他们希望网站运行IE9或更高版本,这样我们就可以运行youtube视频。就Infopath表单以外的所有内容而言,IE9-IE11的功能非常适合我们使用。问题是Infopath表单不会在IE8以外的任何浏览器中打开。我相信这与点击为IE8编写的Infopath链接时触发的代码有关,但在更高版本中不起作用 我尝试编写javascript来检查页面中是否有任何.xsn文本(指向Infopath文件的所有链接的链
/**************************************************
script to insert meta tag to toggle
IE versions on the fly if Infopath forms
have been detected on the page
**************************************************/
if (localStorage.getItem('XSN-detect') !== null) {
//check localstorage for XSN-detect prop value
//if false, set meta tag to emulate IE11
if (localStorage.getItem('XSN-detect') === 'false') {
var link = document.createElement('meta');
link.setAttribute('http-equiv', 'x-ua-compatible');
link.content = 'IE=11';
document.getElementsByTagName('head')[0].appendChild(link);
}
//check localstorage for XSN-detect prop value
//if true, set meta tag to emulate IE8
if (localStorage.getItem('XSN-detect') === 'true') {
var link = document.createElement('meta');
link.setAttribute('http-equiv', 'x-ua-compatible');
link.content = 'IE=EmulateIE8';
document.getElementsByTagName('head')[0].appendChild(link);
//alert('This page contains Infopath forms, which requires IE8. Please press ok to have the page reload in IE8 mode.');
}
}
$(function() {
if (localStorage.getItem('XSN-detect') === null && document.getElementsByTagName('BODY')[0].innerHTML.indexOf('.xsn') != -1 || localStorage.getItem('XSN-detect') !== 'true' && document.getElementsByTagName('BODY')[0].innerHTML.indexOf('.xsn') != -1) {
localStorage.setItem('XSN-detect', 'true');
window.location.reload();
}
if (document.getElementsByTagName('BODY')[0].innerHTML.indexOf('.xsn') == -1) {
localStorage.setItem('XSN-detect', 'false');
}
});
我真的只需要知道是否有可能动态更改x-ua-campatible元标记,并让IE浏览器在选择加载其版本之前捕获它。我没有更新C#或配置的权限,因此只能使用前端。我的解决方案是利用
下载.aspx?SourceUrl=
并动态更改页面上的所有Infopath URL以使用它。这会导致Sharepoint 2010上的所有infopath文件(不包括那些具有文件://URL的文件)下载,而不是通过Sharepoint的设置打开。然后用户需要导航到他们的下载文件夹并从那里打开文件。缺点是用户无法通过浏览器中的任何“打开”命令打开表单。他们必须直接从下载的地方打开文件。考虑到Sharepoint2010已经过时,而且大多数管理员都不愿意再停留在IE8模式下,我认为这是一个可以接受的缺点
$(function() {
if (document.getElementsByTagName('BODY')[0].innerHTML.indexOf('.xsn') != -1) {
$('a[href$=".xsn"]').each(function(index) {
var self = $(this);
var fileLocation = '';
var spDownloadsUrl = '/_layouts/download.aspx?SourceUrl=';
//GRAB LINK'S HREF LINK PATH AND URI ENCODE IT
var currentUrl = encodeURI(self.attr('href'));
//IF THE HREF IS TO A NETWORK FILE LOCATION EXIT THE PROCESS AND LEAVE IT ALONE
if (currentUrl.indexOf('file:') != -1) {
return;
}
//SHAREPOINT 2010 DOC LIST ELEMENTS HAVE INLINE JS ALTERING THE LINK BEHAVIOR, SO THEY NEED TO BE REMOVED
self.removeAttr('onclick');
self.removeAttr('onmousedown');
self.removeAttr('onfocus');
//IF THE LINK'S URL IS ABSOLUTE PATH, BUILD IT AS RELATIVE
if (currentUrl.indexOf('.com') != -1) {
var urlSplitOnDotCom = currentUrl.split('.com');
var urlAfterDotCom = urlSplitOnDotCom[1];
var urlPartsArr = urlAfterDotCom.split('/');
//REBUILD URL FROM ARRAY
var newPathname = "";
for (i = 1; i < urlPartsArr.length; i++) {
newPathname += "/";
newPathname += urlPartsArr[i];
}
fileLocation = newPathname;
} else {
fileLocation = currentUrl;
}
//ADD NEW URL TO INFOPATH FILE'S HREF ATTRIBUTE
self.attr('href', spDownloadsUrl + fileLocation);
});
}
});
$(函数(){
if(document.getElementsByTagName('BODY')[0].innerHTML.indexOf('.xsn')!=-1{
$('a[href$=“.xsn”]')。每个(函数(索引){
var self=$(这是);
var fileLocation='';
var spDownloadsUrl='/_layouts/download.aspx?SourceUrl=';
//抓取链接的HREF链接路径并对其进行URI编码
var currentUrl=encodeURI(self.attr('href');
//如果HREF指向一个网络文件位置,请退出该过程并将其保留
if(currentUrl.indexOf('file:')!=-1){
返回;
}
//SHAREPOINT 2010文档列表元素的内联JS改变了链接行为,因此需要删除它们
self.removeAttr('onclick');
self.removeAttr('onmousedown');
self.removeAttr('onfocus');
//如果链接的URL是绝对路径,则将其构建为相对路径
如果(currentUrl.indexOf('.com')!=-1){
var urlspiltondotcom=currentUrl.split('.com');
var urlAfterDotCom=urlspiltondotcom[1];
var urlPartsArr=urlAfterDotCom.split('/');
//从数组重建URL
var newPathname=“”;
对于(i=1;i
这里的问题是,当您尝试修改x-ua-compatible的值时,页面已经加载。它可以成功修改,但不会生效。如果重新加载页面,它将再次加载具有预定义值的页面。若您可以在服务器端设置任何属性,那个么检查它可能会对您有所帮助。还可以尝试通过在兼容模式下添加站点来进行测试。@Deepak-MSFT谢谢。我试图找到关于浏览器读取元标记顺序的文档。如中所示,它是在运行JavaScript之前读取head info和meta标记,还是同时发生?此外,根据我的理解,在检查localStorage中列出该页面包含.xsn文件的属性后,我是否可以通过该页面的init上的C#注入meta标记也很重要。在页面上运行JS代码之前,首先加载元标记。根据我的搜索结果,我发现你可以保留2份页面副本。根据浏览器和用户的请求,您可以使用带有IE 8元标记的页面进行响应。@Deepak MSFT感谢您的输入。最后,我动态更改了页面上的所有Infopath链接,以使用/_layouts/download.aspx?SourceUrl=[document path],这样所有Infopath文件都可以下载到用户的本地计算机上,用户就可以从那里打开它。因为我们现在被困在SP2010中,这是我能想到的唯一解决方案,这样我们就可以让它在IE11中运行。