在GXT中激活上下文菜单时,如何保持选中的文本高亮显示?(EXT GWT 2.x)
How to keep selected text highlighted when activating a context menu in GXT? (EXT GWT 2.x)?
当用户使用Sencha的EXT GWT 2.x激活上下文菜单(右键菜单)时,我正试图找到一种方法来保持选中的文本高亮显示(尽管我对3.x解决方案很满意,如果有的话)。
用例:
- 用户正在查看屏幕上的内容
- 用户选择某个文本块(例如短语)
- 用户右键单击可查看上下文菜单,以便对所选文本执行操作并查看上下文菜单出现菜单时,所选文本保持选中状态
在测试中,GXT上下文菜单显示时会自动取消选择文本。有没有办法防止这种情况并对所选文本采取行动?
到目前为止,我已经尝试过:
a。在上下文菜单事件(Events.OnContextMenu
)的面板中添加一个侦听器,以查看是否有可以更改的属性(类似于contextMenu.disableTextSelection(false)
的属性,即使它已经在视图的构造中设置)。
b。通过向同一侦听器(Events.OnContextMenu
)添加一个本地方法来覆盖上下文菜单的出现所产生的取消选择效果,然后该侦听器使用JS尝试获取当前选定的文本,将其复制到临时变量中,然后立即将其添加回页面上的范围(有效地重新选择已选定的文本),但这也不起作用。我能够确认,本机方法触发了,检测到了文本,并似乎将其放回了范围内,但似乎又触发了另一个事件或发生了一些其他操作,这些操作仍然在菜单出现之前清除了选择。
任何想法都将不胜感激。
我还不知道官方的解决方案,我开始认为这是GXT 2.x中的一个错误,但我想出了一个解决办法,并将其发布在这里,以防其他人遇到类似的问题。
对于初学者来说,这个问题似乎发生在Firefox中,而不是IE中
- 在组件/容器/面板等上为
Events.OnContextMenu
事件添加侦听器。- 覆盖
handleEvent
方法并添加一个本地方法以使用JS来检测用户是否在屏幕上选择了文本。如果选择了文本,则将其保存到JavaScriptObject(GWT提供的JS对象的不透明包装器,有关详细信息,请参阅GWT文档)
- 覆盖
- 向上下文菜单对象上的
Events.Show
事件添加侦听器。- 重写
handleEvent
方法并添加一个本地方法以使用JS重新选择以前的选择
- 重写
- 向上下文菜单对象上的
Events.Hide
事件添加侦听器。- 重写handleEvent方法并清除您的选择变量,然后运行本机方法清除任何剩余的选择(如果需要)
使用这些步骤,我可以在Firefox中显示上下文菜单时保持选中的文本。
示例代码
(这些只是示例代码块,有助于更好地说明步骤-复制/粘贴此代码并不能提供所需的一切)
public class ContextMenuExample {
JavaScriptObject selection;
Menu contextMenu = new Menu();
public void buildPanelExample() {
ContentPanel panel = new ContentPanel();
panel.addListener(Events.onContextMenu, new Listener<BaseEvent>() {
if (!GXT.isIE) {
selection = findSelectedTextOnScreen();
}
});
contextMenu.addListener(Events.Show, new Listener<BaseEvent>() {
if (!GXT.isIE) {
reSelectText(selection);
}
});
contextMenu.addListener(Events.Hide, new Listener<BaseEvent>() {
if (!GXT.isIE) {
clearSelection();
}
});
private native JavaScriptObject findSelectedTextOnScreen() /*-{
// use JS method to get selected text as a range
return selectedText;
}-*/;
private native void reSelectedText(JavaScriptObject range) /*-{
// use JS method to find a range a select it
}-*/;
private native void clearSelection() /*-{
// us JS to clear any selected ranges
}-*/;
private void clearSelections() {
selection = null;
clearSelection();
}
}
}
- 如何使用.log数据文件显示EXT-js网格
- 在GXT中激活上下文菜单时,如何保持选中的文本高亮显示?(EXT GWT 2.x)
- Ext.Window在显示时窃取表单元素;t隐藏时恢复
- 在 EXT JS 中显示窗口
- Ext-js 在分机日期菜单中显示星期一的日历
- 在 Ext JS 4 上显示/隐藏系列的单个行元素
- Ext.Window 在 extjs 3.4 中显示当前打开窗口后面的方法打开窗口
- 如何从 C# 代码隐藏或 javascript 中突出显示 Ext.net 网格面板的选定行
- EXT JS :在组合框中,如何为不在存储中的记录设置显示字段
- 在Ext.js/Sencha Touch中显示数学符号
- 如何在ext-js网格中将记录数据显示为链接
- Ext JS 4复选框字段未显示
- 为什么我不能两次显示新的Ext.Window ?
- 在GridPanel Ext.net (ExtJS)中突出显示一组行
- Ext.Net V2中的GroupingView.X显示错误
- Ext.menu.Menu():如何获得菜单的宽度(需要用偏移量显示)
- Ext JS:无论浏览器时区如何,都以UTC显示日期
- 在Ext.form.Panel中显示组件
- Ext js网格问题显示日期在safari
- 修改文本字段中的值,然后再显示在Ext.grid.Panel Column中