Как использовать ключевые слова для фильтрации объекта массива JSON? - PullRequest
1 голос
/ 12 января 2012

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

Ниже приведен фактический код, который я использую.

var keywords= [];
var interval = "";
var pointer = '';
var scroll = document.getElementById("tail_print");

$("#filter_button").click(
function(){
    var id = $("#filter_box").val(); 
    if(id == "--Text--" || id == ""){
        alert("Please enter text before searching.");
    }else{
        keywords.push(id);
        $("#keywords-row").append("<td><img src=\"images/delete.png\" class=\"delete_filter\" /> " + id + "</td>");
    }
}
);

$(".delete_filter").click(
function(){
   ($(this)).remove(); 
}
);

function startTail(){
clearInterval(interval);
interval = setInterval(
function(){
    $.getJSON("ajax.php?function=tail&pointer=" + pointer + "&nocache=" + new Date(),
        function(data){
            pointer = data.pointer;
            $("#tail_print").append(data.log);
            scroll.scrollTop = scroll.scrollHeight;
        });
}, 1000);
}

PHP-код, извлекающий информацию о хвостах:

function tail(){
    $file = "/path/to/the/log/filelog.log";
    $handle = fopen($file, "r");
    clearstatcache();       

    if ($_REQUEST['pointer'] == '') {
        fseek($handle, -1024, SEEK_END);
    } else {
        fseek($handle, $_REQUEST['pointer']);
    }

    while ($buffer = fgets($handle)) { 
        $log .= $buffer . "<br />\n";
    } 

    $output = array("pointer" => ftell($handle), "log" => $log);
    fclose($handle);

    echo json_encode($output);
}

Вся цель этого состоит в том, чтобы позволить пользователю фильтровать результаты журнала. Таким образом, пользователь выполняет действие, которое запускает startTail(), а $.getJSON() извлекает объект JSON, созданный функцией PHP, и печатает результаты. Работает без нареканий. Теперь я хочу дать пользователю возможность фильтровать входящие элементы. Пользователь нажимает кнопку фильтра, и jQuery берет текст фильтра и добавляет его в массив keywords, затем data.log из объекта JSON фильтруется с использованием массива keywords и затем добавляется на экран.

У меня также есть функция удаления фильтра, которая не работает. Может быть, кто-то может помочь мне с этим.

Ответы [ 2 ]

1 голос
/ 12 января 2012

Обработчик события удаления должен удалять родительский элемент td

$(".delete_filter").click(
  function(){
    $(this).parent().remove(); 
  }
);

При этом вы также можете удалить ключевое слово из массива ключевых слов.логи передают массив ключевых слов на сервер, где его можно отфильтровать.Это позволит сэкономить на размере данных, возвращаемом сервером.Если вам нужно выполнить клиентскую часть, предоставьте пример ответа, чтобы указать структуру возвращаемых данных.

0 голосов
/ 12 января 2012

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

Я не уверен, как выглядят данные в журнале, но я приведу пример:

1/12/2012 login user_name success

1/12/2012 login user_name fail

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

   while ($buffer = fgets($handle)) { 
      //if $buffer does not contain keywords
            $log .= $buffer . "<br />\n";
    } 

извините за мой псевдокод, я не пишу php.

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