jQuery: PreventDefault () не работает на событиях ввода / клики?
-
02-10-2019 - |
Вопрос
Я хочу отключить ContextMenu по умолчанию, когда пользователь щелчна правой кнопкой мыши на поле ввода, чтобы я мог показать пользовательскую контекстную. Вообще говоря, это довольно легко отключить правильный клик меню, делая что-то вроде:
$([whatever]).bind("click", function(e) { e.preventDefault(); });
И на самом деле, я могу сделать это только о каждом элементе, за исключением полей ввода в FF - никто знает, почему или может указать мне на некоторую документацию?
Вот соответствующий код, с которым я работаю, спасибо, ребята.
HTML:
<script type="text/javascript">
var r = new RightClickTool();
</script>
<div id="main">
<input type="text" class="listen rightClick" value="0" />
</div>
JS:
function RightClickTool(){
var _this = this;
var _items = ".rightClick";
$(document).ready(function() { _this.init(); });
this.init = function() {
_this.setListeners();
}
this.setListeners = function() {
$(_items).click(function(e) {
var webKit = !$.browser.msie && e.button == 0;
var ie = $.browser.msie && e.button == 1;
if(webKit||ie)
{
// Left mouse...do something()
} else if(e.button == 2) {
e.preventDefault();
// Right mouse...do something else();
}
});
}
} // Ends Class
РЕДАКТИРОВАТЬ:
Извините, после прочтения комментариев я понимаю, что я должен уточнить несколько вещей.
1) Код выше работает ... в некотором смысле. Код может сортировать через какую кнопку нажал, она просто не заботится о том, что я говорю, E.PreventDefault () и меню правой кнопкой мыши все еще появляется. Другими словами, если вы поместите предупреждение на E.Button, вы получите 1 или 0 слева и 2 справа ... Но это просто смеется надо мной и все еще показывает проклятое меню по умолчанию!
2.
Решение 2
Извините, ребята, я знаю, что это копирование «Ответ», потому что я никогда не смог выяснить, почему WebKit Browsers не понравится, чтобы вы возились с помощью событий ввода ввода, но все, что работает. Таким образом, решение состоит в том, чтобы применить слушателя на все окно, а затем просто спросить, имеет ли цель класса, который вы хотите применить эффект на ... и отправиться оттуда. Если честно, это, вероятно, все равно лучшее решение, потому что для моего конкретного приложения это позволяет мне применить эту функциональность любому элементу, которую я хочу.
var _class = "input.hideRightClick";
this.setListeners = function() {
$(window).click(function(e) {
if($(e.target).is(_class))
{
e.preventDefault();
alert("hide!");
}
});
}
Другие советы
Решение поперечного браузера для отключения контекстного меню по умолчанию:
window.oncontextmenu = function() { return false };
Чтобы захватить событие ContextMenu только внутри данного элемента использования:
document.getElementById('myElement').oncontextmenu=function(){
// Code to handle event
return false;
}
Вы получите разные результаты в зависимости от текущего сценария событий и браузера, если вы попробуете методы, отличные от oncontextMenu, для прерывания странно-клики.
В jQuery:
$('myElement').bind('contextmenu', function(){
// Handle right-click event.
return false;
});
Вы также можете использовать событие jQuery. Какое-либо определение того, какая кнопка была нажата, но вам все равно придется отменить событие ContextMenu по умолчанию:
// Cancel default oncontextmenu event.
$(element).bind('contextmenu', function(){ return false });
$(element).mousedown(function(event){
switch (event.which)
case 1:
// Left mouse
break;
case 2:
// Middle mouse
break;
case 3:
// Right mouse.
break;
});
Я проверил это в IE6 (под вином), Chrome 11, Firefox 3.6, Opera 11 и Safari.
Я только что протестировал в Firefox 3.6, и он продолжается в первом если заявление, поэтому E.PreventDefault () никогда не вызывается.
var webKit = !$.browser.msie && e.button == 0; // TRUE IN FIREFOX 3.6
var ie = $.browser.msie && e.button == 1;
if(webKit||ie)
{
// Left mouse...do something()
} else if(e.button == 2) {
e.preventDefault();
// Right mouse...do something else();
}