浏览器未检测到与x-ua兼容的元标记,并在使用javascript动态更改后设置为新的IE浏览器版本

浏览器未检测到与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文件的所有链接的链

我们在运行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标记写入浏览器之前,浏览器似乎已经选择了它的版本模式

/**************************************************
    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中运行。