一.在MSCRM2011里新增了ribbon工具条,官方修改ribbon工具条的方法是通过修改配置文件(修改导出实体里的ribbondiffxml节点),这里就不介绍官方的修改方法了。
二.在最新的项目里遇到了对ribbon按钮的操作,本来想通过修改自定义的ribbondiffxml节点去实现,后来发现不是太方便,而且貌似只能修改自定义的按钮,无法修改系统原来的按钮(比如“保存”按钮)
三.因此考虑是否能从JS的角度去操作,经过一番测试发现,窗体加载时是无法找到ribbon按钮的,因为Form表单是嵌在iframe里,而ribbon按钮是在iframe之外,并且通过测试发现,在表单加载完成之后才会加载ribbon工具条,所以直接用JS去获取ribbon按钮对象是不行的。
四.另外想办法,忽然想到由于ribbon工具条是在表单加载完后才加载的,那是否可以考虑用JS模拟一个多线程的机制去获取ribbon按钮,即在不阻止当前表单加载的情况下,从另外的线程去找ribbon按钮。这里注意:如果直接用while循环之类的方法去找ribbon按钮,当前表单会卡死,因为会导致死循环。
五.实现:
1.下载Concurrent.Thread.js (百度搜下),这是别人写得一个模仿多线程的JS。
2.引用Jquery(别说没用过Jquery啊),我写的JS基本都是基于Jquery的,懒嘛。。呵呵
3.调用以下方法
//设置ribbon工具栏按钮是否可用,index-从左向右数第几个按钮(从0开始),text-按钮中文名称(如"保存"),disabled-是否可用
(true/false)
//这里解释下为什么有了index还要用按钮中文名称呢,因为如果你当前表单嵌套了1:N的子网格的话,当你点击子网格时ribbon工具栏里的按钮会加载子网格实体的相关按钮,这时候就可能隐藏的是父实体的按钮而非子实体的按钮
function SetRibbonDisabled(index, text, disabled) {
Concurrent.Thread.create(function (i, t, d) {
while ($('.ms-cui-tabContainer a', parent.document).eq(i).find("span").eq(2)[0].innerText != t) {
}
if ($('.ms-cui-tabContainer a', parent.document).eq(i).find("span").eq(2)[0].innerText == t) {
$('.ms-cui-tabContainer a', parent.document).eq(i).children().attr("disabled", d);
$('.ms-cui-tabContainer a', parent.document).eq(i).attr("disabled", d);
}
}, index, text, disabled);
}
//调用
SetRibbonDisabled(0, "保存", true);
注:一定要引用jquery,Concurrent.Thread.js
如有问题欢迎交流:peterqiu@wicresoft.com