2014-01-14 6 views
0

Простите за задание этого вопроса. Я прошел довольно много решений, но для меня это не работает.Вырыв из каждой петли

У меня есть около 5 полей ввода, и если он находит незаконный символ в любом из полей ввода (если кто-то входит в один и пытается сохранить), он должен предупредить сообщение.

До сих пор, когда он находит один, он делает предупреждение, но затем он идет и сохраняет его.

Я пытаюсь вырваться из цикла each(), return false не работает.

Лучшее решение было бы также оценено.

Fiddle here

// Illegal Character Check 
$('.illegal-check').click(function() { 
    var illegal = /[&<>]/; 
    $(".scoring input:text").each(function() { 
     var inptStr =$(this).val(); 
     if (illegal.test(inptStr)===true) { 
      alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
      return false; 
     } 
    });//each 
});//click 
+1

'$ ('# answer16') click' вместо '$ ('. незаконный-check'). click' – Abhitalks

+0

Если это подразумевается как форма, вы должны обернуть вокруг нее'

' и применить обработчик на submit. –

+2

Работает нормально. Я добавил здесь консольный журнал - http: // jsfiddle.net/infernalbadger/T2vT9/4 /, и каждый цикл останавливается после первой недопустимой записи. –

ответ

3
$('.illegal-check').click(function (e) { 
    ... 
    if (illegal.test(inptStr)===true) { 
     ... 
     e.preventDefault(); 
     return; 
    } 
} 

EDIT: Причина, почему ваши данные по-прежнему получать сохраняются в том, что даже если вы нарушаете из петли с помощью «вернуться ложным;» ваше представление данных все еще продолжается. Вам также нужно отменить его. Для этого вы используете аргумент события «e», переданный обработчику событий, вызывая его функцию «preventDefault».

+0

Было бы неплохо, если бы вы расширили свой ответ и объяснили, как это решит проблему. Предоставление дампа кода на самом деле не помогает OP понять, что проблема – musefan

+0

@musefan добавил комментарий; это однострочный код, и код не требует пояснений, но в любом случае; muse are awesome, btw :) – m1kael

0

Можно также добавить переменную, чтобы увидеть, был ли нелегальный значение было найдено like this:

// Illegal Character Check 
$('.illegal-check').click(function() { 
    var illegal = /[&<>]/; 
    var found = false; 
    $(".scoring input:text").each(function() { 
    var inptStr =$(this).val(); 
    if (illegal.test(inptStr)===true) { 
     alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
     found = true; 
    } 
    }); 
    if(!found){ 
    alert("Nothing has been found") 
    }else{ 
    alert("Illegal char has been found"); 
    } 
}); 
+0

-1: Вы удалили единственное, что сломает цикл (вы знаете, что задает вопрос). Предложения, без решений, не квалифицируются как ответы – musefan

0

Лично я хотел бы добавить обработчик представить в форме вместо события щелчка по ячейке таблицы.

$('form').on('submit', function(e) { 
    // ... 
    if (illegal.test(inptStr)===true) { 
     alert('...'); 
     e.preventDefault(); 
     return false; 
    } 
    // ... 

Здесь событие передается функции, и любая ошибка предотвратит запуск этого события из фактического представления.

+0

Причина, по которой я не использую форму, состоит в том, что есть еще несколько форм, и она создается автоматически, и у меня нет доступа к кодовой стороне. Я возвращаю false или e.preventDefault(); не работает, хотя он предназначен для ...; o ( – 19eggs

+0

@ 19eggs. Вы можете использовать '$ ('# answer16'). ближайший ('form'). on ('submit', ...)' then. –

+0

Опять же, в зависимости от пользователя, зарегистрированного .. может быть еще несколько входов, и идентификаторы продолжают меняться ... – 19eggs

0

JQuery-х $.fn.each, похожий на $.each, сломается из петли с return false и переходите к следующей итерации с любой не falsy return. It's documented on the API site.

По всем вопросам, эта часть вашего кода должна быть в порядке.

+0

Но это не нормально, потому что сам обработчик клика должен «возвращать false», так что щелчок не распространяется или выполните аналогичный метод для пройденного события. –

+0

@Jack * эта часть вашего кода * относится к * выходу из каждого цикла *. Ваше утверждение больше связано с разрешением события, чем jQuery-петлями. это то, что на самом деле означает OP, но вы можете быть правы - возможно, отредактируйте вопрос (в частности, название), чтобы понять, что это не прорыв петли? – Barney

0

Вот обновленная скрипка. Проверьте наличие ошибок в отдельной функции

$('.illegal-check').click(function() { 
    if(checkIllegal()) evt.preventDefault(); 
}); 

function checkIllegal(){ 
    var illegal = /[&<>]/; 
    var isIllegal = false; 
    $(".scoring input:text").each(function() { 
     if (illegal.test($(this).val()) && !isIllegal) { 
     alert('Your Scoring field(s) contain these & < > invalid characters. Please remove them and try again.'); 
     isIllegal = true; 
     return false; 
     } 
    }); 
    return isIllegal; 
} 

http://jsfiddle.net/T2vT9/7/

+0

Даже несмотря на то, что он работает в скрипке, он все равно не работает .. Я запутался .. – 19eggs

+0

Вы можете изменить событие из .illegal- проверьте на свой переключатель кнопки отправки. Контейнер .illegal-check не имеет никакого действия по умолчанию, поэтому evt.preventDefault на самом деле не имеет смысла. Измените это на кнопку отправки, и она должна работать – Ankur

0

return false утверждение не выбиться из цикла $(...).each(...). Ваша проблема в том, что она по-прежнему продолжается и сохраняет ее. Вы также должны остановить событие от выполнения его действия по умолчанию, используя e.preventDefault(). (примечание: это было также упомянуто в помойке кода по m1kael, которые не добавляют объяснения)

Эта сумма на этот код:.

// Illegal Character Check 
$('.illegal-check').click(function (e) { 
    var illegal = /[&<>]/; 
    $(".scoring input:text").each(function() { // loop over elements in form 
     var inptStr = $(this).val(); 
     if (illegal.test(inptStr)===true) { 
      alert('...'); // show alert 
      e.preventDefault(); // prevent default action on click (stop submit) 
      return false; // break out of elements loop, no more alerts needed 
     } 
    });//each 
});//click 
+0

У меня было сомнение в том, следует ли комментировать его ответ или добавить свой собственный. Поскольку у него не было никакого объяснения с его ответом, я решил создать новый, который был фактическим ответом. Затем я добавил дамп кода, основываясь на его ответе. –

+0

Значит, меня наказывают за упоминание существующей работы? Редактировать: слегка изменено упоминание M1kael –

+0

Вы не должны ссылаться на другие ответы, эти ответы могут быть удалены, и это делает вас неполными. Хорошие ответы должны стоять там, без зависимости – musefan

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