我正在尝试使用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));
}
});
答案 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