2013-05-14 4 views
0

Я написал простой скрипт, который проходит через текстовую область и переносит! Хэш-теги! и @person имена @ на два отдельных входа.javascript не продолжается, хотя он должен - таинственный

Однако, если не выполнено первое из двух условий регулярного выражения (слово начинается с символа '!' И заканчивается символом '!'), Оно не работает для следующего условия.

Например, код в строке 42 console.log (persons_parsed); не выполняет вообще, если! hash tag! набранный в текстовое поле.

Как заставить его работать, поэтому я могу ввести только @person name @ и заполнить его на входе # persons_jquery?

Код в jsfiddle: http://jsfiddle.net/Yz2jw/1/

Проблемная часть

if (tags_parsed.length > 0) { 

     var vysledek_tags = null; 
     for (i = 0; i < tags_parsed.length; i++) { 
      if (vysledek_tags) { 
       var vysledek_tags = vysledek_tags + ', ' + tags_parsed[i].replace(/[!]/g, ''); 
      } else { 
       var vysledek_tags = tags_parsed[i].replace(/[!]/g, ''); 
      } 
     } 
     $('#tags_jquery').val(vysledek_tags); 

    } 
    console.log(persons_parsed); // THIS DOESNT RETURN ANY VALUE!!! 

    if (persons_parsed.length > 0) { 

     var vysledek = null; 
     for (i = 0; i < persons_parsed.length; i++) { 
      if (vysledek) { 
       var vysledek = vysledek + ', ' + persons_parsed[i].replace(/[@]/g, ''); 
      } else { 
       var vysledek = persons_parsed[i].replace(/[@]/g, ''); 
      } 
     } 
     $('#persons_jquery').val(vysledek); 

Спасибо, Якуб

ответ

0

Существует значительная очистка, что можно сделать по этому коду.

Причина вашего таинственного «работает только при добавлении второго !» заключается в том, что вы запускали свой код только при активации клавиатуры, а не при загрузке страницы. Запуск этого также при запуске исправит это.

Вы также добавляете к прототипу String при каждом событии keyup! Это определенно плохая идея. И для вашего простого случая, вероятно, нет причин добавлять к прототипу String вообще, если вы не собираетесь повторно использовать его во многих местах.

Вы также не кэшируете селектора jQuery, запуская их снова при каждом событии keyup. Наконец, ваша обработка вывода намного сложнее, чем нужно. Вы можете посмотреть Array.prototype.join

Вилка вашей скрипки, который фиксирует эти проблемы есть в http://jsfiddle.net/CrossEye/6sR9B/

Это соответствующий код:

$(document).ready(function() { 
    var personPattern = /[@]+[\u00BF-\u1FFF\u2C00-\uD7FF\w| ]+[@]/g, 
     tagPattern = /[\!]+[\u00BF-\u1FFF\u2C00-\uD7FF\w| ]+[\!]/g, 
     $person = $('#persons_jquery'), 
     $tag = $('#tags_jquery'); 
    var processForm = function() { 
     var text = $('textarea.new-memory').val(), 
      tags_parsed = text.match(tagPattern), 
      persons_parsed = text.match(personPattern); 
     $tag.val((tags_parsed || []).join(', ').replace(/[!]/g, '')); 
     $person.val((persons_parsed || []).join(', ').replace(/[@]/g, '')); 
    }; 
    $('textarea.new-memory').keyup(processForm); 
    processForm(); 
}); 
+0

Вау, код имеет -40 строк. Большое вам спасибо не только за код, но и за объяснение. Лично я не программист на javascript. Я использую google для программирования небольших фрагментов, которые мне нужны для моего проекта. Возможно, мне стоит потратить некоторое время на изучение некоторых оснований javascript. –

+0

Возможно, вам стоит. Это может быть чрезвычайно полезным языком для программиста. И, в отличие от нескольких лет назад, язык в эти дни даже вызывает некоторое уважение! –

0

Читать консольный вывод. Она говорит вам проблему:

Uncaught TypeError: Cannot read property 'length' of null

Заменить

if (tags_parsed.length > 0) { 

с

if (tags_parsed && tags_parsed.length > 0) { 
+0

Спасибо за ваш вклад. Но даже без условия код не работал должным образом. Во всяком случае, Скотт Сойет уже ответил на мой вопрос, который работает как шарм. –

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