2013-04-03 11 views
7

Próbuję ustawić niestandardowe menu kontekstowe za pomocą jQuery.
Po raz pierwszy pojawia się we właściwej pozycji (współrzędne myszy), ale wtedy aktualna pozycja jest sumowana z nową pozycją, tak aby menu zniknęło z ekranu.
Oto JavaScript:Menu kontekstowe pozycjonowania

<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

Nawiasem mówiąc, [ '.on()'] (http://api.jquery.com/on) zastąpił ' .bind() 'w najnowszych wersjach jQuery. – Blazemonger

Odpowiedz

8

Nie używaj offset metody, spróbuj css zamiast, pozycjonowanie menu kontekstowego absolutnie:

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

CSS:

#box { 
    ... 
    position: absolute; 
} 

http://jsfiddle.net/smxLk/

+0

W każdym razie lubię to lepiej. Prawidłowe zrozumienie CSS i ustawienie go odpowiednio zawsze będzie lepsze niż używanie jQuery w mojej opinii, ale zrobiłbym jedną emendację. Użyłbym 'fixed' zamiast' absolute'. w ten sposób nie może wpływać na niestatyczny obiekt nadrzędny i nie powoduje wyświetlania pasków przewijania. –

+1

@JosephMarikle Użycie 'position: fixed' powoduje, że menu kontekstowe zachowuje się dziwnie: http: //jsfiddle.net/smxLk/1/ na stronie z długą zawartością strony. 'position: absolute' działa poprawnie: http://jsfiddle.net/smxLk/2/. Wydaje mi się również, że przed pokazaniem musimy sprawdzić, czy menu wychodzi z ekranu i ustalić jego pozycję, inaczej menu nie ma sensu, jeśli jest przycięte. – dfsq

+0

Dobre punkty. Zapomniałem, że pozostanie w jednym miejscu podczas przewijania z 'position: fixed'. XD –

4

Problem polega na tym, że po kliknięciu prawym przyciskiem myszy kliknij lewym przyciskiem myszy w innym miejscu, a następnie kliknij ponownie prawym przyciskiem, pozycja jest niepoprawna.

Źródłem problemu jest ustawienie przesunięcia przed wyświetleniem elementu. Wygląda na to, że pomylenie jQuery, jeśli element jest ustawiony na display:none, a następnie jego przesunięcie zostanie zmienione.

Aby rozwiązać ten problem, trzeba przełączyć show i offset linie w kodzie:

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

staje

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

Demo
i
Source

+0

Czy to jest błąd w jQuery? – Blazemonger

+0

@Blazemonger Być może. Nie jestem pewien, czy zostanie to naprawione, ponieważ nie ma sensu zmieniać przesunięcia ukrytego elementu. Ale nie mam niestety ostatecznej odpowiedzi –

0

pozycję Spróbuj: naprawiony; z pozycji menu kontekstowego zmian opartych na następujących warunkach -

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/

Powiązane problemy