验证文本区域的每一行都以某些内容开头

时间:2012-01-09 04:05:18

标签: javascript jquery

我正在尝试验证textarea,确保每行以“http://”开头:

http://jsfiddle.net/n8zYB/1/

当url错误时,它会执行else语句,但如果它是正确的,它就不会被执行。

有什么问题?

5 个答案:

答案 0 :(得分:2)

它不起作用,因为this引用了一个String对象。 after函数需要一个jQuery对象或一个字符串。奇怪的是,javascript字符串与String对象不同。您的else语句有效,因为当您将常规字符串连接到场景后,this将被转换为幕后的字符串。但是,if失败,因为在这种情况下this仍然是String对象。你可以通过几种方式修复它,但这里有一个:

$('button').click(function(){
    var links = $('textarea').val().split('\n');

    $.each(links,function(){
        if( this.substr(0, 7) == 'http://' )
            $('p').after(''+this);
        else
            $('p').after('error: '+this+'<br/>');
    });
    return false;
});

修改

这是另一个SO问题的链接,可以更详细地讨论Why are there two kinds of JavaScript strings?

答案 1 :(得分:0)

不要使用$.each来迭代数组。使用此:

for(var i = 0; i < links.length; i++) {
    if(links[i].substring(0, 7) !== 'http://' && links[i].substring(0, 8) !== 'https://') {
        $('p').text('Error!');
        return false;
    }
}

Here's a demo.

答案 2 :(得分:0)

由于$('p').after(this);,它无效。在这种情况下,this只是一个字符串文字。

after函数的第一个参数应该是要在匹配元素集中的每个元素之后插入的HTML字符串,DOM元素或jQuery对象。

这是updated jsFiddle

答案 3 :(得分:0)

这个怎么样:

$('button').click(function(){
    var links = $('textarea').val().split('\n');

    $.each(links,function(){
        if( this.substr(0, 7) == 'http://' )
            $('p:last').after("<p>" + this + "</p>");
        else
            $('p:last').after('error: '+this+'<br/>');
    });
    return false;
});

答案 4 :(得分:0)

我认为这会好一点,试试吧

$('button').click(function(){
    var links = $('textarea').val().split('\n');

    $.each(links,function(){
        if( this.substr(0, 7) == 'http://' )
            $('#mydiv').append(this + '<br/>');
        else
            $('#mydiv').append('<span style="color:red;">error: '+this+'</span><br/>');
    });
    return false;
});

HTML:

<textarea></textarea>
<button>Submit</button>
<div id='mydiv'></div>

小提琴:http://jsfiddle.net/n8zYB/6/