浏览器未检测到与 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);                           
        });        
    }
});