Как мне создать функцию прослушивания javascript, которая будет выполнять действие при выполнении условия? - PullRequest
0 голосов
/ 08 марта 2012

Я использую сторонний javascript, который дал мне большую потребность в слушателях.Например, когда определенный div был загружен, я хочу что-то с ним сделать.Он меняет стили объектов по мере того, как он идет, поэтому мне нужно следить за тем, чтобы он имел определенный стиль.Я построил функции, чтобы действовать, когда идентификатор или класс существует.Вот текущая функция ID.Как видите, он использует jQuery.

function whenLoaded(element_id, action) {
    if ($(element_id)) {
        action();
    }
    else {
        setTimeout("whenLoaded('"+element_ids+"',"+action+", '"+stop_on+"')", 500);
    }
}

Мне действительно нужно что-то, для чего я могу дать несколько условий.Например:

whenTrue(
    ($('popup') && $('popup').style.width == '500px'), 
    $('popup').style.width = '0'
);

Я бы ожидал, что он рекурсивно проверит условия (1-й параметр).Когда эти условия выполняются, выполните действие.

Мне удалось выполнить это с помощью eval (), но меня предупредили не использовать его, не помню, почемуПри этом я хотел бы сделать это по-другому.

eval () решение:

whenTrue(
    "($('popup') && $('popup').style.width == '500px')", 
    "$('popup').style.width = '0'"
);

function whenTrue(condition, action) {
    if (eval(condition)) {
        eval(action);
    }
    else {
        setTimeout("whenTrue('"+condition+"','"+action+"')", 500);
    }
}

Ответы [ 3 ]

0 голосов
/ 08 марта 2012
function conditionListener(callback){
    if(typeof callback !== 'function') return;

    var interval, callback = callback;

    interval = setInterval(function() {
        if(true /* some condition */){
            callback();
            clearInterval(interval);
        }
    }, 500);
}

var listener = new conditionListener(function() {
    /* ... do work ... */
});

http://jsfiddle.net/M26XS/

0 голосов
/ 08 марта 2012

Почему бы вам просто не принять условие и действие?это сделало бы это намного проще.

function whenTrue(condition, action) {     
   if (condition) {         
      action();     
   }     
  else {
         setTimeout("whenTrue('"+condition+"',"+action+", '"+stop_on+"')", 500); 
 }

}

и затем вы можете указать условие при вызове функции, это будет выглядеть так:

0 голосов
/ 08 марта 2012

Я однажды написал эту функцию, которая выглядит так, как будто она делает в основном то, что вы хотели бы:

function pollUntilTrue(conditionFunc, afterTrueFunc, timeout) {
    var __xinterval = setInterval(function() {
      var res = conditionFunc();
      if (res === true) {
        clearInterval(__xinterval);
        afterTrueFunc();
      }
    }, timeout);
  }

вы бы использовали ее со своим кодом следующим образом:

pollUntilTrue(function() {
   return ($('popup') && $('popup').style.width == '500px');
}, 
function() {
  $('popup').style.width = '0';
}, 500);

Настройте время ожиданиядля удовлетворения ваших потребностей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...