在实现某些功能, 例如只在某 DIV 上面弹出右键菜单的时候, 这个函数可以用一下,供参考用, 用一些 JS 组件库应该可以更方便的实现:
// Discover browser info {{{
var browserInfo = new Object();
var sAgent = navigator.userAgent.toLowerCase() ;
browserInfo.IsIE = ( sAgent.indexOf("msie") != -1 ) ;
browserInfo.IsGecko = !browserInfo.IsIE ;
browserInfo.IsSafari = ( sAgent.indexOf("safari") != -1 ) ;
browserInfo.IsNetscape = ( sAgent.indexOf("netscape") != -1 ) ;
// End of browser info }}}
/**
* Check if the event is happent in the element.
* @param event - event object
* @param element - the element of the document
*
* @author beansoft
* @version 1.0 2006-04-30
*/
function checkEventIn(event, element)
{
if(!event) {
event = window.event;
}
var e;
if(browserInfo.IsGecko) {
e = event.target;
} else {
e = event.srcElement;
}
while ( e )
{
if ( e == element ) return true;
e = e.parentNode ;
}
return false;
}
下面是一个判断只有在某组件(组件名为'父组件')点击了鼠标右键后才弹出自定义菜单的代码(弹出菜单为一个 ID 为 popup 的 DIV, 在其他地方则只弹出浏览器自带菜单的示例代码:
var oncontextmenu = function(e)
{
// Make sure popup only displays on codeman_js_tree
if(checkEventIn(e, $('父组件')) == false) {
return;
}
if(!e) {
e = window.event;
}
if(browserInfo.IsGecko) {
try {
e.preventDefault();
} catch(ex) {
}
}
$('popup').style.left = e.clientX + 'px';
$('popup').style.top = e.clientY + 'px';
$('popup').style.display = "";
return false;
};
// IE
try {
$('父组件'.oncontextmenu = oncontextmenu;
} catch(ex) {
}
// Gecko
if(browserInfo.IsGecko) {
try {
$(父组件').addEventListener(
'contextmenu', oncontextmenu, true);
} catch(ex) {
}
}