jquery Validate Плагин. Генерация случайного сообщения об успехе, один раз - PullRequest
1 голос
/ 07 августа 2010

Вчера я отправил этот вопрос , на который дан ответ, но это привело к другой проблеме.

У меня есть следующий код с помощью плагина проверки jquery:

       //array of success messages and randomly select one 
   var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!","Yay!", "Success!", "Ok!", "Perfect!","Sweet!" ];
function successMessage(label) {
return messages[Math.floor(Math.random() * messages.length)];
}

Тогда мой код проверки успешности

...success: function(label) {
                if(!$(label).hasClass("valid")){
          label.addClass("valid").text(successMessage());
            }
       }...

То, что происходит, - то, что каждый раз, когда форма действительна (на keyup или foucus), она генерирует сообщение об успехе. Я подумал, так как я добавлял класс «valid», логичным шагом было бы проверить, имеет ли метка класс «valid» и поэтому не добавляйте сообщение, потому что оно уже есть. Это, однако, не работает. Любые другие идеи будут великолепны.

Редактировать: Итак, после дальнейших исследований и размышлений. Я почти уверен, что проблема в том, что класс «valid» удаляется и добавляется каждый раз, когда проверяется форма (при keyup, submit и т. Д.). Я думаю, что проще всего выбрать значение метки. и посмотрите, соответствует ли результат массиву, если это так, то не делайте ничего другого, добавьте сообщение об успехе. Я могу ошибаться. Я также не думаю, что сформулировал вопрос лучше всего с первого раза. Просто выглядит глупо, что сообщение проверки изменяется, когда пользователь печатает.

РЕДАКТИРОВАТЬ 2 После множества предложений для пояснения и примера кода я публикую эту ссылку http://jsfiddle.net/Ye3Ls/20/ если вы введете в поле, пока не получите сообщение об успехе, продолжайте печатать, вы увидите в чем проблема. Я использую плагин проверки, найденный здесь Спасибо всем вашим пациентам, пока я разбираюсь, как заставить это работать. Я думаю, что мне может понадобиться что-то вроде in_array или has_value ()

Ответы [ 3 ]

1 голос
/ 08 августа 2010

Не требуется метка в качестве параметра для successMessage.

function successMessage() {
    return messages[Math.floor(Math.random() * messages.length)];
}

Я считаю, что если метка уже является объектом jQuery, то это делает: $(label) создаст новый объект метки jQuery, присоединенный кJQuery.Попробуйте это:

if(!label.hasClass("valid")){
    label.addClass("valid").text(successMessage());
}

Или

if(label.not(".valid")){
    label.addClass("valid").text(successMessage());
}

Или даже лучше:

label.not(".valid").addClass("valid").text(successMessage());

[РЕДАКТИРОВАТЬ] после вопроса, заданного в комментарии

if(label.text() === ''){
    label.not(".valid").addClass("valid").text(successMessage());
}
else {
    label.addClass("valid");
}

Я предполагаю, что вам нужно добавить класс valid к label.Если вы не удалите оператор else.

Я также предполагаю, что единственный способ ввода текста в label - через successMessage.Поэтому вам не нужно добавлять текст к label.Он останется прежним.

Кстати, если плагин меняет классы ваших HTML-элементов, то это серьезный побочный эффект кода, и я лично не буду мириться сэто.

Теперь, возможно, более логичным является то, что вы перезагружаете свой контент после подачи.Если это так, то все манипуляции jQuery с DOM, которые вы делали до отправки, будут потеряны из-за перезагрузки нового контента.

В будущем было бы очень важно добавить ссылку на фактический плагин.в и более полный код для работы.@Nick Craver использует jsfiddle.net, а я использую jsbin.com для публикации примера кода.Это может быть совместное усилие всех наших частей, чтобы иметь возможность воспроизвести и решить проблему.

[РЕДАКТИРОВАТЬ 1A] Вот это

Проблема в том, что метка создается более одного раза.С этим плагином, на мой взгляд, не так легко работать.

Мне пришлось изменить расположение ошибок и логику успеха.

    errorPlacement: function(label, element) {
    // position error label after generated textarea
    var name = element.attr('name');
    if ($('#' + name + '_label').length === 0) {

        label.attr('id', name + '_label');

        label.insertAfter(element);

        if (element.is("textarea")) {
            label.css({'padding-left': '105px'})
        }
    }
},

success: function(label) {
    var name = label.attr('for');
    $('#' + name + '_label').not('.valid').removeClass('error').addClass('valid').text(successMessage());
}
0 голосов
/ 07 августа 2010

Если label является переменной и label.addClass ("valid") работает нормально, почему бы вам не проверить, используя:

if (! ((Label) .hasClass ("valid"))) {

вместо if (! $ (Label) .hasClass ("valid")) {

0 голосов
/ 07 августа 2010

Похоже, вы хотите сказать:

$(label).addClass("valid").text(successMessage());

вместо:

label.addClass("valid").text(successMessage());
...