Остановка события размытия jQuery в функции размытия

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

$(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;
    });
});
13.10.2009 13:27:28
5 ОТВЕТОВ

Разве это не просто установить

$(this).focus();

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

1
13.10.2009 13:35:19
Я пробовал "$ (this) .focus ();" без успеха. Я использую FF3, вы знаете, работает ли это в FF3?
user189119 13.10.2009 13:40:45
Я только что попробовал в IE, и он отлично работает. Так что, очевидно, это проблема FF3. Кто-нибудь знает работу вокруг? Я думаю, что прочитал кое-что об установке таймаута.
user189119 13.10.2009 13:43:02

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


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

6
13.10.2009 13:40:48
Я согласен, но вы могли бы выполнять как защиту на стороне клиента, так и на стороне сервера - хотя я не уверен, почему вы хотите улучшить взаимодействие с пользователем для тех, кто пытается выполнить инъекцию SQL.
tvanfosson 13.10.2009 13:47:43
Я на самом деле использую регулярное выражение для проверки SQL инъекций. Но выражение, которое я создал, проверяет фактический оператор sql, то есть «a '; Select * From Users;» или "a '; Drop Table Users;" Пока что мое тестирование показало, что оно работает правильно. Но для разработчика, чтобы найти ошибку в его собственном коде, все равно, что родители говорят, что у них ужасный ребенок. :) Так что я включу свое выражение, если кто-то захочет попробовать, и дайте мне знать, если они найдут. Спасибо за вашу помощь.
user189119 13.10.2009 13:49:42
@tvanfosson: Делать это на сервере - тоже зло. Ни одно регулярное выражение не может полностью блокировать внедрение SQL, и есть законные причины для внедрения SQL (например, кто-то по имени Harry O'Neill)
SLaks 13.10.2009 13:51:27
И я на самом деле выполняю как клиентскую, так и серверную проверку. И, к сожалению, это выражение долго размещать здесь. Поэтому я добавлю новый «вопрос», спрашивающий, не хочет ли кто-нибудь проверить выражение и сообщить мне о результатах.
user189119 13.10.2009 13:51:47
@ Джош Х. Как у вас могут быть пользователи, не «склонные к информатике», которые также пытаются атаковать с помощью SQL-инъекций? Это кажется довольно информатикой склонной ко мне: P
Jiaaro 11.08.2010 21:37:23

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

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

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

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

0
23.05.2017 11:47:54

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

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

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

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

2
19.02.2013 07:26:36