2009-10-13 3 views
3

У меня есть текстовое поле, в котором я использую событие blur для проверки текста с помощью регулярного выражения. Если это не удается, я хочу, чтобы текстовое поле сохраняло фокус. Я знаю, что в обычном javascript вы можете сказать return functionName(); в событии onblur в действительном элементе управления html. Есть ли способ сделать что-то подобное при связывании события размытия в функции $(document).ready(). Или просто установите фокус на «это». Спасибо вам за помощь.Остановка события размытия jQuery внутри функции размытия

$(document).ready(function() {"); 
    $('input:text.sqlValidation').blur(function() {"); 
     var sqlInjectionRegX2 = /...Regex.../; 
     var value = this.value; 
     if (sqlInjectionRegX2.test(value)) { 
      alert('The text you have entered may contain malicious code and can not be submitted.'); 
      this.value = ''; 
      return false; 
     } 
     else return true; 
    }); 
}); 

ответ

1

Это не просто установить

$(this).focus(); 

внутри вашей функции размытия где-нибудь?

+0

Я попытался «$ (this) .focus();» без успеха. Я использую FF3, вы знаете, работает ли это в FF3? – 2009-10-13 13:40:45

+0

Я просто попробовал в IE, и он отлично работает. По-видимому, это проблема FF3. Кто-нибудь знает работу? Я думаю, что кое-что прочитал о настройке тайм-аута. – 2009-10-13 13:43:02

6

Использование регулярных выражений в Javascript для предотвращения внедрения SQL - это мать всего (или, по крайней мере, самого) зла. НЕ ДЕЛАЙТЕ ЭТО !!! Вместо этого используйте параметры в коде на стороне сервера. Если вы не знаете, как, спросите нас. Если вы попытаетесь предотвратить SQL Injection так, как вы это делаете, это будет не, и вы можете потерять данные или, что еще хуже. Все, что вам нужно сделать, это отключить Javascript (или создать собственный HTTP-запрос), и ваш фильтр будет бесполезен. Кроме того, я не думаю, что можно полностью блокировать SQL-инъекцию с помощью одного регулярного выражения.


Чтобы ответить на этот вопрос, попробуйте написать return false или event.preventDefault() в обработчике. Однако это не сработает отлично; невозможно полностью контролировать фокус, подобный этому, в Javascript.

+1

Я согласен, но вы можете сделать как защиту на стороне клиента, так и на стороне сервера, хотя я не уверен, почему вы хотите улучшить пользовательский интерфейс для тех, кто пытается выполнить SQL-инъекцию. – tvanfosson

+0

Я использую регулярное выражение для проверки на sql-инъекцию. Но выражение, которое я создал, проверяет фактический оператор sql, т. Е. «A»; выберите «От пользователей»; или «a»; пользователи «Drop Table»; До сих пор мое тестирование показало, что оно работает правильно.Но для разработчика, чтобы придираться к его собственному коду, он похож на родителя, говорящего, что у него уродливый ребенок. :) Итак, я включу свое выражение, если кто-нибудь захочет попробовать его и сообщит мне, найдут ли они. Спасибо за вашу помощь. – 2009-10-13 13:49:42

+0

@tvanfosson: Делать это на сервере одинаково зло. Никакое регулярное выражение не может полностью блокировать SQL-инъекцию, и есть законные причины для SQL-инъекции (например, кто-то по имени «Harry O'Neill») – SLaks

3

Вы можете предотвратить поведение по умолчанию и остановить распространение события, а затем сделать this.focus() в обработчике. http://docs.jquery.com/Events/jQuery.Event. Любые манипуляции с событиями должны выполняться перед любым кодом обработки событий.

+0

illvm, спасибо за ссылку. Вызов метода события stopPropagation() отлично работал для желаемой функциональности. Теперь, чтобы решить, подходит ли регулярное выражение для этого типа проверки. Еще раз спасибо. – 2009-10-13 14:18:37

0

Я думаю, что лучший способ для вас, чтобы предотвратить SQL-инъекции без перезаписи унаследованного кода, чтобы использовать параметры (this question, который сейчас закрыт) будет удвоить все кавычки и обратные дроби (заменить ' с '' и \ с \\).

Обратите внимание, что я не специалист по синтаксису SQL, поэтому я не могу гарантировать, что это будет непроницаемо.

2

Мне приходилось иметь дело с чем-то похожим - обработчик размытия javascript, который запускал себя в виде бесконечного цикла;

Решение было:

var inBlur = false; 
jQuery('#the_input_element').blur(function(){ 
    if (!inBlur) { 
     inBlur = true; 
     jQuery('#some_other_input_element').focus(); 
     inBlur = false; 
     } 
    }); 

Я знаю, что это не ответ спросил точный вопрос, но он обращается к теме (Останов размытия события JQuery внутри функции размытия), так что может быть полезным для кого-то.

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