浏览器未检测到与 x-ua 兼容的元标记并在使用 javascript 动态更改后设置为新的 IE 浏览器版本
Browser not detecting x-ua-compatible meta tag and setting to new IE browser version after changing it dynamically with javascript
我们在旧的 Sharepoint 2010 网站中有很多旧的 Infopath 表单,运行在 IE11 中。他们希望网站 运行ning 在 IE9 或更高版本中,以便我们可以 运行 youtube 视频。至于 Infopath 表单以外的所有内容,IE9-IE11 都可以正常使用。问题是 Infopath 表单不会在 IE8 以外的任何浏览器中打开。我相信这与为 IE8 编写的 Infopath links 单击时触发的代码有关,并且在更高版本中不起作用。
我尝试编写 javascript 检查页面是否有任何 .xsn 文本(Infopath 文件的所有 links 在 link 文本中都有 .xsn),如果它找到它,它动态地将一个标签注入到强制 IE8 兼容模式。这显然是行不通的,因为浏览器已经在默认的 IE11 模式下读取了元信息和 运行。因此,我尝试使用 localStorage 进行实验,看看在浏览器选择其默认版本的 IE11 之前,是否有可能 javascript 写入兼容 x-ua 的元标记。代码基本上检查页面中的 .xsn 文本,如果找到它,则将 localStorage 属性 设置为 true,然后触发浏览器重新加载。另一段代码检查 localStorage 中的 属性 值,如果为真,则将 x-ua-compatible 元标记呈现到 .该代码就 getting/setting localStorage 属性 正确工作,并呈现正确的 x-ua 兼容元标记。我在页面加载后检查 HTML,并且元标记在任何具有 Infopath 表单的页面上更改为 IE 兼容模式。但是,似乎浏览器在将该元标记写入 .
/**************************************************
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# 或配置,所以我被前端困住了。
我的解决方案是利用 download.aspx?SourceUrl=
并动态更改页面上的所有 Infopath URL 以使用它。这会导致下载 Sharepoint 2010 上的所有信息路径文件(不包括带有 file:// url 的文件),而不是通过 Sharepoint 的设置打开。然后用户需要导航到他们的下载文件夹并从那里打开文件。缺点是用户无法通过浏览器中的任何 "open" 命令打开表单。他们必须直接从下载的地方打开文件。考虑到 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);
});
}
});
我们在旧的 Sharepoint 2010 网站中有很多旧的 Infopath 表单,运行在 IE11 中。他们希望网站 运行ning 在 IE9 或更高版本中,以便我们可以 运行 youtube 视频。至于 Infopath 表单以外的所有内容,IE9-IE11 都可以正常使用。问题是 Infopath 表单不会在 IE8 以外的任何浏览器中打开。我相信这与为 IE8 编写的 Infopath links 单击时触发的代码有关,并且在更高版本中不起作用。
我尝试编写 javascript 检查页面是否有任何 .xsn 文本(Infopath 文件的所有 links 在 link 文本中都有 .xsn),如果它找到它,它动态地将一个标签注入到强制 IE8 兼容模式。这显然是行不通的,因为浏览器已经在默认的 IE11 模式下读取了元信息和 运行。因此,我尝试使用 localStorage 进行实验,看看在浏览器选择其默认版本的 IE11 之前,是否有可能 javascript 写入兼容 x-ua 的元标记。代码基本上检查页面中的 .xsn 文本,如果找到它,则将 localStorage 属性 设置为 true,然后触发浏览器重新加载。另一段代码检查 localStorage 中的 属性 值,如果为真,则将 x-ua-compatible 元标记呈现到 .该代码就 getting/setting localStorage 属性 正确工作,并呈现正确的 x-ua 兼容元标记。我在页面加载后检查 HTML,并且元标记在任何具有 Infopath 表单的页面上更改为 IE 兼容模式。但是,似乎浏览器在将该元标记写入 .
/**************************************************
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# 或配置,所以我被前端困住了。
我的解决方案是利用 download.aspx?SourceUrl=
并动态更改页面上的所有 Infopath URL 以使用它。这会导致下载 Sharepoint 2010 上的所有信息路径文件(不包括带有 file:// url 的文件),而不是通过 Sharepoint 的设置打开。然后用户需要导航到他们的下载文件夹并从那里打开文件。缺点是用户无法通过浏览器中的任何 "open" 命令打开表单。他们必须直接从下载的地方打开文件。考虑到 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);
});
}
});