Мы хотим знать, возможно ли иметь функцию с помощью jQuery, чтобы осмотреть много элементов и, в зависимости от типов, присвоенных им одним щелчком, выполнить другие функции. В основном, функция, которая работала бы навсегда, в то время как пользователь не обновляет страницу.
Идея не состоит в том, чтобы зависеть от щелчков событий для выполнения функции, но классов, присвоенных определенному элементу.
Например:
$("td.gantt").each(function() {
if($(this).hasClass("oper")) {
//execute a serie of functions
}
if($(this).hasClass("preop")) {
//execute a serie of functions
}
});
Вышеупомянутое выполняется однажды, и мы должны работать все время.
// 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 ()
.
Вы можете запускать проверку каждые несколько миллисекунд, скажем, 50 мс, используя setInterval
window.setInterval (function () {
// do checks here
}, 50);
Вы можете в конечном итоге использовать много мощности процессора, если ваши проверки будут слишком частыми или слишком сложными.
Это возможно с помощью 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
Я не уверен, что именно вы пытаетесь сделать, но вы пробовали setInterval? Он будет продолжать выполняться, если это то, чего вы действительно хотите.