2011-02-07 11 views
39

Mam div z menu pod prawym przyciskiem myszy podręcznego:jQuery/JS zapobiec prawy kliknij menu w przeglądarkach

// Attatch right click event to folder for extra options 
$('#fBox' + folderID).mousedown(function(event) { 
    if (event.which == 3) { 

     // Set ID 
     currRClickFolder = folderID; 

     // Calculate position to show popup menu 
     var height = $('#folderRClickMenu').height(); 
     var width = $('#folderRClickMenu').width(); 
     leftVal = event.pageX - (width/2) + "px"; 
     topVal = event.pageY - (height) + "px"; 
     $('#folderRClickMenu').css({ left: leftVal, top: topVal }).show(); 

    } 
}); 

ale przeglądarka dla tego elementu nadal wyskakuje menu domyślnego (kopiuj/wklej/właściwości itd) . Jakikolwiek sposób wyłączyć to? Próbowałem zwrotu false, ale nie szczęścia.

+1

co jest folderID, jest to kod pod pętlą lub coś innego? A może potrzebujesz preventDefault()? –

+0

Jest to funkcja, która dynamicznie tworzy folder. Identyfikator folderu jest unikalnym identyfikatorem folderu. –

Odpowiedz

94

Możesz wyłączyć prawe kliknięcie, dodając oncontextmenu = "return false;" do tagu twojego ciała.

<body oncontextmenu="return false;"> 
+3

Nie chcę wyłączać go dla każdego elementu, ponieważ będzie on zbyt natarczywy dla użytkownika, tylko te elementy, które określam, są tym, czego chcę. –

+17

czy spróbowałeś dodać go do nadrzędnej skrzynki odbiorczej zamiast ciała? – Shrinath

+4

Dziękuję! oncontextmenu = "return false;" przypisany do kontenera div pracował smakołyk. –

1
// Attatch right click event to folder for extra options 
$('#fBox' + folderID).mousedown(function(event) { 
    if (event.which == 3) { 
     event.preventDefault(); 
     // Set ID 
     currRClickFolder = folderID; 

     // Calculate position to show popup menu 
     var height = $('#folderRClickMenu').height(); 
     var width = $('#folderRClickMenu').width(); 
     leftVal = event.pageX - (width/2) + "px"; 
     topVal = event.pageY - (height) + "px"; 
     $('#folderRClickMenu').css({ left: leftVal, top: topVal }).show(); 

    } 
}); 
+0

Bez powodzenia, dodam to po dodaniu elementu div do DOM, ale wciąż pokazuje menu –

+0

, czy konfigurowanie kodu testowego w jsfiddle.net? – Shrinath

8

Spróbuj tego:

$('#fBox' + folderID).bind("contextmenu", function() { 
       alert("Right click not allowed"); 
       return false; 
      }); 
+0

Alert blokuje menu, ale blokuje również cały inny kod przed uruchomieniem –

+2

Jeśli chcesz, aby reszta kodu działała, użyj preventDefault() zamiast zwracania false. Zwróć false zatrzymuje wszystkie propagacje zdarzeń, ale preventDefault() zatrzymuje bieżące zdarzenie i kontynuuje wykonywanie reszty kodu. –

2

Jest to domyślne zachowanie przeglądarek teraz, aby wyłączyć alternatywną kliknij nadpisanie. Każdy użytkownik musi zezwolić na to zachowanie w najnowszych przeglądarkach. Na przykład nie zezwalam na takie zachowanie, ponieważ zawsze chcę mieć domyślne menu wyskakujące.

3

try ...

$('[id^="fBox"]').mousedown(function(event) { 
    if (event.which == 3) { 
     event.preventDefault(); 
     // Set ID 
     currRClickFolder = $(this).attr('id').replace('fBox',''); 

     // Calculate position to show popup menu 
     var height = $('#folderRClickMenu').height(); 
     var width = $('#folderRClickMenu').width(); 
     leftVal = event.pageX - (width/2) + "px"; 
     topVal = event.pageY - (height) + "px"; 
     $('#folderRClickMenu').css({ left: leftVal, top: topVal }).show(); 

    } 
}); 

jeśli masz jakieś dynamiczne tworzenie tych pól potem ...

$('[id^="fBox"]').live('mousedown',function(event) { 
    ... 
}); 
2

jQuery:

$('[id^="fBox"]').bind("contextmenu",function(e){ 
    return false; 
}); 

lub wyłączyć menu kontekstowe cała strona:

$(document).bind("contextmenu",function(e){ 
    return false; 
}); 
linia
13

Jeden jQuery:

$('[id^="fBox"]').on("contextmenu", function(evt) {evt.preventDefault();}); 
2

zgadzam się z @aruseni, blokując oncontextmenu na poziomie ciała będziesz uniknąć standardowego menu kontekstowego prawego kliknięcia dla każdego elementu na stronie.

Ale co, jeśli chcesz mieć lepszą kontrolę?

Miałem podobny problem i pomyślałem, że znalazłem dobre rozwiązanie: dlaczego nie dołączyć bezpośrednio kodu menu kontekstowego do zdarzenia contextmenu konkretnego elementu (elementów), którym chcesz się zająć? Coś takiego:

// Attatch right click event to folder for extra options 
$('#fBox' + folderID).on("contextmenu", function(event) { 
    // <-- here you handle your custom context menu 
    // Set ID 
    currRClickFolder = folderID; 

    // Calculate position to show popup menu 
    var height = $('#folderRClickMenu').height(); 
    var width = $('#folderRClickMenu').width(); 
    leftVal = event.pageX - (width/2) + "px"; 
    topVal = event.pageY - (height) + "px"; 
    $('#folderRClickMenu').css({ left: leftVal, top: topVal }).show(); 

    event.stopImmediatePropagation(); 
    return false; // <-- here you avoid the default context menu 
}); 

ten sposób można uniknąć przenoszenia dwóch różnych zdarzeń tylko uchwycić menu kontekstowe i dostosować go :)

Oczywiście zakłada to, że nie masz nic mając średnia menu kontekstowe wyświetlane, gdy ktoś klika elementy, których nie wybrałeś. Równie dobrze możesz wyświetlać różne menu kontekstowe w zależności od tego, gdzie użytkownicy klikną prawym przyciskiem myszy.

HTH

+1

dobrym pomysłem jest użycie zdarzenia "contextmenu" zamiast używania "mousedown", a następnie zidentyfikowanie prawego kliknięcia ... – lepe

1

Dla mnie

$('body').on('contextmenu',function(){return false;}); 

jQuery spełnia swoje zadanie :)

32

można wyłączyć menu kontekstowego na dowolnym elemencie, który ma:

$('selector').contextmenu(function() { 
    return false; 
}); 

Aby wyłączyć kontekst menu na stronie całkowicie (dzięki Ismail), użyj:

$(document).contextmenu(function() { 
    return false; 
}); 
+1

* działało dla całej strony, ale konkretna opcja nie działała. – Mych

+3

Selektory $ ('*') są bardzo trudne do użycia $ (dokument) – Ismail

0

Oto sposób, który ostatnio użyłem (używając trochę jQuery), gdy miałem z tym problem. Ponieważ zdarzenie mousedown występuje przed menu kontekstowym, ten trik wydaje się go przechwytywać, co oznacza dołączenie poziomu body na handlecontextmenu handler, aby tymczasowo powrócić do false podczas mousedown zdarzenia, wykonać pożądaną akcję, a następnie jako ważną część, pamiętaj o usunięciu handler'a .

Jest to tylko część mojego kodu wydobytego się jako przykład ...

$(div) 
    .mousedown(function (e) { 
     if (!leftButtonPressed(e)) { 
      disableContextMenu(true); 
      showOptions({ x: e.clientX, y: e.clientY }, div); // do my own thing here 
     } 
    }); 

Kiedy moi showoptions() zakończy RTN, funkcja zwrotna jest biegać i to nazywa disable-RTN ponownie, ale z 'false':

disableContextMenu(false); 

Oto mój disableContextMenu() RTN:

function disableContextMenu(boolDisable, fn) { 
    if (boolDisable) { 
     $(document).contextmenu(function (e) { 
      if (fn !== undefined) { 
       return fn(e); 
      } else { 
       return false; 
      } 
     }); 
    } else { 
     $(document).prop("oncontextmenu", null).off("contextmenu"); 
    } 
} 
Powiązane problemy