2016-01-18 2 views
0

Я делаю счетчик персонажей как код для хобби. Пока это работает, но у меня есть глюк, который я не могу решить. Когда я пишу термины «a,b,c», то он правильно пишет a:1 b:1 c:1. Но когда я пишу «a,a,c,c», тогда он пишет только a:2. Я не уверен, что случилось. Вот часть JavaScript моего кода (myFunction активируется с помощью кнопки, и testinput.value является значение текстового поля я использую):Счетчик символов не будет печатать все символы

function myFunction() { 
    var occurence = document.getElementById("testinput").value; 
    var cycleOne = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", 
    "u", "v", "w", "x", "y", "z" 
    ]; 
    for (i = 0; i < 26; i++) { 
    var counter = new RegExp(cycleOne[i], 'g'); 
    document.write(occurence.match(counter).length); 
    } 
} 
+0

Является ли документ закрытым, когда это работает? 'document.write' удаляет закрытые документы и создает новый пустой открытый в том же самом происхождении. –

+0

['document.write'] (https://developer.mozilla.org/en-US/docs/Web/API/document.write) не предназначено для добавления контента на страницу в обработчике событий (т. Е. После страница была проанализирована). Вместо этого используйте подходящий метод манипуляции с DOM. – Teemu

+0

Например, document.body.appendChild (document.createTextNode (instance.match (counter) .length)); 'является манипуляцией DOM с видом, который предлагает Teemu. –

ответ

8

Он печатает только 2 потому, что он терпит неудачу с ошибкой, сразу после этого.

Рассмотрим случай, когда вход a,a,c,c.

В первой итерации цикла вы будете сопоставляться с a, после чего он найдет два совпадения и распечатает их.

На второй итерации вы будете соответствовать b, и ее нет в строке. Так occurence.match(counter) будет возвращать null, и вы пытаетесь получить length собственность от null. Вот почему он выбрасывает ошибку

TypeError: Cannot read property 'length' of null

и останавливает выполнение.


Чтобы это исправить, вам нужно проверить, если это не null, прежде чем продолжить, как это

var result = occurence.match(new RegExp(cycleOne[i], 'g')); 
    if (result !== null) { 
    console.log(result.length);  
    } 
+0

Fiddle - https://jsfiddle.net/daveSalomon/1Lshzksr/ и исправлено - https://jsfiddle.net/daveSalomon/1Lshzksr/1/ –

+1

@DaveSalomon Я просто избегал совпадений более одного раза в мой ответ :-) – thefourtheye

Смежные вопросы