求各浏览器重写右键事件的javascript代码! 推荐给你个Jquery的插件,应该可以解决你的问题。名字叫Jquery contextmenu这篇文章看一眼:http://fs20041242.iteye.com/blog/830889 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 回一楼: 我不是要重写右键菜单。 只需要在指定id上右键的时候能执行turned()这方法。 这里有手误,应该是这样:<body oncontextmenu="return 右键函数();"></body> <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> 以前写了个俄罗斯方块留下的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> <!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> 把 if(ev.stopPropagation) ev.stopPropagation(); else ev.cancelBubble = true;改成 if(ev.preventDefault) ev.preventDefault(); else ev.returnValue = false;试试看,取消默认事件~ 四楼getEvent()函数是可行的。在onload方法里多加个return false能阻止浏览器菜单。 <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> 请问四楼的getEvent函数跟"ev = ev || window.event;var elem = ev.srcElement||ev.target;"有什么不同啊?是兼容性更好了吗? 还是不行,onload里加return false也没有用13楼那样改也没有用... 15楼获取事件对象的写法对了,但是阻止浏览器右键还是没起作用... 把alert()去掉右键菜单还是会出来 我的代码,onload里多加一句 document.body.oncontextmenu = function(){return false;}; 这样不alert()的话 ff下也应该可以了 我测下来是可以的阿. 在div上点击没有右键菜单的 , 其他地方点则出现右键菜单 //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('想看我的源码?小心中马哦!!!');// }//} 我没有试过放div里面, 中午看看... 没这么干过,但是做了你操作之前的一步,就是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); } }) 楼主把事件定义在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> 补充一句,老版本的IE还是用回body。 LS各位大大的代码我都看了,25L博客写得很全面,我会仔细看的。先自己找时间琢磨一下,有问题我会再次发帖求助的...先结贴! oncontextmenu="return false" jquery.comet.js 这个插件个什么玩意?能用吗? ajax跨子域名的问题 关于getElementById的奇怪问题 如何用js控制表中tr的高度 判断特殊符号的正则表达式 一个多行文本框,怎么让回车在里面不换行? 一个全屏代码的问题,请大家帮帮我呀 弹出新窗口的问题 echarts2.0中的树图结构,怎么能更改默认自带的圆形,在哪里能修改 多个select下拉框,选中当前某一项,其他下拉框去掉选中的值 用Jquery实现全选后能够执行被选中的checkbox脚本事件! 怎么取出字符串中body中的html内容和body中的属性?
只需要在指定id上右键的时候能执行turned()这方法。
<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楼的方法我下班再测吧,咱这工作位置不好,逛论坛我都是假装在查资料的...俄罗斯方块的代码:在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>
<!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>
else ev.cancelBubble = true;
改成 if(ev.preventDefault) ev.preventDefault();
else ev.returnValue = false;试试看,取消默认事件~
<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>
"ev = ev || window.event;
var elem = ev.srcElement||ev.target;"
有什么不同啊?是兼容性更好了吗?
还是不行,onload里加return false也没有用
13楼那样改也没有用...
//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('想看我的源码?小心中马哦!!!');
// }
//}
{
//浏览器版本获取
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);
}
})
<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>