Я пытаюсь создать редактор меток, например Stack Overflow.Невозможно прочитать свойство 'length' из null в javascript для цикла
Я получаю эту ошибку, указанную в заголовке, если на самом деле я не нахожу звездочку и http: // содержащую фразу в текстовое поле. Если я нахожу только звездочку, содержащую фразу, ошибка относится к этой строке: if(linkify.length!==0)
Вот jsfiddle, чтобы показать вам, что я имею в виду.
Вот мой HTML:
<textarea></textarea>
<div></div><button type="button">Markdownify</button>
Вот мой JS:
var val=$('textarea').val(), boldify = val.match(/\*\*[A-Za-z0-9]+\*\*/gim),
italicify = val.match(/\*[A-Za-z0-9]+\*/gim),linkify = val.match(/http\:\/\/[A-z0-9]+\.[A-z0-9]+/gim);
$(document.body).on('click', 'button', function() {
val=$('textarea').val(), boldify = val.match(/\*\*[A-Za-z0-9]+\*\*/gim),
italicify = val.match(/\*[A-Za-z0-9]+\*/gim),linkify = val.match(/http\:\/\/[A-z0-9]+\.[A-z0-9]+/gim);
if (boldify.length!== 0){
for (var i=0; i < boldify.length; i++) {
var boldMatch= boldify[i],
boldReplace = boldMatch.replace(/\*\*[A-z0-9]+\*\*/gim, '<span style="font-weight:bold;color:blue;">'+boldMatch+'</span>'),
val = val.replace(boldMatch, boldReplace);
}
val = val.replace(/\*\*/gi, "");
}
if(italicify.length!== 0){
for(var j=0; j < italicify.length; j++){
var italicMatch= italicify[j],
italicReplace = italicMatch.replace(/\*[A-z0-9]+\*/gim, '<span style="font-style:italic;color:red;">'+italicMatch+'</span>');
val = val.replace(italicMatch, italicReplace);
}
val = val.replace(/\*/gi, "");
}
if(linkify.length!== 0){
for(var k=0; k < linkify.length; k++){
var linkMatch= linkify[k],
linkReplace = linkMatch.replace(/http:\/\/[A-z0-9]+\.[A-z0-9]+/gim, '<a href="'+linkMatch+'">'+linkMatch+'</a>');
val = val.replace(linkMatch, linkReplace);
}
}
$('div').html(val);
});
Любая помощь будет высоко ценится.
привет Baz1nga, спасибо за ваш help, есть ли какая-то причина, по которой я не должен просто делать то, что предложил jimw, т. е. 'if (linkify && linkify.length)'? Это меньше кода для написания, а затем тестового и комбинированного комбо, не так ли? –
Я не видел этого ответа, и я обновил свой ответ с учетом штрафа за выполнение, за которое вы платите за регулярное выражение дважды. – Baz1nga
также http://jsperf.com/regexp-test-vs-match-m5 – Baz1nga