Подтвердить что ты не робот

Используйте jQuery.trigger для вызова настраиваемой функции, которая возвращает значение

Есть ли способ использовать вызовы jQuery.bind() и .trigger() для выполнения определенной пользователем функции (например: save()) и действовать на возврат из метода? Например:

$("#aForm").bind ('save', function () {
  return true;
});

а затем:

if ($("#aForm").trigger ('save') == true) {
  doSomething ();
}
4b9b3361

Ответ 1

Я знаю, что этот вопрос старый, но, возможно, это может помочь кому-то.

Как указал Палиат, вы не можете вернуть значение, потому что событие триггера асинхронно. Что вы можете сделать, это передать объект в качестве параметра для события. По умолчанию объекты javascript всегда ссылаются на оригинал.

например:.

обязывать:

$(...).bind('example',function (evt,ret) { 
    ret.val = false;
});

триггер:

var ret = {ret:true};
$(...).trigger('example',[ret]);
if (!ret.ret)
    //event return false
else
    //event returned true

Ответ 2

Отъезд triggerHandler(), который многими другими способами действует как trigger(), но позволит вам вернуть значение.

Из документов:

Метод .triggerHandler() ведет себя аналогично .trigger(), с следующие исключения:

  • Метод .triggerHandler() не вызывает поведение по умолчанию для события (например, представление формы).
  • Пока .trigger() будет работать со всеми элементами, согласованными с объектом jQuery,.triggerHandler() влияет только на первый согласованный элемент.
  • События, созданные с помощью .triggerHandler(), не создают пузырьковую иерархию DOM; если они не обрабатываются целевым элементом напрямую, они ничего не делают.
  • Вместо того, чтобы возвращать объект jQuery (чтобы разрешить цепочку),.triggerHandler() возвращает любое значение, возвращенное последним обработчик, который он вызвал. Если обработчики не запускаются, это возвращает undefined

Ответ 3

Вы также можете использовать jQuery встроенный event.preventDefault() и событие .isDefaultPrevented():

$("#aForm").bind ('save', function (event) {
    return true;
    // "return false" or "event.preventDefault()" have the same effect
  }
});

а затем:

var event = $.Event('save')
$("#aForm").trigger (event)
if (event.isDefaultPrevented() == false) {
  doSomething ();
}

Ответ 4

Почему бы вам не действовать на возвращаемое значение в самом обратном вызове? Это отнимает дополнительную проверку (это не будет работать так, как вы ожидали бы).

$("#aForm").bind ('save', function () {
  if(some stuff happens that is true) {
      doSomething();
  }

  else {
      doSomethingElse();
  }
});

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