Запретить действие onclick с помощью jQuery
есть некоторые ссылки с действиями события onclick
<a href="#" onclick="alert('panic!')">Let panic</a>
<a href="#" onclick="alert('panic!')" disabled="disabled">I can't panic no more</a>
Мне нужно, чтобы события событий не выполнялись по ссылкам с атрибутом отключено, не удаляя действия onclick.
$('a[disabled]').click(function(e){
e.stopPropagation();
return false;
});
Этот код мне не помогает.
обновление Даже этот код не работает
<html><head><script type='text/javascript' src='jquery-1.3.2.js'></script></head>
<body>
<a href='#' onclick="alert('HA-ha!')" disabled="disabled" class="disabled">TEST</a>
<script type="text/javascript">
$('a[disabled], a.disabled').click(function(e){
console.log('override?');
e.stopImmediatePropagation();
e.preventDefault();
e.stopPropagation();
return false;
});
</script>
</body></html>
Ответы
Ответ 1
jQuery не собирается решать этот OOTB. Это может помочь, но ни один из stopPropagation
, stopImmediatePropagation
, preventDefault
, return false
не будет работать, если вы просто присоедините их к элементу. Вам нужно переопределить обработчик элемента.
Однако вы указываете в своем вопросе "без удаления действий onclick". Поэтому вам необходимо переопределить поведение по умолчанию в момент запуска события (в отличие от простого подхода простого null
к атрибуту onclick
для отключенных якорей):
Вот что я имею в виду:
<!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" xml:lang="en" lang="en">
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<title>Disable clicks</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
</head>
<body>
<a href="#" onclick="alert('panic!')">Let panic</a>
<a href="#" onclick="alert('panic!')" disabled="disabled">I can't panic no more</a>
<script>
$('a[onclick]').each(function(){
$(this).data('onclick', this.onclick);
this.onclick = function(event) {
if($(this).attr('disabled')) { // HERE
return false;
};
$(this).data('onclick').call(this, event || window.event);
};
});
</script>
</body>
</html>
Демо здесь.
Подход к переопределению обработчика встроенного клика (onclick
) с упреждающей логикой позволяет поймать случай, когда привязка "отключена", а затем отменить событие (с помощью return false
).
Преимущество заключается в том, что для включения якоря снова вы просто .removeAttr('disabled')
на нем.
Ответ 2
disabled
не является свойством якорей. Вместо этого используйте что-то вроде rel='disabled'
.
$('a[rel="disabled"]').click( function() { return false; } );
Update:
А, конечно. Он по-прежнему запускает alert
, потому что он фактически встроен в разметку! Я никогда этого не делал и так не замечал. Возьмите этот обработчик кликов из разметки и сделайте это в jQuery в первую очередь, и тогда вы можете просто сделать что-то вроде:
$('a').click( function() {
if( $(this).attr('rel') == 'disabled' ) { return; }
// do stuff here when not disabled
return false; // so your '#' href doesn't get used
} );
Ответ 3
Проблема заключается в том, что jQuery добавляет события в порядок. Чтобы остановить другие события, события, которые необходимо остановить, должны появиться после вашего кода остановки. Поскольку у вас есть код в вашем клике, вам нужно будет изменить порядок. Это то, что я сделал бы:
<a href='#' onclick="alert('HA-ha!')" class="disabled">TEST</a>
<a href='#' onclick="alert('HA-ha!')">TEST</a>
<script type="text/javascript">
$('a').each(function(){
// Cache event
var existing_event = this.onclick;
// Remove the event from the link
this.onclick = null;
// Add a check in for the class disabled
$(this).click(function(e){
if($(this).hasClass('disabled')){
e.stopImmediatePropagation();
e.preventDefault();
}
});
// Reattach your original onclick, but now in the correct order
// if it was set in the first place
if(existing_event) $(this).click(existing_event);
});
</script>
Преимущество - просто удалить/добавить отключенный класс с помощью jQuery: $('a#whatever').addClass('disabled')
или удалить его $('a#whatever').removeClass('disabled')
, и никакая другая очистка/настройка не требуется.
Ответ 4
Любые обработчики кликов, добавленные jQuery, похоже, срабатывают после добавления в маркеры. Моим решением было бы применить обработчики кликов, используя jQuery, а не в разметке, но вы можете не иметь достаточного контроля над кодом для этого. Если вы это сделаете, просто не применяйте обработчик кликов для привязки тегов с отключенным классом (и, да, я бы использовал класс, а не несоответствующий атрибут). Если у вас нет контроля над отметкой, вы можете захотеть заменить обработчик кликов с помощью jQuery, сохранив его для последующего повторного использования.
$(function() {
$('a.disabled').each( function() {
var $this = $(this);
var click = $this.attr('onclick');
if (click) {
$this.data('click',click);
// add return false to prevent default action
$this[0].onclick = function() { return false; };
}
});
$('#restoreClick').click( function() {
$('a.disabled').each( function() {
var $this = $(this);
$this.removeClass('disabled');
var click = $this.data('click');
if (click) {
$this[0].onclick = click;
}
});
});
});
Протестировано с помощью
<div>
<a href="#" onclick="alert('panic!')">Let panic</a>
<a href="#" onclick="alert('panic!')" class="disabled">I can't panic no more</a>
</div>
<div>
<input type="button" id="restoreClick" value="Restore" />
</div>
Ответ 5
Я нашел довольно простое решение для предотвращения onclicks сегодня, но сохраняя действие, если вам это нужно.
<a href="javascript:alert('panic!')" >Let panic</a>
<a href="javascript:alert('panic!')" disabled="disabled">I can't panic no more</a>
$('a').click(function(e){
if($(this).attr('disabled')) e.preventDefault();
});
Я не большой поклонник использования "javascript:", но это было самым простым решением проблемы.
Надеюсь, что это поможет!