2012-02-02 3 views
1

У меня есть небольшая проблема со следующим кодом:Оператор keyup if для строки indexOf, нечетной?

$('#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 (текстовое поля) содержит значение «контакт» и/или «@», и если это текстовое поле делает содержит указанный значения, он всплывает/мигает div, указывающий пользователю, что они нарушают TOS. С «@» поле остается там, когда пользователь вводит его, но когда пользователь набирает «контакт», поле просто мигает несколько раз и уходит, я предполагаю, что «@» имеет длину 1 символ и «контакт» имеет длину 7 символов, это как-то связано с этим.

С другой стороны, это довольно странно? Я намеревался это всего лишь fadeIn() и остался в тени. Я не возражал против флеш-памяти, потому что, разумеется, на клавиатуре ему придется запускать функцию каждый раз, когда пользователь нажимает ключ, так что все в порядке, но я могу " t выяснить, как сохранить его там, когда пользователь вводит «контакт» где-то в текстовом поле. Кроме того, другая часть, где он использует .attr(), направляет пользователя на send.php, если он содержит «контакт», «@» - затем он подталкивает их к send.php? F = 1, а если нет, то send.php? f = 0 - #sendForm - это идентификатор тега формы, который у меня был ранее, я предполагаю, что это уже работает отлично.

Кто-нибудь знает, как получить коробку, чтобы остаться там, когда она затянулась данными «контакт»?

ответ

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'); 
    } 
}); 
1

Проблема в том, что когда вы печатаете «контакт», у вас нет символа «@». Итак, ваш первый оператор if для контакта оценивается как true и исчезает в #tosviolation. Однако следующий оператор if оценивает значение false, поэтому он сразу же исчезает. Вам нужно будет перестроить ваши операторы if (вероятно, используя условие ИЛИ, а не два отдельных оператора 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'); 
    } 
}); 
+0

AHH. Благодаря! Я только что заметил! Ура! :) – unicornication

1
  1. Почему вы не просто проверить это один раз, когда поле теряет фокус или перед formsubmit? Это проще и чище, чем проверка каждого события keyup.

  2. Я настоятельно рекомендую снова проверить ввод на серверном сервере. простое добавление f = 1 или f = 0 можно легко манипулировать. Также подумайте о том, что произошло, если пользователь отключил js.

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