как использовать внешний JSON-файл в качестве переменной - PullRequest
0 голосов
/ 28 декабря 2010

В предыдущем вопросе Я спросил, как реализовать фильтр плохих слов на стороне клиента.

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

вот код на данный момент

    var filter = ['ass']; // this is a literal JSON result
    String.prototype.repeat = function (num) {
        return new Array(num + 1).join(this);
    }

    $('body').html(function (i, txt) {
        for (var i = 0; i < filter.length; i++) {

            // Create a regular expression and make it global
            var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

            txt = txt.replace(pattern, "****");
        }

        return txt;
    });

Но я бы хотел изменить его на что-то вроде

    var filter = '/generic/profanity/'; // the "profanity" page generates the exact 
                                        // same JSON result as above only in a cached
                                        // external page (it's actually generated by
                                        // an ASP.NET MVC Controller (ContentResult)
    String.prototype.repeat = function (num) {
        return new Array(num + 1).join(this);
    }

    $('body').html(function (i, txt) {
        for (var i = 0; i < filter.length; i++) {

            // Create a regular expression and make it global
            var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

            txt = txt.replace(pattern, "****");
        }

        return txt;
    });

но, к сожалению, при этом он использует '/generic/profanity' в качестве литеральной строки для регулярного выражения, а не в качестве ссылочного пути.

Возможно, это что-то действительно глупое, но как бы я это исправил?:

после ответа @ GSP я пробую этот подход, и хотя он кажется ближе, он все еще не работает.

Если я зайду в firebug и посмотрю на переменную «filter» вDOM, он представлен как ['asdf']

    var filter = '';

    String.prototype.repeat = function (num) {
        return new Array(num + 1).join(this);
    }

    $('.page').html(function (i, txt) {

        $.getJSON('/generic/profanity', function (data) {

            // data is the contents of the 
            filter = data;

        });

        for (var i = 0; i < filter.length; i++) {

            // Create a regular expression and make it global
            var pattern = new RegExp('\\b' + filter[i] + '\\b', 'g');

            txt = txt.replace(pattern, "****");
        }

        return txt;
    });

Ответы [ 3 ]

1 голос
/ 28 декабря 2010

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

Но, если вы хотите использовать этот метод, вам нужно использовать один из методов JQuery, например $ .get или $ .getJSON, чтобы получить файл с вашего сервера перед его анализом:

var filter = '';
$.getJSON('/generic/profanity', function(data) {

  // data is the contents of the 
  filter = data;

});
0 голосов
/ 28 декабря 2010

Вот пример: Динамическая загрузка внешнего файла JavaScript или CSS

Поскольку JSON в целом является чистым JavaScript, приведенный выше пример должен работать.

0 голосов
/ 28 декабря 2010

Не зная слишком много о предыдущей теме, просто выполните замену filter и сделайте экранирование \ (\\). Хотя вы не знаете, как вы собираетесь использовать JavaScript для открытия файла (если файл не размещен и вы не используете ajax или что-то еще для получения списка). JS очень загружен, когда дело доходит до доступа к локальным файлам.

var pattern = new RegExp('\\b' + filter[i].replace('\\','\\\\') + '\\b', 'g');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...