jQuery: получить возврат onclick-функции из якоря - PullRequest
3 голосов
/ 29 марта 2011

Есть ли способ получить возвращаемое значение функции onclick, такой как confirm, в функцию jQuery?

У меня есть ссылки, которые имеют событие onclick для подтверждения, которое возвращает true или false:

<a onclick="return confirm('Sure?');" class="delete" href="delete.php">Delete</a>

Это заданная структура, и у меня нет возможности ее изменить. Но я бы хотел сделать что-то вроде этого:

$('a.delete').click(function() {
    if (confirm_from_onclick == true) {
        //do some more before really returning true and following the link
    }
});

Ответы [ 2 ]

5 голосов
/ 29 марта 2011

Если у вас нет возможности изменить HTML-разметку , вам нужно удалить полный onclick встроенный обработчик из этого узла и добавить его в свой ненавязчивый обработчик событий.

Это может выглядеть так:

$(function() {
    $('a').each(function(_, anchor) {
        var onclk = anchor.onclick;  // store the original function
        anchor.onclick = null;       // delete/overwrite the handler

        $(anchor).bind('click', function() {
            if( onclk() ) {
                // do something
            }
            return false;  // call stopPropagation() + preventDefault()
        });
    });    
});

Поскольку вы имеете дело с onclick встроенным обработчиком событий, вы не можете остановить или предотвратить его запуск с помощью ненавязчиво связанного обработчика событий. Сначала он всегда срабатывает, поэтому вам нужно полностью удалить исходное событие.

Вам не нужно хранить функцию, вы также можете просто установить onclick в null и переписать логику в своем собственном обработчике событий. Я сделал это только для удобства.

Демо : http://jsfiddle.net/em9KP/

3 голосов
/ 29 марта 2011

Действительно простой ответ, который может быть не совсем тем, что вы ищете, но почему бы не удалить событие «onclick» из якоря, а затем обработать все внутри функции щелчка?подтвердить диалог внутри функции.

<a class="delete" href="delete.php">Delete</a>

$('a.delete').click(function(e) {
    e.preventDefault();
    if (confirm('Sure?')) {
        //do some more before really returning true and following the link
    }
});

РЕДАКТИРОВАТЬ : Извините!Пропустил ту часть, где вы упомянули, что это заданная структура, и вы не можете ее изменить.Работаю над альтернативой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...