推荐给你个Jquery的插件,应该可以解决你的问题。
名字叫Jquery  contextmenu
这篇文章看一眼:http://fs20041242.iteye.com/blog/830889

解决方案 »

  1.   

    回一楼: 我不是要重写右键菜单。
             只需要在指定id上右键的时候能执行turned()这方法。
      

  2.   

    这里有手误,应该是这样:<body oncontextmenu="return 右键函数();"></body>
      

  3.   


    <script type="text/javascript">
    function turned(){
    alert('turned');
    }
    function doit(ev){
        ev = getEvent();            //获取事件对象
        var elem = ev.srcElement||ev.target; //获取触发事件的对象
    if(ev.button==2){
        if (/\d+\|\d+/.test(elem.id)){       //如果id满足条件,执行代码
            turned();
    if(ev.stopPropagation) ev.stopPropagation();
    else ev.cancelBubble = true;
            return false;
        }
    }
    }function getEvent() {
        if (document.all) {
            return window.event; //for ie
        }
        func = getEvent.caller;
        while (func != null) {
            var arg0 = func.arguments[0];
            if (arg0) {
                if ((arg0.constructor == Event || arg0.constructor == MouseEvent) || (typeof (arg0) == "object" && arg0.preventDefault && arg0.stopPropagation)) {
                    return arg0;
                }
            }
            func = func.caller;
        }
        return null;
    }
    window.onload = function(){
    document.body.onmousedown = doit;
    }
    </script><div id="a1|2">xxxx</div>
      

  4.   

    以前写了个俄罗斯方块留下的bug。因为游戏里是用右键来控制变形的,所以点了右键除了执行变形的方法,还得禁止浏览器弹出右键菜单。
    现在工作上又有点空闲了所以再次拿出来看了一下...
    4楼的方法我下班再测吧,咱这工作位置不好,逛论坛我都是假装在查资料的...俄罗斯方块的代码:在mayTurned()这个方法里面做右键处理(就是四楼的doit()了),turned()是方块变形的函数。<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>luosi</title>
    </head>
    <body oncontextmenu="return mayTurned();">
    <table>
    <tr><td colspan="2">
    <div id="top"></div>
    </td></tr>
    <tr>
    <td><div id="left"></div></td>
    <td><div id="main"></div></td>
    </tr>
    <tr><td></td><td>
    <button onclick="this.style.display='none';down();">开始</button>
    <button onclick="turned();">变形</button>
    </td></tr>
    </table>
    </body>
    <script type="text/javascript">
    //---------------------------- 一些需要初始化的变量 ----------------------------//
    var top = document.getElementById("top");
    var left = document.getElementById("left");
    var main = document.getElementById("main");
    //板大小
    var width = 5, height = 8;
    var i = 1; var j = 1; var k = 1; var g = 1;//控制循环的变量
    //当前的列、行、块
    var currentX = 0, currentY = 0;
    var allTissue = [[2,4,1,1,1, 1,1, 2,1, 3,1, 4,1],//前面2、4、1、1,1是参数:X轴、最大X、最大Y、顺,逆变形后变成数组中第几个。
    [1,1,4,0,0, 1,1, 1,2 ,1,3, 1,4]];
    var p = 5;//
    var currentTissue;
    //-------------------------------- 一些函数 --------------------------------//
    //点创建 坐标
    function createCell(x,y){
    var cell = document.createElement("button");
    cell.setAttribute("style","height: 30px;width: 30px;");
    cell.setAttribute("id",x+"|"+y);
    cell.setAttribute("onclick","moveTissue(this.id);");
    return cell;
    }//点染色 bel:true时染色;false时去色
    function printCell(cell,bel){
    if (cell != null && bel && !cell.disabled){
    cell.setAttribute("style","height: 30px;width: 30px;background-color: teal;");
    cell.setAttribute("disabled","disabled");
    }
    else if (cell != null && !bel && cell.disabled){
    cell.setAttribute("style","height: 30px;width: 30px;");
    cell.removeAttribute("disabled");
    }
    else {
    throw "cellPrintError";
    }
    }//块生成
    function getTissue(){
    currentTissue = allTissue[Math.floor(Math.random()*allTissue.length)];
    try{
    printTissue(true);
    }catch (error){
    alert("死!");
    }
    }
    //块打印
    function printTissue(bel){
    for (i = p;i < currentTissue.length - 1;i += 2){
    try{
    printCell(document.getElementById((currentTissue[i]+currentX)+"|"
    +(currentTissue[i+1]+currentY)),bel);
    }catch (error){
    for (j = p;j < i;j += 2){
    printCell(document.getElementById((currentTissue[j]+currentX)+"|"
    +(currentTissue[j+1]+currentY)),false);
    }
    throw error;
    }
    }
    }
    //块移动
    function moveTissue(id){
    if (id.replace(/\|\d+/,"") > currentTissue[1]+currentX){
    printTissue(false);
    currentX ++;
    try{
    printTissue(true);
    }catch (error){
    currentX --;
    printTissue(true);
    }
    }
    else if(id.replace(/\|\d+/,"") < currentTissue[1]+currentX){
    printTissue(false);
    currentX --;
    try{
    printTissue(true);
    }catch (error){
    currentX ++;
    printTissue(true);
    }
    }
    }
    function down(){
    printTissue(false);
    currentY ++;
    try{
    printTissue(true);
    }catch (error){
    currentY --;
    printTissue(true);
    removeRow();
    currentY = 0; currentX = 0;
    getTissue();
    }
    window.setTimeout("down()",500);
    }//块变形
    function turned(){
    printTissue(false);
    currentTissue = allTissue[currentTissue[3]];
    try{
    printTissue(true);
    }catch (error){
    currentTissue = allTissue[currentTissue[4]];
    printTissue(true);
    }
    }
    function mayTurned(ev){
    ev = ev || window.event;
    var elem = ev.srcElement||ev.target;
    if (/\d+\|\d+/.test(elem.id)){
    turned();
    return false;
    }
    }
    //行消除
    function removeRow(){
    for (i = height;i >= 1;i --){
    for (j = 1;j <= width;j ++){
    var cell = document.getElementById(j+"|"+i);
    if (!cell.disabled){
    cell = null; break;
    }
    if (j != width){continue;}
    for (k = 1;k <= width;k ++){
    for (g = i;g > 1;g --){
    var cell = document.getElementById(k+"|"+g);
    var upCell = document.getElementById(k+"|"+(g-1));
    if(cell.disabled != upCell.disabled){
    printCell(cell,upCell.disabled);
    }
    cell = null; upCell = null;
    }
    }
    i ++; break;
    }
    }
    }//-------------------------------- 开始位置 --------------------------------//
    for (i = 1;i <= height;i ++){
    for (j = 1;j <= width;j ++){
    var cell = createCell(j,i);
    main.appendChild(cell);
    cell = null;
    }
    main.innerHTML += "<br/>";
    }
    getTissue();
    </script>
    </html>
      

  5.   


    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <style>
    </style>
    <script>
    /**
     * 为需要设置的dom添加右键事件
     * @object el
     * 需要添加事件的dom对象
     * @function fun
     * 右键事件调用的方法
     */
    function addContextmenu(el,fun){
        var tmpEvent=function(el){
          return function(event){
            event=event||window.event;
            if(event.button==2){
              fun(el,event);
            }
          }
        }
        try{
            el.addEventListener('mousedown',tmpEvent(el),true);
        }
        catch(ex){
            el.attachEvent('onmousedown',tmpEvent(el),true);
        }
    }
    /**
     * 随便定义一个右键事件方法,方法有两个参数,第一个参数为事件响应的dom对象,第二个为事件对象
     */
    var testEvent=function(el,e){
      alert(el.innerHTML);
    }
    </script>
    </head><body>
    <div id='div1'>右键测试</div>
    <script>
    //效果:按照testEvent的内容,在"右键测试"上右击,弹出'右键测试'",方法自定义
    addContextmenu(document.getElementById('div1'),testEvent);
    //可以继续添加,下面的效果:右键点击"右键测试",弹出div的id,上面的效果后继续这个效果
    addContextmenu(document.getElementById('div1'),function(el,e){alert(el.id)});
    </script>
    </body>
    </html>
      

  6.   

    把  if(ev.stopPropagation) ev.stopPropagation();
                else ev.cancelBubble = true;
    改成  if(ev.preventDefault) ev.preventDefault();
                else ev.returnValue = false;试试看,取消默认事件~
      

  7.   

    四楼getEvent()函数是可行的。在onload方法里多加个return false能阻止浏览器菜单。
      

  8.   


    <body oncontextmenu="右键函数();" id="123|1"></body>
    // 这里上面的写法浏览器会解析为
    oncontextmenu="function(){右键函数();}"
    //生成一个匿名函数,所以下面要到caller里面去取第一个参数,也是上面那个匿名函数的第一个参数<script>
        function 右键函数(ev){
            ev = arguments.callee.caller.arguments[0] || window.event;//获取事件对象
            var elem = ev.srcElement||ev.target; //获取触发事件的对象
            if (/\d+\|\d+/.test(elem.id)){       //如果id满足条件,执行代码
                //turned();
                alert(0);
                if(ev.preventDefault) { // 阻止浏览器的默认行为,也就是右键菜单
                    ev.preventDefault();
                } else {
                    ev.returnValue = false;
                }
                return false;
            }
        }
    </script>
      

  9.   

    请问四楼的getEvent函数跟
    "ev = ev || window.event;
    var elem = ev.srcElement||ev.target;"
    有什么不同啊?是兼容性更好了吗?
      

  10.   


    还是不行,onload里加return false也没有用
    13楼那样改也没有用...
      

  11.   

    15楼获取事件对象的写法对了,但是阻止浏览器右键还是没起作用... 把alert()去掉右键菜单还是会出来
      

  12.   

    我的代码,onload里多加一句 document.body.oncontextmenu = function(){return false;}; 这样不alert()的话 ff下也应该可以了
      

  13.   

    我测下来是可以的阿. 在div上点击没有右键菜单的 , 其他地方点则出现右键菜单
      

  14.   


    //JS禁用鼠标右键--支持主流浏览器
    //function stopRight() { 
    //    document.oncontextmenu = function (e) {
    //        e = e || event;
    //        //console.dir(e);//
    //        if (e.preventDefault) {
    //            e.preventDefault(); //firefox中阻止默认事件的传播
    //        } else {
    //            e.returnValue = false; // IE中给事件返回false,则阻止传播
    //        }
    //        alert('想看我的源码?小心中马哦!!!');
    //    }
    //}
      

  15.   

    我没有试过放div里面, 中午看看...
      

  16.   

    没这么干过,但是做了你操作之前的一步,就是JS抓取浏览的版本(ie、火狐、safari、360之类的     function sh()
        {
        //浏览器版本获取
            document.getElementById('hid_version').innerText='Test';
        
                    var Sys = {}; 
                    var ua = navigator.userAgent.toLowerCase(); 
                    var s; 
                    (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : 
                    (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : 
                    (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : 
                    (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : 
                    (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0; 
                    
                    //以下进行测试 
                    
                    if(Sys.ie) 
                    {
                        //alert('IE: '+Sys.ie); 
                    }
                    else if(Sys.firefox) 
                    {
                        //alert('Firefox: '+Sys.firefox);
                    } 
                    else if(Sys.chrome) 
                    {
                        //alert('Chrome: '+Sys.chrome); 
                    }
                    else if(Sys.opera) 
                    {
                        //alert('Opera: '+Sys.opera); 
                    }
                    else//if(Sys.safari) alert('Safari: '+Sys.safari);      
                    {
                        //alert('Safari: '+Sys.safari);
                    }
                        
        })
      

  17.   

    楼主把事件定义在documentElement上应该就可以了,另外,Firefox在标签内定义事件响应函数时无法将事件对象传递,在js中定义事件响应函数就很正常,而且也符合分离的原则,所以推荐楼主这样改。下面的程序在Firefox、chrome、IE9下都运行正常,不会弹出右键菜单。另外,关于Firefox下的event对象可以参考小弟的博文:http://blog.csdn.net/legend1988/article/details/6982535<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    <script type="text/javascript">
    window.onload = function()
    {
    document.documentElement.oncontextmenu = test;
    };
    var test = function(ev)
    {
    ev = ev || window.event;
    document.getElementById('btn').style.backgroundColor = 'red';
    if(ev.preventDefault)
    {
    ev.preventDefault();
    }
    else
    {
    ev.returnValue = false;
    }
    return false;
    };
    </script>
    </head><body>
    <button id="btn" value="i am coming">i am coming.</button>
    </body>
    </html>
      

  18.   

    补充一句,老版本的IE还是用回body。
      

  19.   

    LS各位大大的代码我都看了,25L博客写得很全面,我会仔细看的。先自己找时间琢磨一下,有问题我会再次发帖求助的...先结贴!
      

  20.   

     oncontextmenu="return false"