выполнение бесконечной функции jQuery

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

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

Например:

$("td.gantt").each(function() {
    if($(this).hasClass("oper")) {
       //execute a serie of functions
    }
    if($(this).hasClass("preop")) {
      //execute a serie of functions
    }
});

Вышеупомянутое выполняется однажды, и мы должны работать все время.

6
задан Tim Cooper 25 September 2011 в 14:04
поделиться

4 ответа

// define a function...
function ganttEach() {
  $("td.gantt").each(function() {
    // ...
  });
}

// ...repeat it once every second
window.setInterval(ganttEach, 1000);

Вы не можете «позволять ему работать все время» (например, , в цикле while (true) ), потому что JavaScript является однопоточным и блокировка потока означает, что ваш другой код никогда не будет выполняться. setInterval () проверяет наличие необходимых «пробелов» для выполнения другого кода.

setInterval () возвращает идентификатор, который вы можете сохранить в переменной и в какой-то момент передать в clearInterval () , чтобы он снова остановился.


Если вы хотите убедиться, что каждая новая итерация вашей функции запускается только после завершения предыдущей, используйте вместо нее setTimeout () :

// define a self-repeating function...
function ganttEach() {
  $("td.gantt").each(function() {
    // ...
  });
  window.setTimeout(ganttEach, 1000); // calls itself again in one second
}

// ...initiate self-repeating function
ganttEach();

Вероятно, вам стоит здесь также есть способ остановить бесконечное повторение, например, ввести флаг, который проверяется перед вызовом setTimeout () .

17
ответ дан 8 December 2019 в 05:19
поделиться

Вы можете запускать проверку каждые несколько миллисекунд, скажем, 50 мс, используя setInterval

window.setInterval (function () { 
  // do checks here
}, 50);

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

3
ответ дан 8 December 2019 в 05:19
поделиться

Это возможно с помощью setInterval. Мой совет - выбирать элемент вне повторяющейся функции, чтобы минимизировать накладные расходы.

Бесконечный цикл заблокирует пользовательский интерфейс браузера, поскольку это однопоточная среда. Установка интервала, однако, позволяет добавлять в стек пользовательского интерфейса действия, которые будут выполняться через заданный период времени. Вы можете указать этот период во втором параметре команды setInterval.

// select the element outside
// to minimize overhead
$gantt = $("td.gantt");

// define a repeating action
setInterval(function() {
    $gantt.each(function() {
        if($(this).hasClass("oper")) {
           //execute a serie of functions
        }
        if($(this).hasClass("preop")) {
          //execute a serie of functions
        }
    });
}, 100); // repeat interval: 100ms
3
ответ дан 8 December 2019 в 05:19
поделиться

Я не уверен, что именно вы пытаетесь сделать, но вы пробовали setInterval? Он будет продолжать выполняться, если это то, чего вы действительно хотите.

0
ответ дан 8 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: