keyup if indexOf的字符串是否为奇数?

时间:2012-02-02 10:44:11

标签: php javascript jquery html

我遇到以下代码的小问题:

$('#body').keyup(function(){
    var i = $('#body').val();

    if(i.toLowerCase().indexOf("contact") >= 0){
        $('#tosviolation').fadeIn('fast'); 
        $('#sendForm').attr('action','send.php?f=1');
        $('.toscontent').html("TOS Breach!");
    } else { 
        $('#tosviolation').fadeOut('fast'); 
        $('#sendForm').attr('action','send.php?f=0');
    }

    if(i.toLowerCase().indexOf("@") >= 0){
        $('#tosviolation').fadeIn('fast'); 
        $('#sendForm').attr('action','send.php?f=1');
    } else { 
        $('#tosviolation').fadeOut('fast'); 
        $('#sendForm').attr('action','send.php?f=0');
    }
});

它检查#body(textarea)是否包含值“contact”或/和“@”,如果此textarea 包含所述值,则会弹出/闪烁div告诉用户他们违反了服务条款。使用“@”时,框会在用户输入时保留在那里,但当用户输入“联系人”时,框只会闪烁几次并消失,我猜是因为“@”是1个字符长,并且“接触”是7个字符长,这与它有关。

然后,这很奇怪?我只是打算fadeIn()并且保持淡入。我不介意闪光灯,因为当然,每次用户点击一个按键时它都必须运行该功能,所以这很好,但是,当用户在textarea中的某处键入“contact”时,我无法弄清楚如何将其保留在那里。此外,它使用.attr()的另一部分是将用户指向send.php,如果它确实包含“contact”,“@” - 然后它将它们推送到send.php?f = 1,如果没有,那么send.php?f = 0 - #sendForm是我之前的表格标签的ID,我认为这已经正常了。

有人知道如果用“联系人”数据拉出盒子后如何让盒子留在那里吗?

3 个答案:

答案 0 :(得分:1)

问题是当您输入“联系人”时,您没有“@”符号。因此,您的第一个if语句用于评估为true,并在#tosviolation中淡入。但是,下一个if语句的计算结果为false,因此它会立即将其淡出。您需要重构if语句(可能使用OR条件,而不是两个单独的if语句)以避免这种情况。

这样的事情应该有效:

$('#body').keyup(function() {
    var i = $('#body').val();
    var contact = i.toLowerCase().indexOf("contact");
    var atsymbol = i.toLowerCase().indexOf("@");
    if (contact >= 0 || atsymbol >= 0) {
        $('#tosviolation').fadeIn('fast');
        $('#sendForm').attr('action', 'send.php?f=1');
        if(contact >= 0) {
            $('.toscontent').html("TOS Breach!");
        }
    } else {
        $('#tosviolation').fadeOut('fast');
        $('#sendForm').attr('action', 'send.php?f=0');
    }
});

答案 1 :(得分:1)

试试这个。请记住,设置表单的属性并依赖它进行服务器端处理危险 - 最终用户在发布之前可以轻松摆弄它。您应该再次使用服务器进行验证,而不要使用随表单一起发送的任何GET变量。

$('#body').keyup(function () {
    var i = $('#body').val();
    if (i.toLowerCase().indexOf("contact") >= 0 || i.toLowerCase().indexOf("@") >= 0) {
        $('#tosviolation').fadeIn('fast');
        $('#sendForm').attr('action', 'send.php?f=1');
        $('.toscontent').html("TOS Breach!");
    } else {
        $('#tosviolation').fadeOut('fast');
        $('#sendForm').attr('action', 'send.php?f=0');
    }
});

答案 2 :(得分:1)

  1. 为什么不在场地失去焦点或在提交之前检查一次?这比检查每个keyup事件更简单,更清洁。

  2. 我强烈建议您再次检查服务器端的输入。只需添加f = 1或f = 0即可轻松操作。还要考虑如果用户禁用了js会发生什么。