如何使用外部json文件作为变量

时间:2010-12-27 22:24:08

标签: jquery json

previous question中,我问过如何实现客户端坏字过滤器。

我遇到的问题是我不想将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并查看DOM中的“filter”变量,则表示为['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 个答案:

答案 0 :(得分:1)

因为JQuery总是从浏览器上下文运行,所以你总是会下载文件,所以这不会像你想象的那样工作。

但是,如果你想使用这个方法,你需要使用其中一个JQuery方法,如$ .get或$ .getJSON来解析它之前从你的服务器获取文件:

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

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

});

答案 1 :(得分:0)

如果不太了解上一个主题,只需在filter上执行替换,然后对\进行转义(\\)。虽然不确定你将如何使用JavaScript打开文件(除非文件是托管的,你使用ajax或其他东西来检索列表)。在访问本地文件时,JS非常容易使用。

var pattern = new RegExp('\\b' + filter[i].replace('\\','\\\\') + '\\b', 'g');

答案 2 :(得分:0)

以下是一个示例:Dynamically loading an external JavaScript or CSS file

因为JSON通常是纯JavaScript,所以上面的例子应该可以工作。