如何检测角色的第二次出现?

时间:2013-11-18 18:39:34

标签: javascript jquery html ajax json

我正在尝试使用JavaScript将工具箱添加到MediaWiki Chat。好吧,使用此代码,我向另一个MediaWiki页面(MediaWiki:Chat-herramientas-2)发出AJAX请求以获取工具箱的内容,并在聊天中打印它。

工具箱内容的格式为:

- Navigation
 * Page 1
 * Page 2
 * Page 3|Hahaha
 * #|Execute script|hello()

第一行是第一行< li> < ul> (工具箱)。它有“活跃”类。

第二行和第三行是“< a>” href为“#”,文字分别是“Page 1”和“Page 2”。

第四行的网址为“... / Page 3”,文字为“哈哈哈”。

但是对于第五行,我想插入一个空白的href(“#”),文本“Execute script”和第二个“|”之后在其上添加“hello()”的onclick属性。

我无法完成它,因为我不知道如何检测角色的第二个外观。完整的代码是:

$(function() {
    var $chatheader = $('#ChatHeader');

    select = 'MediaWiki:Chat-herramientas-2';

    var $menu = $('<ul class="dropdown"></ul>')
    .insertAfter($chatheader)

    function flatten (options, indent) {
        var flattened = [];
        indent = indent || '';
        for (var i = 0; i < options.length; i++) {
            if ($.isArray(options[i])) {
                flattened = flattened.concat(flatten(options[i], '* '));
            } else {
                flattened.push(indent + options[i]);
            }
        }
        return flattened;
    }

    function render (lines) {
        var options = '', selected = ' selected',
            ignore = { '(': 1, ':': 1,  '<': 1 };
        for (var i = 0; i < lines.length; i++, selected = '') {
            if (!lines[i].length || ignore[lines[i][0]]) {
                continue;
            }
            var contents = mw.html.escape( lines[i].substring(2) );
            if (lines[i].substring(0, 2) === '* ') {
                var clase = contents.replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '-').toLowerCase();
                var url = contents.replace(/[^a-z0-9\s]/gi, '').replace(/[_\s]/g, '-').toLowerCase();
                var checksitiene = /\|/g.test(contents)

                if(checksitiene) {
                    var wachem = contents.replace(/\|/,'">');
                    options += '<li class="' + clase + '"' +
                        selected + '><a target="_blank" href="/wiki/' + wachem + '</a></li>';
                } else {
                options += '<li class="' + clase + '"' +
                    selected + '><a href="#">' + contents + '</a></li>';
                }
            } else {
                options += '<li class="active">' + contents + ' <span>▼</span></li>';
            }
        }
        $menu.append(options);
    }

    if (typeof select === 'string') {
        $.get('/wiki/' + select + '?action=raw&ctype=text/javascript')
        .done(function (data) {
            render(data.split(/\r\n|\n|\r/));
        });
    } else if ($.isArray(select)) {
        render(flatten(select));
    }
});

1 个答案:

答案 0 :(得分:0)

String.prototype.indexOf接受两个参数,第一个是您要匹配的字符串,第二个是从中开始匹配的索引。 See MDN

因此,在使用indexOf查找字符串的第一个实例后,您可以从该索引中搜索+(匹配字符串的长度)以查找下一个匹配项。

可以多次调用以接收字符串中的下一个索引的函数:

function makeIndexer(text,pattern,start){
  start = start||0;
  var patternLength = pattern.length
    , initialStart = start
    ;
  return function(){
    var index = text.indexOf(pattern,start);
    if(index === -1){ //start over from initial start index after we reach the end
      start = initialStart;
    }else{
      start = index + patternLength;
    }
    return index;
  }
}

然后像这样使用它:

var nextIndex = makeIndexer("Wow, what an awesome function!","w")
nextIndex() //2 still case sensitive like indexOf
nextIndex() //5
nextIndex() //14
nextIndex() //-1 Like indexOf, returns -1 when there are no more matches
nextIndex() //2 starting over