javascript不会继续,即使它应该 - 神秘

时间:2013-05-14 11:40:47

标签: javascript

我写了一个简单的脚本,它通过textarea和transports!hash标签!和@person names @分成两个独立的输入。

但是,除非满足两个正则表达式条件中的第一个(单词以'!'开头并以'!'符号结尾),否则它不适用于下一个条件。

例如第42行console.log(persons_parsed)上的代码;根本不执行,除非!hash标签!输入textarea。

如何使它工作,所以我只能输入@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);

谢谢你, 的Jakub

2 个答案:

答案 0 :(得分:0)

读取控制台输出。它告诉你问题:

Uncaught TypeError: Cannot read property 'length' of null

替换

if (tags_parsed.length > 0) {

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

答案 1 :(得分:0)

可以对此代码进行大量清理。

你的神秘“仅在你添加第二个!时起作用”的原因是你只在keyup上运行你的代码,而不是在加载页面时。在启动时运行它也可以解决这个问题。

您还要在每个keyup事件上添加String原型!这绝对是一个坏主意。对于你的简单情况,可能根本没有理由添加到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();
});