Appearance
菜单相关事件
概述
本节介绍软航OFFICE文档控件提供的菜单相关事件,这些事件允许开发者在用户与菜单系统交互时进行响应和处理,为文档管理系统提供完整的菜单事件处理能力。
文件菜单事件
OnFileCommand
语法:
javascript
OnFileCommand(Item, IsCancel)
功能:
该事件在用户单击文件菜单或者工具栏的相关按钮时发生。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
Item | 必选 | FileCommandType | 文件菜单命令索引 |
IsCancel | 必选 | bool | 是否取消命令 |
说明:
可以与CancelLastCommand属性配合使用来接管缺省的工具栏的新建,打开或者保存操作。
使用示例:
javascript
// 基本用法 - 接管保存操作
<script language="JScript" for="TANGER_OCX" event="OnFileCommand(cmd, canceled)">
if (cmd == 3) { // 用户点击了文件保存菜单或按钮
// 保存到服务器
TANGER_OCX_SaveEditToServerDisk();
// 取消默认操作
document.getElementById("TANGER_OCX").CancelLastCommand = true;
}
</script>
// 处理多个文件命令
<script language="JScript" for="TANGER_OCX" event="OnFileCommand(cmd, canceled)">
switch(cmd) {
case 1: // 新建
console.log("用户点击新建");
// 执行自定义新建逻辑
break;
case 2: // 打开
console.log("用户点击打开");
// 执行自定义打开逻辑
break;
case 3: // 保存
console.log("用户点击保存");
// 执行自定义保存逻辑
TANGER_OCX_SaveEditToServerDisk();
document.getElementById("TANGER_OCX").CancelLastCommand = true;
break;
case 4: // 另存为
console.log("用户点击另存为");
// 执行自定义另存为逻辑
break;
default:
console.log("其他文件命令:", cmd);
}
</script>
// 记录文件命令操作
<script language="JScript" for="TANGER_OCX" event="OnFileCommand(cmd, canceled)">
var timestamp = new Date().toISOString();
var commandNames = {
1: "新建",
2: "打开",
3: "保存",
4: "另存为",
5: "打印",
6: "退出"
};
var commandName = commandNames[cmd] || "未知命令";
console.log("文件命令操作:", commandName, "时间:", timestamp);
// 可以记录用户操作日志
// logUserAction('file_command', commandName, timestamp);
</script>
自定义菜单事件
OnCustomMenuCmd2
语法:
javascript
OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)
功能:
该事件在用户单击自定义主菜单中的项目时执行。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuPos | 必选 | long | 一级菜单位置 |
submenuPos | 必选 | long | 二级菜单位置 |
subsubmenuPos | 必选 | long | 三级菜单位置 |
menuCaption | 必选 | string | 自定义菜单名称 |
myMenuID | 必选 | long | 自定义菜单ID |
说明:
各个参数的含义请参考AddCustomMenuItem2方法。在事件中可以通过判断ID和menuCaption两种方式,在对点击菜单事件进行相应操作。而且这个事件并不能捕获在文件菜单下面的菜单项,如果需要此功能参见OnCustomFileMenuCmd事件。
使用示例:
javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)">
console.log("自定义菜单点击:");
console.log("一级菜单位置:", menuPos);
console.log("二级菜单位置:", submenuPos);
console.log("三级菜单位置:", subsubmenuPos);
console.log("菜单标题:", menuCaption);
console.log("菜单ID:", myMenuID);
</script>
// 根据菜单ID处理不同操作
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)">
switch(myMenuID) {
case 1001:
console.log("执行文档格式化操作");
// 执行文档格式化
break;
case 1002:
console.log("执行文档转换操作");
// 执行文档转换
break;
case 1003:
console.log("执行文档加密操作");
// 执行文档加密
break;
default:
console.log("未知菜单操作:", myMenuID);
}
</script>
// 根据菜单标题处理操作
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd2(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID)">
if (menuCaption === "文档格式化") {
console.log("执行文档格式化");
// 执行格式化操作
} else if (menuCaption === "文档转换") {
console.log("执行文档转换");
// 执行转换操作
} else if (menuCaption === "文档加密") {
console.log("执行文档加密");
// 执行加密操作
} else {
console.log("其他菜单操作:", menuCaption);
}
</script>
OnCustomMenuCmd [已过时]
语法:
javascript
OnCustomMenuCmd(menuIndex, menuCaption, menuID)
功能:
该事件在用户单击自定义主菜单中的项目时执行。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuIndex | 必选 | long | 菜单位置索引 |
menuCaption | 必选 | string | 自定义菜单名称 |
menuID | 可选 | long | 自定义菜单ID |
说明:
不建议继续采用该事件,建议采用OnCustomMenuCmd2事件。第一个参数是菜单索引,从0开始计算;第二个参数是菜单标题;第三个参数是调用AddCustomMenuItem方法增加主菜单项目时的第4个参数,也就是自定义的菜单ID。
使用示例:
javascript
// 基本用法 [已过时,建议使用OnCustomMenuCmd2]
<script language="JScript" for="TANGER_OCX" event="OnCustomMenuCmd(menuIndex, menuCaption, menuID)">
console.log("自定义菜单点击 [已过时]:");
console.log("菜单索引:", menuIndex);
console.log("菜单标题:", menuCaption);
console.log("菜单ID:", menuID);
</script>
自定义文件菜单事件
OnCustomFileMenuCmd
语法:
javascript
OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)
功能:
该事件在用户单击自定义文件菜单中的项目时执行。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuIndex | 必选 | long | 自定义文件菜单位置索引 |
menuCaption | 必选 | string | 自定义文件菜单名称 |
menuID | 可选 | long | 自定义文件菜单ID |
说明:
第一个参数是菜单索引,从0开始计算;第二个参数是菜单标题;第三个参数是调用AddFileMenuItem方法增加主菜单项目时的第4个参数,也就是自定义的菜单ID。在事件中可以通过判断ID和menuCaption两种方式,在对点击菜单事件进行相应操作。此事件只能捕获在文件菜单下面的菜单项,如果需要此功能参见OnCustomFileMenuCmd事件。
使用示例:
javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)">
console.log("自定义文件菜单点击:");
console.log("菜单索引:", menuIndex);
console.log("菜单标题:", menuCaption);
console.log("菜单ID:", menuID);
</script>
// 根据菜单ID处理文件操作
<script language="JScript" for="TANGER_OCX" event="OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)">
switch(myMenuID) {
case 2001:
console.log("执行文件上传操作");
// 执行文件上传
break;
case 2002:
console.log("执行文件下载操作");
// 执行文件下载
break;
case 2003:
console.log("执行文件同步操作");
// 执行文件同步
break;
default:
console.log("未知文件菜单操作:", myMenuID);
}
</script>
// 根据菜单标题处理文件操作
<script language="JScript" for="TANGER_OCX" event="OnCustomFileMenuCmd(menuIndex, menuCaption, menuID)">
if (menuCaption === "上传到服务器") {
console.log("执行文件上传");
// 执行上传操作
} else if (menuCaption === "从服务器下载") {
console.log("执行文件下载");
// 执行下载操作
} else if (menuCaption === "同步到服务器") {
console.log("执行文件同步");
// 执行同步操作
} else {
console.log("其他文件菜单操作:", menuCaption);
}
</script>
原始菜单命令事件
BeforeOriginalMenuCommand
语法:
javascript
BeforeOriginalMenuCommand(menuTitle, IsCancel)
功能:
在用户执行文档菜单命令之前执行。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
menuTitle | 必选 | string | 菜单标题 |
IsCancel | 必选 | bool | 是否取消命令 |
说明:
以下代码将显示用户点击的菜单命令,并取消所有操作(将CancelLastCommand属性设定为true则可以取消操作)。
使用示例:
javascript
// 基本用法 - 显示菜单命令并取消操作
<script language="JScript" for="TANGER_OCX" event="BeforeOriginalMenuCommand(menuTitle, canceled)">
alert(menuTitle);
CancelLastCommand = true;
</script>
// 根据菜单标题执行不同操作
<script language="JScript" for="TANGER_OCX" event="BeforeOriginalMenuCommand(menuTitle, canceled)">
console.log("用户点击菜单:", menuTitle);
if (menuTitle === "保存") {
console.log("拦截保存操作,执行自定义保存");
// 执行自定义保存逻辑
TANGER_OCX_SaveEditToServerDisk();
CancelLastCommand = true;
} else if (menuTitle === "打印") {
console.log("拦截打印操作,执行自定义打印");
// 执行自定义打印逻辑
CancelLastCommand = true;
} else {
console.log("允许默认操作:", menuTitle);
CancelLastCommand = false;
}
</script>
// 记录菜单操作
<script language="JScript" for="TANGER_OCX" event="BeforeOriginalMenuCommand(menuTitle, canceled)">
var timestamp = new Date().toISOString();
console.log("菜单操作记录:", menuTitle, "时间:", timestamp);
// 可以记录用户菜单操作日志
// logUserAction('menu_command', menuTitle, timestamp);
</script>
自定义右键菜单事件
OnClickCustomContextMenu
语法:
javascript
OnClickCustomContextMenu(MenuIndex)
功能:
在用户点击通过CustomMenuStr属性自定义的右键菜单项就会触发本事件。
参数:
名称 | 必选/可选 | 数据类型 | 说明 |
---|---|---|---|
MenuIndex | 必选 | long | 自定义右键菜单索引 |
说明:
参数MenuIndex:即在CustonMenuStr中指定的索引。
使用示例:
javascript
// 基本用法
<script language="JScript" for="TANGER_OCX" event="OnClickCustomContextMenu(MenuIndex)">
alert(MenuIndex);
</script>
// 根据菜单索引执行不同操作
<script language="JScript" for="TANGER_OCX" event="OnClickCustomContextMenu(MenuIndex)">
console.log("右键菜单点击,索引:", MenuIndex);
switch(MenuIndex) {
case 1:
console.log("执行复制操作");
// 执行复制操作
break;
case 2:
console.log("执行粘贴操作");
// 执行粘贴操作
break;
case 3:
console.log("执行格式化操作");
// 执行格式化操作
break;
case 4:
console.log("执行插入图片操作");
// 执行插入图片操作
break;
default:
console.log("未知右键菜单操作:", MenuIndex);
}
</script>
// 记录右键菜单操作
<script language="JScript" for="TANGER_OCX" event="OnClickCustomContextMenu(MenuIndex)">
var timestamp = new Date().toISOString();
var menuActions = {
1: "复制",
2: "粘贴",
3: "格式化",
4: "插入图片",
5: "插入表格"
};
var actionName = menuActions[MenuIndex] || "未知操作";
console.log("右键菜单操作:", actionName, "时间:", timestamp);
// 可以记录用户右键菜单操作日志
// logUserAction('context_menu', actionName, timestamp);
</script>
方法分类总结
分类 | 事件 | 功能 | 说明 |
---|---|---|---|
文件菜单 | OnFileCommand | 文件菜单命令点击时触发 | 文件操作命令 |
自定义菜单 | OnCustomMenuCmd2 | 自定义主菜单点击时触发 | 自定义菜单操作 |
OnCustomMenuCmd | 自定义主菜单点击时触发 [已过时] | 自定义菜单操作 | |
文件菜单 | OnCustomFileMenuCmd | 自定义文件菜单点击时触发 | 自定义文件菜单操作 |
原始菜单 | BeforeOriginalMenuCommand | 原始菜单命令执行前触发 | 菜单命令拦截 |
右键菜单 | OnClickCustomContextMenu | 自定义右键菜单点击时触发 | 右键菜单操作 |
使用流程
1. 基本菜单事件处理流程
javascript
// 基本菜单事件处理流程
function basicMenuEventHandling() {
// 文件菜单事件处理
function handleFileCommand(cmd, canceled) {
console.log("文件命令:", cmd);
// 处理文件命令
}
// 自定义菜单事件处理
function handleCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
console.log("自定义菜单:", menuCaption);
// 处理自定义菜单
}
// 右键菜单事件处理
function handleContextMenu(menuIndex) {
console.log("右键菜单:", menuIndex);
// 处理右键菜单
}
}
2. 高级菜单事件处理流程
javascript
// 高级菜单事件处理流程
function advancedMenuEventHandling() {
// 菜单事件配置
var menuEventConfig = {
enableLogging: true,
enableCustomHandling: true,
enableCommandInterception: true
};
// 处理文件命令
function handleAdvancedFileCommand(cmd, canceled) {
if (menuEventConfig.enableLogging) {
console.log("文件命令日志:", cmd);
}
if (menuEventConfig.enableCustomHandling) {
// 执行自定义处理
}
}
// 处理自定义菜单
function handleAdvancedCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
if (menuEventConfig.enableLogging) {
console.log("自定义菜单日志:", menuCaption);
}
if (menuEventConfig.enableCustomHandling) {
// 执行自定义处理
}
}
}
3. 菜单事件质量控制流程
javascript
// 菜单事件质量控制流程
function menuEventQualityControl() {
// 处理菜单事件质量控制
function controlMenuEventQuality() {
var menuEventQuality = {
totalEvents: 0,
successfulEvents: 0,
failedEvents: 0,
qualityScore: 0
};
// 计算质量分数
if (menuEventQuality.totalEvents > 0) {
menuEventQuality.qualityScore = (menuEventQuality.successfulEvents / menuEventQuality.totalEvents) * 100;
}
console.log("菜单事件质量控制:", menuEventQuality);
return menuEventQuality;
}
// 执行质量控制
var qualityResult = controlMenuEventQuality();
console.log("菜单事件质量控制结果:", qualityResult);
}
完整示例
1. 基础菜单事件处理
javascript
// 基础菜单事件处理示例
function basicMenuEventHandling() {
// 文件菜单处理
function onFileCommand(cmd, canceled) {
console.log("文件命令:", cmd);
// 处理文件命令
}
// 自定义菜单处理
function onCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
console.log("自定义菜单:", menuCaption);
// 处理自定义菜单
}
}
2. 高级菜单事件处理
javascript
// 高级菜单事件处理示例
function advancedMenuEventHandling() {
// 菜单事件管理
var menuEventManager = {
isMenuEnabled: true,
isCustomMenuEnabled: true,
isContextMenuEnabled: true
};
// 处理文件命令
function handleFileCommand(cmd, canceled) {
if (menuEventManager.isMenuEnabled) {
console.log("文件命令处理:", cmd);
// 处理文件命令
}
}
// 处理自定义菜单
function handleCustomMenu(menuPos, submenuPos, subsubmenuPos, menuCaption, myMenuID) {
if (menuEventManager.isCustomMenuEnabled) {
console.log("自定义菜单处理:", menuCaption);
// 处理自定义菜单
}
}
}
3. 菜单事件质量控制
javascript
// 菜单事件质量控制示例
function menuEventQualityControl() {
// 菜单事件质量控制
function controlMenuEventQuality() {
var menuEventQuality = {
fileCommands: 0,
customMenus: 0,
contextMenus: 0,
errors: []
};
// 监控菜单事件质量
function monitorMenuEventQuality(eventType, success) {
if (success) {
menuEventQuality[eventType]++;
} else {
menuEventQuality.errors.push({
event: eventType,
timestamp: new Date().toISOString()
});
}
}
console.log("菜单事件质量控制:", menuEventQuality);
return menuEventQuality;
}
// 执行质量控制
var qualityResult = controlMenuEventQuality();
console.log("菜单事件质量控制结果:", qualityResult);
}
注意事项
- 事件顺序:注意菜单事件触发的顺序,确保在正确的时机执行相应操作
- 参数验证:验证菜单事件参数的有效性,避免空值或无效值
- 错误处理:实现完善的错误处理机制
- 性能考虑:避免在菜单事件处理中执行耗时操作
- 资源管理:及时清理不需要的资源
- 状态同步:保持菜单状态的一致性
- 用户体验:确保菜单事件处理不影响用户体验
错误处理
javascript
// 菜单事件错误处理
function handleMenuEventError(eventType, error) {
console.error("菜单事件处理失败:", eventType, error.message);
switch(eventType) {
case 'OnFileCommand':
console.log("文件菜单事件失败,请检查:");
console.log("1. 文件菜单是否正确配置");
console.log("2. 文件操作是否支持");
console.log("3. 控件是否已正确初始化");
break;
case 'OnCustomMenuCmd2':
console.log("自定义菜单事件失败,请检查:");
console.log("1. 自定义菜单是否正确添加");
console.log("2. 菜单ID是否正确");
console.log("3. 菜单事件处理是否正确");
break;
case 'OnClickCustomContextMenu':
console.log("右键菜单事件失败,请检查:");
console.log("1. 右键菜单是否正确配置");
console.log("2. 菜单索引是否正确");
console.log("3. 右键菜单事件处理是否正确");
break;
default:
console.log("未知菜单事件处理失败");
}
}
最佳实践
1. 菜单事件管理最佳实践
javascript
// 菜单事件管理最佳实践
function menuEventManagementBestPractice() {
// 菜单事件配置
var menuEventConfig = {
enableLogging: true,
enableCustomHandling: true,
enableCommandInterception: true,
enableQualityControl: true
};
// 应用菜单事件配置
function applyMenuEventConfig() {
try {
// 设置菜单事件处理
if (menuEventConfig.enableLogging) {
console.log("菜单事件日志已启用");
}
if (menuEventConfig.enableCustomHandling) {
console.log("自定义菜单处理已启用");
}
console.log("菜单事件配置应用成功");
} catch (error) {
handleMenuEventError('applyMenuEventConfig', error);
}
}
// 应用配置
applyMenuEventConfig();
}
2. 菜单事件质量控制最佳实践
javascript
// 菜单事件质量控制最佳实践
function menuEventQualityControlBestPractice() {
// 菜单事件质量控制
function controlMenuEventQuality() {
try {
// 菜单事件质量控制
var menuEventQuality = {
totalEvents: 0,
successfulEvents: 0,
failedEvents: 0,
qualityScore: 0
};
// 计算质量分数
if (menuEventQuality.totalEvents > 0) {
menuEventQuality.qualityScore = (menuEventQuality.successfulEvents / menuEventQuality.totalEvents) * 100;
}
console.log("菜单事件质量控制完成:", menuEventQuality);
return menuEventQuality;
} catch (error) {
console.error("菜单事件质量控制失败:", error.message);
return null;
}
}
// 执行质量控制
var qualityResult = controlMenuEventQuality();
console.log("菜单事件质量控制结果:", qualityResult);
}
技术要点
- 事件顺序:注意菜单事件触发的顺序,确保在正确的时机执行相应操作
- 参数验证:验证菜单事件参数的有效性,避免空值或无效值
- 错误处理:完善的错误处理机制
- 性能优化:避免在菜单事件处理中执行耗时操作
- 资源管理:及时清理不需要的资源
- 状态同步:保持菜单状态的一致性
- 用户体验:确保菜单事件处理不影响用户体验