Kazuhiro Kotsutsumi
24 Mar 2009, 12:43 PM
コンテキストメニューやツールバーのメニューで、Ext.menu.Menukクラスを使う機会があると思います。
このExt.menu.Menuクラスは、内部的に右クリックのイベントを制御していません。
そのため、contextmenuなどのイベントも起きません。
従って、コンテキストメニューの上で、さらに右クリックするとブラウザのコンテキストメニューが表示されてしまいます。なにげに右クリックをダブルクリックしてしまう人もいるようで、マウスの調子とか。
それを修正するパッチを作りました。
取り急ぎ、2.2.1用です。
ちなみに、Right Click Cancel Menuの略です。
パッチを当てたあとのメニューオブジェクトはcontextmenuイベントを発行するようになっています。
何か処理をしたいときは、リスナーを設定してください。
RCCMenu.js
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
// {{{ Ext.ux.override.RCCMenu
/**
* Ext.ux.override.RCCMenu
*
* 右クリックキャンセルメニュー
*
* @author Kazuhiro Kotsutsumi <kotsutsumi@xenophy.com>
*/
if( Ext.version === '2.2.1' ) {
Ext.override( Ext.menu.Menu, {
// private
render : function(){
if(this.el){
return;
}
var el = this.el = this.createEl();
if(!this.keyNav){
this.keyNav = new Ext.menu.MenuNav(this);
}
if(this.plain){
el.addClass("x-menu-plain");
}
if(this.cls){
el.addClass(this.cls);
}
// generic focus element
this.focusEl = el.createChild({
tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1"
});
var ul = el.createChild({tag: "ul", cls: "x-menu-list"});
ul.on("click", this.onClick, this);
ul.on("mouseover", this.onMouseOver, this);
ul.on("mouseout", this.onMouseOut, this);
// 右クリックキャンセル処理
ul.on("contextmenu", function( e, t ) {
if( this.fireEvent("contextmenu", this, e, t) ) {
e.stopEvent();
}
}, this);
this.items.each(function(item){
var li = document.createElement("li");
li.className = "x-menu-list-item";
ul.dom.appendChild(li);
item.render(li, this);
}, this);
this.ul = ul;
this.autoWidth();
}
// }}}
});
}
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* c-hanging-comment-ender-p: nil
* End:
*/
このExt.menu.Menuクラスは、内部的に右クリックのイベントを制御していません。
そのため、contextmenuなどのイベントも起きません。
従って、コンテキストメニューの上で、さらに右クリックするとブラウザのコンテキストメニューが表示されてしまいます。なにげに右クリックをダブルクリックしてしまう人もいるようで、マウスの調子とか。
それを修正するパッチを作りました。
取り急ぎ、2.2.1用です。
ちなみに、Right Click Cancel Menuの略です。
パッチを当てたあとのメニューオブジェクトはcontextmenuイベントを発行するようになっています。
何か処理をしたいときは、リスナーを設定してください。
RCCMenu.js
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
// {{{ Ext.ux.override.RCCMenu
/**
* Ext.ux.override.RCCMenu
*
* 右クリックキャンセルメニュー
*
* @author Kazuhiro Kotsutsumi <kotsutsumi@xenophy.com>
*/
if( Ext.version === '2.2.1' ) {
Ext.override( Ext.menu.Menu, {
// private
render : function(){
if(this.el){
return;
}
var el = this.el = this.createEl();
if(!this.keyNav){
this.keyNav = new Ext.menu.MenuNav(this);
}
if(this.plain){
el.addClass("x-menu-plain");
}
if(this.cls){
el.addClass(this.cls);
}
// generic focus element
this.focusEl = el.createChild({
tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1"
});
var ul = el.createChild({tag: "ul", cls: "x-menu-list"});
ul.on("click", this.onClick, this);
ul.on("mouseover", this.onMouseOver, this);
ul.on("mouseout", this.onMouseOut, this);
// 右クリックキャンセル処理
ul.on("contextmenu", function( e, t ) {
if( this.fireEvent("contextmenu", this, e, t) ) {
e.stopEvent();
}
}, this);
this.items.each(function(item){
var li = document.createElement("li");
li.className = "x-menu-list-item";
ul.dom.appendChild(li);
item.render(li, this);
}, this);
this.ul = ul;
this.autoWidth();
}
// }}}
});
}
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* c-hanging-comment-ender-p: nil
* End:
*/