Дождитесь завершения события click

Я добавляю обработчик событий click для elment

 $(".elem").click(function(){
       $.post("page.php".function(){
         //code1
      })
 })

И событие click click

$(".elem").click();
//code2

Как я убеждаюсь, что code2 выполняется после выполнения кода1

Ответ 1

(Игнорирование WebWorkers) JavaScript работает в одном потоке, поэтому вы можете быть уверены, что code2 будет всегда выполняться после кода1.

Если ваш код1 не делает что-то асинхронное, как Ajax-вызов или setTimeout(), и в этом случае завершится обработчик запуска, тогда будет выполняться код2, затем (в конечном итоге) обратный вызов из вызова Ajax (или setTimeout(), или что-то еще).

EDIT:. Для вашего обновленного вопроса код2 всегда будет выполняться перед кодом1, потому что, как я уже сказал выше, обратный вызов async Ajax произойдет позже (даже если ответ Ajax очень быстрый, он не будет вызовите обратный вызов, пока не закончится текущий JS).

"Как я убеждаюсь, что code2 выполняется после выполнения кода1"

Использование .click() без параметров - это ярлык для .trigger("click"), но если вы действительно вызываете .trigger() явно, вы можете предоставить дополнительные параметры, которые будут переданы обработчику, что позволяет это сделать:

$(".elem").click(function(e, callback) {
    $.post("page.php".function(){
      //code1

      if (typeof callback === "function")
         callback();
   });
});

$(".elem").trigger("click", function() {
    // code 2 here
});

То есть, внутри обработчика кликов проверяет, была ли функция передана в параметре callback, и если это так. Это означает, что когда событие происходит "естественно", никакого обратного вызова не будет, но когда вы программно его запускаете и передаете функцию, эта функция будет выполнена. (Обратите внимание, что параметр, который вы передаете с помощью .trigger(), не должен быть функцией, это может быть любой тип данных, и вы можете передать более одного параметра, но для этого нам нужна функция. См. .trigger() doco для получения дополнительной информации.)

Демо: http://jsfiddle.net/nnnnnn/ZbRJ7/1/

Ответ 2

Вы можете попробовать написать так:

 $(".elem").live("click", function(){
  //code1
 })

И ваш триггер будет всегда выполняться как запущенный.

Ответ 3

Оберните code2 в методе и добавьте его как обратный вызов внутри code1, чтобы он всегда вызывался после code1 выполняет

code2 = function(){/*code2*/};
$(".elem").click(function(){
  //code1
  code2();
 })

Ответ 4

Выполнение Javascript выполняется по строкам. Так что все, что приходит, будет выполнено в первую очередь. Поэтому добавление кода клика перед тем, как будет работать другой метод.

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

var clicked = false; $ ( '# Элем'). Нажмите (функция() {   // выполняем некоторый асинхронный процесс   clicked = true; });

while (! clicked) {//ничего не делать}

//другая функция, которая будет называться

Или второй вариант будет, если используется метод post, установите async = true в свойстве.