2013-04-03 25 views
7

jQueryを使用してカスタムコンテキストメニューを配置しようとしています。
初めて右の位置(マウス座標)に表示されますが、現在の位置が新しい位置と合計され、メニューが画面から消えます。
ここ ではJavaScriptです:コンテキストメニューの位置付け

<script> 
$(function(){ 
    $('#box').hide(); 

    $(document).bind("contextmenu", function(e) { 
     $("#box").offset({left:e.pageX, top:e.pageY}); 
     $('#box').show(); 
     e.preventDefault(); 
    }); 

    $(document).bind("click", function(e) { 
     $('#box').hide(); 
    }); 
    $('#box').bind("click", function(e) { 
     $('#box').hide(); 
    }); 
}); 
</script> 
+0

、[ '.on()は'](http://api.jquery.com/on) '取って代わりましたjQueryの最近のバージョンでは.bind() ' – Blazemonger

答えて

8

offsetメソッドを使用しないでください、してみてくださいcss代わりに、位置決め用のコンテキストメニューは絶対:

$("#box").css({left:e.pageX, top:e.pageY}); 

CSS:

#box { 
    ... 
    position: absolute; 
} 

http://jsfiddle.net/smxLk/

+0

いずれにしても、私は実際にこれがより好きです。 CSSを正しく理解し、それに応じて設定することは、私の意見ではjQueryを使うよりも優れていますが、私は1つのエメンデーションを作成します。私は 'absolute'の代わりに' fixed'を使います。この方法では、非静的な親によって影響を受けることはできず、スクロールバーも発生しません。 –

+1

@JosephMarikle 'position:fixed'を使うと、長いページコンテンツを持つページ上でコンテキストメニューが奇妙に動作します:http://jsfiddle.net/smxLk/1/。 'position:absolute'はうまく動作します:http://jsfiddle.net/smxLk/2/。 私はまた、表示する前に、メニューが画面から消えて、その位置を固定するかどうかをチェックしなければならないと思います。そうでなければ、メニューがクリップされても意味をなさない。 – dfsq

+0

良い点。私はあなたが 'position:fixed'でスクロールするとき、それが1つの場所に留まるのを忘れていました。 XD –

4

問題は、右クリックしてから別の場所を左クリックして再度右クリックすると、位置が正しくないことです。

問題の根本原因は、要素を表示する前にオフセットを設定することです。要素がdisplay:noneに設定され、そのオフセットが変更されると、jQueryが混乱するようです。あなたがshowを切り替える必要がある問題や、あなたのコード内のoffset行修正するには

$(document).bind("contextmenu", function(e) { 
    $("#box").offset({left:e.pageX, top:e.pageY}); 
    $('#box').show(); 
    e.preventDefault(); 
}); 

$(document).bind("contextmenu", function(e) { 
    $('#box').show(); 
    $("#box").offset({left:e.pageX, top:e.pageY}); 
    e.preventDefault(); 
}); 

Demo

Source

+0

これはjQueryのバグですか? – Blazemonger

+0

@Blazemongerおそらく。しかし、隠された要素のオフセットを変更するのは実際には意味がないので、修正されるかどうかはわかりません。しかし、私は残念なことにあなたに決定的な答えはありません –

0

なっ位置を試してみてください。一定;次の条件に基づいて、コンテキストメニューの位置が変化すると - ところで

var windowHeight = $(window).height()/2; 
var windowWidth = $(window).width()/2; 
if(e.clientY > windowHeight && e.clientX <= windowWidth) { 
    $("#contextMenuContainer").css("left", e.clientX); 
    $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY); 
    $("#contextMenuContainer").css("right", "auto"); 
    $("#contextMenuContainer").css("top", "auto"); 
} else if(e.clientY > windowHeight && e.clientX > windowWidth) { 
    $("#contextMenuContainer").css("right", $(window).width()-e.clientX); 
    $("#contextMenuContainer").css("bottom", $(window).height()-e.clientY); 
    $("#contextMenuContainer").css("left", "auto"); 
    $("#contextMenuContainer").css("top", "auto"); 
} else if(e.clientY <= windowHeight && e.clientX <= windowWidth) { 
    $("#contextMenuContainer").css("left", e.clientX); 
    $("#contextMenuContainer").css("top", e.clientY); 
    $("#contextMenuContainer").css("right", "auto"); 
    $("#contextMenuContainer").css("bottom", "auto"); 
} else { 
    $("#contextMenuContainer").css("right", $(window).width()-e.clientX); 
    $("#contextMenuContainer").css("top", e.clientY); 
    $("#contextMenuContainer").css("left", "auto"); 
    $("#contextMenuContainer").css("bottom", "auto"); 
} 

http://jsfiddle.net/AkshayBandivadekar/zakn7Lwb/14/