最近在搞鼓web office apps的时候发现,在新建文档的时候,

image

 

IE浏览器会默认检测本机是否安装了office系列,安装了的话会尝试用客户端office打开模板文档新建。

下图是客户端安装了office 2007 sp2版本的情况(测试了三个版本的office,office 2003、office 2007、office 2007 sp2,发现office 2007 sp2在新建过程中最趋稳定,并且能够识别form认证的站点文档)

clip_image002

 

调用客户端的代码实际是跟下面三个ActiveX有关

ActiveXObject("SharePoint.OpenDocuments.1");
ActiveXObject("SharePoint.OpenDocuments.2");
ActiveXObject("SharePoint.OpenDocuments.3");

 

有兴趣的话可以运行下面的代码测试一下

<script type="text/javascript">
 
openDocObj = new ActiveXObject("SharePoint.OpenDocuments.2"); 
 
openDocObj.CreateNewDocument("http://www.abc.com/documents/sampleTemplate.dot", "http://www.abc.com/documents/");
 
</script>
 

 

因为我们无法控制客户端是否安装了哪个版本的office,以及不同版本的office带来的问题,所以统一将新建文档的步骤都放在浏览器中进行,如图:

clip_image002[6]

 

像这种功能微软应该会想到,所以其实我们可以在网站集功能中找到相关的设置:

image

 

首先要保证sharepoint网站开启了office web apps

然后把默认情况下,在客户端应用程序中打开文档停用掉。

为了保证成功率,再iisreset一下.

 

不过我在操作这个地方的时候出现问题了,这些步骤看上去仿佛都很完美,按道理说经过这些步骤后,web office 应该会忽略客户端office的调用,但是事与愿违,“星星还是那个星星,月亮还是那个月亮”,它还是调用客户端的office,汗!(不清楚这个情况到底是个例,还是这个问题是微软的一个bug,将来可能会修复

 

既然按正常方式无效,那我们就自己改吧

 

其实在新建文档的时候,调用了core.js里面的一个函数

function createNewDocumentWithRedirect(e, a, b, f, d, g, c) {
    a: ;
    if (g)
        if (IsClientAppInstalled(b))
            createNewInClient(e, a, b, f);
        else
            createNewInBrowser(d, a, c);
    else if (IsClientAppInstalled(b) && c != 1)
        createNewInClient(e, a, b, f);
    else
        createNewInBrowser(d, a, c)
}
 
 

 

行了,我们就手动把函数改一下,只留下

createNewInBrowser(d, a, c)

即可。

 

iisreset,OK,问题解决。


本文转载:CSDN博客