Как обернуть событие клика какой-нибудь пользовательской функцией - PullRequest
0 голосов
/ 08 октября 2009

У меня есть кнопка «Создать проект», когда пользователь нажимает кнопку, я хочу, чтобы произошло 2 вещи

  1. ajax-вызов, чтобы проверить, разрешено ли пользователю создавать проект
  2. если разрешено, затем выполнить кнопку как обычно, если нет, то всплывающее модальное диалоговое окно с сообщением, что ему не разрешено создавать новый проект.

У меня есть следующий код

$('.create_project').click(function(e) {
   e.stopDefault();
   $.getJSON('/check_user_limit', function(data){
        if(data.allow_to_create_project){
           //trigger the click here
        }else{
           //modal here
        }
    }
});

использование 'trigger' в приведенном выше коде не будет работать, так как он стал бесконечным циклом. Unbind работает в первый раз, но не будет работать во второй раз, так как foo больше не связывается с функцией.

Ответы [ 4 ]

1 голос
/ 08 октября 2009

Это довольно просто, вы просто делаете следующее:

$('.foo').click(function(e) {
   $(this).href = "/bar"; # done something else before the click

   return true;
});

Если вы хотите перехватить событие click и не распространять его, просто вместо этого верните false. Я заметил, что вы сделали свой пример более четким, но решение все еще несколько похоже. Вместо того, чтобы возвращать true для распространения события, мы вручную запускаем щелчок, сообщая функции click, чтобы проглотить событие, возвращая false. Код будет выглядеть примерно так:

$('.create_project').click(function(e) {
   $.getJSON('/check_user_limit', function(data) {
        if (data.allow_to_create_project) {
           e.click();
        } else {
           //modal here
        }
   }
   return false;
});

Однако сделать AJAX-запрос для проверки работоспособности функции обычно не очень хорошая идея. Если сервер уже знает, что пользователь не может создать проект, то почему кнопка нажимается в первую очередь? Вместо этого обновите элемент управления, указав соответствующее состояние.

0 голосов
/ 08 октября 2009

Зачем беспокоиться об этом на стороне клиента?

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

Иногда вам просто нужно оценить, нужен ли конкретный инструмент для достижения цели.

0 голосов
/ 08 октября 2009

Я немного растерялся. Вы упомянули отмену привязки, но в текущем коде нет фактической отмены привязки событий.

Если вы просто пытаетесь выполнить какой-то предварительный щелчок кода элемента, вы делаете это неправильно.

$('.foo').click(function(e)
{
    $(this).href = "/bar";
    return true; // this is implicit, but you could return false to cancel the event
});

Если вы пытаетесь сделать что-то еще, я бы рекомендовал использовать два отдельных события, одно из которых - имя пользовательского события.

0 голосов
/ 08 октября 2009

Я не уверен, почему вы не захотите просто сделать:

$('.foo').click(function(e) {
    $(this).href = "/bar";
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...