Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Как отправить на сервер только выбранные радио


Автор: Cheizer 29.4.2014, 14:13
Дорогие друзья, всю голову изломал, не могу понять как правильно сделать.

Есть форма на сайте, аяксом отправляется, вот часть html инпутов, как пример NAME все работает отлично на всех моментах до почты пользователя. НО понадобилось добавить RADIO кнопки, и все труба, а проблема в том, что не знаю как отправлять на почту только выбранный РАДИО, они все имеют значения, и аякс отправляет их успешно, php принимает и в письмо, и никаких выбранных, или все, или ничего 
Код

<label class="name">
<input type="text" value="Введите ваше имя:">
<br class="clear">
<span class="error error-empty">*</span><span class="empty error-empty">*</span> 
</label>
 
вот они мои кнопочки проблемные:
<label class="kol">
<input type="radio" class="group1" name="kol" value="1" checked> 1 шт<br>
<input type="radio" class="group1" name="kol" value="2"> 2 шт
</label>




вот часть обработчика яваскрипт, кjторый уже передает PHP, и вот тут я думаю самая заморочка с этим getValFromLabel, если без него, то все две переменные отправляет. Вот как тут правильно написать что бы VALUE одно и ВЫБРАННОЕ улетало к php?????



Код

//forms
;(function($){
    $.fn.forms=function(o){
        return this.each(function(){
            var th=$(this)
                ,_=th.data('forms')||{
                    errorCl:'error',
                    emptyCl:'empty',
                    invalidCl:'invalid',
                    notRequiredCl:'notRequired',
                    successCl:'success',
                    successShow:'4000',
                    mailHandlerURL:'bat/MailHandler.php',
                    ownerEmail:'[email protected]',
                    product:'Заказ',
                    stripHTML:true,
                    smtpMailServer:'localhost',
                    targets:'input,textarea',
                    controls:'a[data-type=reset],a[data-type=submit]',
                    validate:true,
                    rx:{
                        ".state":{rx:/.{2}/,target:'input'},
                        ".state":{rx:/^[a-zA-Z'][a-zA-Z-' ]+[a-zA-Z']?$/,target:'input'},
                        ".email":{rx:/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i,target:'input'},
                        ".phone":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
                        ".fax":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
                        ".message":{rx:/.{15}/,target:'textarea'}
                    },
                    preFu:function(){
                        _.labels.each(function(){
                            var label=$(this),
                                inp=$(_.targets,this),
                                defVal=inp.val(),
                                trueVal=(function(){
                                            var tmp=inp.is('input')?(tmp=label.html().match(/value=['"](.+?)['"].+/),!!tmp&&!!tmp[1]&&tmp[1]):inp.html()
                                            return defVal==''?defVal:tmp
                                        })()
                            trueVal!=defVal
                                &&inp.val(defVal=trueVal||defVal)
                            label.data({defVal:defVal})                                
                            inp
                                .bind('focus',function(){
                                    inp.val()==defVal
                                        &&(inp.val(''),_.hideEmptyFu(label),label.removeClass(_.invalidCl))
                                })
                                .bind('blur',function(){
                                    _.validateFu(label)
                                    if(_.isEmpty(label))
                                        inp.val(defVal)
                                        ,_.hideErrorFu(label.removeClass(_.invalidCl))                                            
                                })
                                .bind('keyup',function(){
                                    label.hasClass(_.invalidCl)
                                        &&_.validateFu(label)
                                })
                            label.find('.'+_.errorCl+',.'+_.emptyCl).css({display:'block'}).hide()
                        })
                        _.success=$('.'+_.successCl,_.form).hide()
                    },
                    isRequired:function(el){                            
                        return !el.hasClass(_.notRequiredCl)
                    },
                    isValid:function(el){                            
                        var ret=true
                        $.each(_.rx,function(k,d){
                            if(el.is(k))
                                ret=d.rx.test(el.find(d.target).val())                                        
                        })
                        return ret                            
                    },
                    isEmpty:function(el){
                        var tmp
                        return (tmp=el.find(_.targets).val())==''||tmp==el.data('defVal')
                    },
                    validateFu:function(el){                            
                        el.each(function(){
                            var th=$(this)
                                ,req=_.isRequired(th)
                                ,empty=_.isEmpty(th)
                                ,valid=_.isValid(th)                                
                            
                            if(empty&&req)
                                _.showEmptyFu(th.addClass(_.invalidCl))
                            else
                                _.hideEmptyFu(th.removeClass(_.invalidCl))
                            
                            if(!empty)
                                if(valid)
                                    _.hideErrorFu(th.removeClass(_.invalidCl))
                                else
                                    _.showErrorFu(th.addClass(_.invalidCl))                                
                        })
                    },
                    getValFromLabel:function(label){
                        var val=$('input,textarea',label).val()
                            ,defVal=label.data('defVal')                                
                        return label.length?val==defVal?'nope':val:'nope'
                    }
                    
                    
                    ,submitFu:function(){
                        _.validateFu(_.labels)                            
                        if(!_.form.has('.'+_.invalidCl).length)
                            $.ajax({
                                type: "POST",
                                url:_.mailHandlerURL,
                                data:{
                                    name:_.getValFromLabel($('.name',_.form)),
                                    email:_.getValFromLabel($('.email',_.form)),
                                    phone:_.getValFromLabel($('.phone',_.form)),
                                    gate:$('input.gate',_.form).val()||'nope',
                                    key:$('input.key',_.form).val()||'nope',
                                    count:_.getValFromLabel($('.count',_.form)),
                                    
                                    kol:$('input.kol',_.form).val()||'nope',
                                    
                                    twok:$('input.twok',_.form).val()||'nope',
                                    sam:$('input.sam',_.form).val()||'nope',
                                    deliw:$('input.deliw',_.form).val()||'nope',
                                    posta:$('input.posta',_.form).val()||'nope',
                                    
                                    fax:_.getValFromLabel($('.fax',_.form)),
                                    //message:_.getValFromLabel($('.message',_.form)),
                                    message:$('input.message',_.form).val()||'nope',
                                    pro_duct:_.product,
                                    owner_email:_.ownerEmail,
                                    stripHTML:_.stripHTML
                                },
                                success: function(){
                                    _.showFu()
                                }
                            })            
                    },
                    showFu:function(){
                        _.success.slideDown(function(){
                            setTimeout(function(){
                                _.success.slideUp()
                                _.form.trigger('reset')
                            },_.successShow)
                        })
                    },
                    controlsFu:function(){
                        $(_.controls,_.form).each(function(){
                            var th=$(this)
                            th
                                .bind('click',function(){
                                    _.form.trigger(th.data('type'))
                                    return false
                                })
                        })
                    },
                    showErrorFu:function(label){
                        label.find('.'+_.errorCl).slideDown()
                    },
                    hideErrorFu:function(label){
                        label.find('.'+_.errorCl).slideUp()
                    },
                    showEmptyFu:function(label){
                        label.find('.'+_.emptyCl).slideDown()
                        _.hideErrorFu(label)
                    },
                    hideEmptyFu:function(label){
                        label.find('.'+_.emptyCl).slideUp()
                    },
                    init:function(){
                        _.form=_.me                        
                        _.labels=$('label',_.form)

                        _.preFu()
                        
                        _.controlsFu()
                                                        
                        _.form
                            .bind('submit',function(){
                                if(_.validate)
                                    _.submitFu()
                                else
                                    _.form[0].submit()
                                return false
                            })
                            .bind('reset',function(){
                                _.labels.removeClass(_.invalidCl)                                    
                                _.labels.each(function(){
                                    var th=$(this)
                                    _.hideErrorFu(th)
                                    _.hideEmptyFu(th)
                                })
                            })
                        _.form.trigger('reset')
                    }
                }
            _.me||_.init(_.me=th.data({forms:_}))
            typeof o=='object'
                &&$.extend(_,o)
        })
    }
})(jQuery)
$(window).load(function(){
    $('#form').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ОБРАТНОГО ЗВОНКА (верх)'
    })
})
$(window).load(function(){
    $('#form1').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ОБРАТНОГО ЗВОНКА (низ)'
    })
})
$(window).load(function(){
    $('#form2').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА 5 КОМПЛЕКТОВ (верх)'
    })
})
$(window).load(function(){
    $('#form3').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА ПОКУПКУ ОПТОМ'
    })
})
$(window).load(function(){
    $('#form4').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА 5 КОМПЛЕКТОВ (низ)'
    })
})
$(window).load(function(){
    $('#order0').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 1 КОПМПЛЕКТА'
    })
})
$(window).load(function(){
    $('#order2').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 3 КОПМПЛЕКТОВ'
    })
})
$(window).load(function(){
    $('#order3').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 5 КОПМПЛЕКТОВ'
    })
})






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

Код

if($_POST['kol']!='nope'){
        $kol = $_POST["kol"];
        $messageBody .= '<p>штуки: ' .$kol. ' комплект</p>' . "\n";
        
    }



Как сделать так, что бы kol:$('input.kol',_.form).val()||'nope', в яваскрипт обработчике, принимал только выбранной кнокпи значение???? И отправлял в одной переменно в php обработчик?

Автор: Aliance 29.4.2014, 16:26
А как можно ответить на этот вопрос, не видя листинга функции getValFromLabel?

Автор: Cheizer 29.4.2014, 16:52
Цитата(Aliance @ 29.4.2014,  16:26)
А как можно ответить на этот вопрос, не видя листинга функции getValFromLabel?

Извиняюсь, просто он очень большой smile

Код

//forms
;(function($){
    $.fn.forms=function(o){
        return this.each(function(){
            var th=$(this)
                ,_=th.data('forms')||{
                    errorCl:'error',
                    emptyCl:'empty',
                    invalidCl:'invalid',
                    notRequiredCl:'notRequired',
                    successCl:'success',
                    successShow:'4000',
                    mailHandlerURL:'bat/MailHandler.php',
                    ownerEmail:'[email protected]',
                    product:'Заказ',
                    stripHTML:true,
                    smtpMailServer:'localhost',
                    targets:'input,textarea',
                    controls:'a[data-type=reset],a[data-type=submit]',
                    validate:true,
                    rx:{
                        ".state":{rx:/.{2}/,target:'input'},
                        ".state":{rx:/^[a-zA-Z'][a-zA-Z-' ]+[a-zA-Z']?$/,target:'input'},
                        ".email":{rx:/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i,target:'input'},
                        ".phone":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
                        ".fax":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
                        ".message":{rx:/.{15}/,target:'textarea'}
                    },
                    preFu:function(){
                        _.labels.each(function(){
                            var label=$(this),
                                inp=$(_.targets,this),
                                defVal=inp.val(),
                                trueVal=(function(){
                                            var tmp=inp.is('input')?(tmp=label.html().match(/value=['"](.+?)['"].+/),!!tmp&&!!tmp[1]&&tmp[1]):inp.html()
                                            return defVal==''?defVal:tmp
                                        })()
                            trueVal!=defVal
                                &&inp.val(defVal=trueVal||defVal)
                            label.data({defVal:defVal})                                
                            inp
                                .bind('focus',function(){
                                    inp.val()==defVal
                                        &&(inp.val(''),_.hideEmptyFu(label),label.removeClass(_.invalidCl))
                                })
                                .bind('blur',function(){
                                    _.validateFu(label)
                                    if(_.isEmpty(label))
                                        inp.val(defVal)
                                        ,_.hideErrorFu(label.removeClass(_.invalidCl))                                            
                                })
                                .bind('keyup',function(){
                                    label.hasClass(_.invalidCl)
                                        &&_.validateFu(label)
                                })
                            label.find('.'+_.errorCl+',.'+_.emptyCl).css({display:'block'}).hide()
                        })
                        _.success=$('.'+_.successCl,_.form).hide()
                    },
                    isRequired:function(el){                            
                        return !el.hasClass(_.notRequiredCl)
                    },
                    isValid:function(el){                            
                        var ret=true
                        $.each(_.rx,function(k,d){
                            if(el.is(k))
                                ret=d.rx.test(el.find(d.target).val())                                        
                        })
                        return ret                            
                    },
                    isEmpty:function(el){
                        var tmp
                        return (tmp=el.find(_.targets).val())==''||tmp==el.data('defVal')
                    },
                    validateFu:function(el){                            
                        el.each(function(){
                            var th=$(this)
                                ,req=_.isRequired(th)
                                ,empty=_.isEmpty(th)
                                ,valid=_.isValid(th)                                
                            
                            if(empty&&req)
                                _.showEmptyFu(th.addClass(_.invalidCl))
                            else
                                _.hideEmptyFu(th.removeClass(_.invalidCl))
                            
                            if(!empty)
                                if(valid)
                                    _.hideErrorFu(th.removeClass(_.invalidCl))
                                else
                                    _.showErrorFu(th.addClass(_.invalidCl))                                
                        })
                    },
                    getValFromLabel:function(label){
                        var val=$('input,textarea',label).val()
                            ,defVal=label.data('defVal')                                
                        return label.length?val==defVal?'nope':val:'nope'
                    }
                    
                    
                    ,submitFu:function(){
                        _.validateFu(_.labels)                            
                        if(!_.form.has('.'+_.invalidCl).length)
                            $.ajax({
                                type: "POST",
                                url:_.mailHandlerURL,
                                data:{
                                    name:_.getValFromLabel($('.name',_.form)),
                                    email:_.getValFromLabel($('.email',_.form)),
                                    phone:_.getValFromLabel($('.phone',_.form)),
                                    gate:$('input.gate',_.form).val()||'nope',
                                    key:$('input.key',_.form).val()||'nope',
                                    count:_.getValFromLabel($('.count',_.form)),
                                    
                                    kol:$('input.kol',_.form).val()||'nope',
                                    
                                    twok:$('input.twok',_.form).val()||'nope',
                                    sam:$('input.sam',_.form).val()||'nope',
                                    deliw:$('input.deliw',_.form).val()||'nope',
                                    posta:$('input.posta',_.form).val()||'nope',
                                    
                                    fax:_.getValFromLabel($('.fax',_.form)),
                                    //message:_.getValFromLabel($('.message',_.form)),
                                    message:$('input.message',_.form).val()||'nope',
                                    pro_duct:_.product,
                                    owner_email:_.ownerEmail,
                                    stripHTML:_.stripHTML
                                },
                                success: function(){
                                    _.showFu()
                                }
                            })            
                    },
                    showFu:function(){
                        _.success.slideDown(function(){
                            setTimeout(function(){
                                _.success.slideUp()
                                _.form.trigger('reset')
                            },_.successShow)
                        })
                    },
                    controlsFu:function(){
                        $(_.controls,_.form).each(function(){
                            var th=$(this)
                            th
                                .bind('click',function(){
                                    _.form.trigger(th.data('type'))
                                    return false
                                })
                        })
                    },
                    showErrorFu:function(label){
                        label.find('.'+_.errorCl).slideDown()
                    },
                    hideErrorFu:function(label){
                        label.find('.'+_.errorCl).slideUp()
                    },
                    showEmptyFu:function(label){
                        label.find('.'+_.emptyCl).slideDown()
                        _.hideErrorFu(label)
                    },
                    hideEmptyFu:function(label){
                        label.find('.'+_.emptyCl).slideUp()
                    },
                    init:function(){
                        _.form=_.me                        
                        _.labels=$('label',_.form)

                        _.preFu()
                        
                        _.controlsFu()
                                                        
                        _.form
                            .bind('submit',function(){
                                if(_.validate)
                                    _.submitFu()
                                else
                                    _.form[0].submit()
                                return false
                            })
                            .bind('reset',function(){
                                _.labels.removeClass(_.invalidCl)                                    
                                _.labels.each(function(){
                                    var th=$(this)
                                    _.hideErrorFu(th)
                                    _.hideEmptyFu(th)
                                })
                            })
                        _.form.trigger('reset')
                    }
                }
            _.me||_.init(_.me=th.data({forms:_}))
            typeof o=='object'
                &&$.extend(_,o)
        })
    }
})(jQuery)
$(window).load(function(){
    $('#form').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ОБРАТНОГО ЗВОНКА (верх)'
    })
})
$(window).load(function(){
    $('#form1').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ОБРАТНОГО ЗВОНКА (низ)'
    })
})
$(window).load(function(){
    $('#form2').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА 5 КОМПЛЕКТОВ (верх)'
    })
})
$(window).load(function(){
    $('#form3').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА ПОКУПКУ ОПТОМ'
    })
})
$(window).load(function(){
    $('#form4').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА 5 КОМПЛЕКТОВ (низ)'
    })
})
$(window).load(function(){
    $('#order0').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 1 КОПМПЛЕКТА'
    })
})
$(window).load(function(){
    $('#order2').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 3 КОПМПЛЕКТОВ'
    })
})
$(window).load(function(){
    $('#order3').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 5 КОПМПЛЕКТОВ'
    })
})



Автор: ksnk 29.4.2014, 20:59
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...

Автор: Cheizer 30.4.2014, 09:01
Цитата(ksnk @ 29.4.2014,  20:59)
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...

Спасибо, подменил это:

Код

getValFromLabel:function(label){
                        var val=$('input,textarea',label).val()
                            ,defVal=label.data('defVal')                                
                        return label.length?val==defVal?'nope':val:'nope'
                    }


на ваш код с добавлением проверки на чекед радио

Код

getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}


И перестали отправляться формы, ошибка похоже где то :( и как это использовать в ,submitFu:function()???



Автор: ksnk 30.4.2014, 09:21
Цитата(Cheizer @  30.4.2014,  09:01 Найти цитируемый пост)
И перестали отправляться формы, ошибка похоже где то :( и как это использовать в ,submitFu:function()???

Вероятно, отлаживать? 
В хроме есть прекрасная панель отладки для Javascript.

Автор: Cheizer 30.4.2014, 09:32
Цитата(ksnk @ 29.4.2014,  20:59)
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...

проанализировал на баг, пишет Uncaught TypeError: Cannot read property 'type' of undefined

Добавлено через 37 секунд
Цитата(ksnk @ 30.4.2014,  09:21)
Цитата(Cheizer @  30.4.2014,  09:01 Найти цитируемый пост)
И перестали отправляться формы, ошибка похоже где то :( и как это использовать в ,submitFu:function()???

Вероятно, отлаживать? 
В хроме есть прекрасная панель отладки для Javascript.

Да да, сразу не написал, решил поковырять, пишет Uncaught TypeError: Cannot read property 'type' of undefined 

Автор: ksnk 30.4.2014, 09:36
Ну, тогда так.
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input.length>0 && input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...

Нужно посмотреть, в каких местах используется эта функция. В каком-то лабеле нет input или textarea.

Автор: Cheizer 30.4.2014, 09:45
Цитата(ksnk @ 30.4.2014,  09:36)
Ну, тогда так.
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input.length>0 && input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...

Нужно посмотреть, в каких местах используется эта функция. В каком-то лабеле нет input или textarea.

Да нет, везде есть

Код

<form id="order3" class="form" onSubmit="">
<input class="gate" type="hidden" name="gate" value="<?=$_GET['utm_medium']?>"> 
<input class="key" type="hidden" name="key" value="<?=$_GET['utm_term']?>">
<div class="success_wrapper">
<div class="success" style="display:none;"><strong>Заявка отправлена</strong><br/>Мы с Вами свяжемся в ближайшее время!</div>
</div>
<fieldset style="border:none;">
<label class="name">
<input type="text" value="Введите ваше имя:">
<br class="clear">
<span class="error error-empty">*</span><span class="empty error-empty">*</span> </label>
<label class="phone">
<input type="tel" value="Ваш номер телефона:" />
<br class="clear">
<span class="error error-empty">*</span><span class="empty error-empty">*</span> </label>
<div class="clear"></div>

<label class="count">
<span style="font-size:15px; color:#224855;">Введите количество комплектов</span><br />
<input style="width:74px;" type="text" value="шт:">
<br class="clear">
<span class="error error-empty">*</span><span class="empty error-empty">*</span> 
</label>

<div align="left" class="radio">
<hr style="width:270px; margin:10px auto 10px auto;">
<input type="radio" class="sam" name="group2" value="Самовывоз"><span style="font-size:18px; color:#224855;">Самовывоз</span><br>
<input type="radio" class="deliw" name="group2" value="Курьером"><span style="font-size:18px; color:#224855;">Курьером</span><br>
<input type="radio" class="posta" name="group2" value="Почтой" checked><span style="font-size:18px; color:#224855;">Почтой</span>
</div>

<label class="message">
<textarea>Адрес доставки: (не менее 15 символов)</textarea>
<br class="clear">
<span class="error error-empty" style="display: none;">*</span><span class="empty error-empty" style="display: block;">*</span> 
</label>



<a href="" data-type="submit" >Отправить заявку</a>
<div class="clear"></div>
</fieldset></form>

Автор: Aliance 30.4.2014, 10:09
Можно сделать в getValFromLabel блок try/catch где в случае ошибки дампать содержание переменной input

Автор: Cheizer 30.4.2014, 11:09
Цитата(ksnk @ 30.4.2014,  09:36)
Ну, тогда так.
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if(input.length>0 && input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...

Нужно посмотреть, в каких местах используется эта функция. В каком-то лабеле нет input или textarea.

Да, вот так форма отправляется, ошибок нет, но как использовать для kol:$('input.kol',_.form).val()||'nope', в функции:

Код

,submitFu:function(){
                        _.validateFu(_.labels)                            
                        if(!_.form.has('.'+_.invalidCl).length)
                            $.ajax({
                                type: "POST",
                                url:_.mailHandlerURL,
                                data:{
                                    name:_.getValFromLabel($('.name',_.form)),
                                    email:_.getValFromLabel($('.email',_.form)),
                                    phone:_.getValFromLabel($('.phone',_.form)),
                                    gate:$('input.gate',_.form).val()||'nope',
                                    key:$('input.key',_.form).val()||'nope',
                                    count:_.getValFromLabel($('.count',_.form)),
                                    
                                    kol:$('input.kol',_.form).val()||'nope',

                                    twok:$('input.twok',_.form).val()||'nope',
                                    
                                    sam:$('input.sam',_.form).val()||'nope',
                                    deliw:$('input.deliw',_.form).val()||'nope',
                                    posta:$('input.posta',_.form).val()||'nope',
                                    
                                    fax:_.getValFromLabel($('.fax',_.form)),
                                    message:$('textarea.message',_.form).val()||'nope',
                                    
                                    pro_duct:_.product,
                                    owner_email:_.ownerEmail,
                                    stripHTML:_.stripHTML
                                },
                                success: function(){
                                    _.showFu()
                                }
                            })            
                    },


а то все равно приходит первое поле из двух, не зависимо от выбора:

Код

Код

<input type="radio" class="kol" name="kol" value="1"><span style="font-size:18px; color:#224855;">1 комплект</span><br>
<input type="radio" class="kol" name="kol" value="2"><span style="font-size:18px; color:#224855;">2 комплекта</span>


Автор: Cheizer 30.4.2014, 12:55
Цитата(Aliance @ 30.4.2014,  10:09)
Можно сделать в getValFromLabel блок try/catch где в случае ошибки дампать содержание переменной input

Но как сделать проверку на выбранный RADIO??? Приходит просто значение первого RADIO не зависимо от выбора, даже если второй выбираешь.

Автор: Aliance 30.4.2014, 13:18
Может стоит попробовать http://api.jquery.com/category/selectors/form-selectors/ (в частности http://api.jquery.com/checked-selector/)?

Вообще, по-моему, логически не верно помещать 2 элемента формы (будь то radio или же любой другой) внутрь одного элемента label. Там должна быть связь один-к-одному.

Автор: Cheizer 30.4.2014, 14:10
Цитата(Aliance @ 30.4.2014,  13:18)
Может стоит попробовать http://api.jquery.com/category/selectors/form-selectors/ (в частности http://api.jquery.com/checked-selector/)?

Вообще, по-моему, логически не верно помещать 2 элемента формы (будь то radio или же любой другой) внутрь одного элемента label. Там должна быть связь один-к-одному.

Да действительно, в разные лейблы хорошая идея, но этот JS код он не понимает тип RADIO :( не отправляется форма из за этого

Автор: ksnk 30.4.2014, 14:13
Цитата(Aliance @  30.4.2014,  13:18 Найти цитируемый пост)
, логически не верно помещать 2 элемента формы

А вот в чем дело!

Тогда так
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if((input.length>0 && input[0].type=='radio'){
       input = $(':checked',input);
    }
    if(input.length>0 && input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...


Добавлено @ 14:15
Иногда проще на  jsfiddle.net сделать тестовый пример. Его и отлаживать можно коллегиально, а не методом "удаленного тыка" 

Автор: Cheizer 30.4.2014, 14:33
Цитата(ksnk @ 30.4.2014,  14:13)
Цитата(Aliance @  30.4.2014,  13:18 Найти цитируемый пост)
, логически не верно помещать 2 элемента формы

А вот в чем дело!

Тогда так
Код

...
getValFromLabel:function(label){
    var input=$('input,textarea',label);
    if((input.length>0 && input[0].type=='radio'){
       input = $(':checked',input);
    }
    if(input.length>0 && input[0].type=='radio' && !input[0].checked) return 'nope';
    var val=input.val()
        ,defVal=label.data('defVal')                                
    return label.length?val==defVal?'nope':val:'nope'
}
...


Добавлено @ 14:15
Иногда проще на  jsfiddle.net сделать тестовый пример. Его и отлаживать можно коллегиально, а не методом "удаленного тыка"

убрал ошибку  в строке  if((input.length>0 && input[0].type=='radio'){

но форма теперь не отправляется, уже все перепробовал, суть в том что этот скрипт, принимает все инпуты которые есть в форме, и передает php все значения, и не понятно как ЧЕКЕД у радио кнопок передавать в него :( ему наплевать на чекед, есть инпут в html, у него есть переменная, все, он ее наполяет после отправки фолрмы и отдает php. а php щлет все значения всех радио на странице на почту, бред конечно :(

Автор: Aliance 30.4.2014, 14:55
Скобочку дублирующую удалить нужно. Что ж на каждых пых-то постить, это же и самому можно найти и исправить smile

Автор: Cheizer 30.4.2014, 14:59
Цитата(Aliance @ 30.4.2014,  14:55)
Скобочку дублирующую удалить нужно. Что ж на каждых пых-то постить, это же и самому можно найти и исправить smile

опередили сообщением, убрал smile но не помогло, перестала просто отправляться без ошибок уже smile

Автор: Aliance 30.4.2014, 15:26
Давайте посмотрим внутрь функции getValFromLabel:
первой строчкой по получаем ссылку на коллекцию input внутри конкретного label. В случае с radio, это коллекция будет содержать в себе 2 элемента input=radio (что по логике не правильно)
ksnk, написал хак, при котором в случае, если в коллекции есть хотя бы один элемент и тип первого из этих элементов = radio, то итоговый элемент заменяется на выбранный (:checked) среди изначальной коллекции.
далее, идет второй хак, который в случае с input=radio отправляет nope, если элемент не отмечен.
по логике все верно и должно работать, хотя я не костылил бы, а изменил верстку по правилу 1 label - 1 input, и тогда первого хака не потребуется.
если не работает - нужно дебажить, продампать например переменные в разных участках кода. за вас это без примера на jsfiddle делать никто не будет, так что либо самому, либо все же набросать скелетон на jsfiddle =)

Добавлено через 13 минут и 3 секунды
Вот, я создал скелетон: http://jsfiddle.net/Aliance/TYBN6/
В дальнейшем, просьба все изменения делать в рамках этой ссылки, чтобы все могли понимать о чем вы говорите.

Я изменил input = $(':checked',input); на input = $('input:checked', label); и все заработало.

Автор: Cheizer 30.4.2014, 15:55
Цитата(Aliance @ 30.4.2014,  15:26)
Давайте посмотрим внутрь функции getValFromLabel:
первой строчкой по получаем ссылку на коллекцию input внутри конкретного label. В случае с radio, это коллекция будет содержать в себе 2 элемента input=radio (что по логике не правильно)
ksnk, написал хак, при котором в случае, если в коллекции есть хотя бы один элемент и тип первого из этих элементов = radio, то итоговый элемент заменяется на выбранный (:checked) среди изначальной коллекции.
далее, идет второй хак, который в случае с input=radio отправляет nope, если элемент не отмечен.
по логике все верно и должно работать, хотя я не костылил бы, а изменил верстку по правилу 1 label - 1 input, и тогда первого хака не потребуется.
если не работает - нужно дебажить, продампать например переменные в разных участках кода. за вас это без примера на jsfiddle делать никто не будет, так что либо самому, либо все же набросать скелетон на jsfiddle =)

Добавлено @ 15:39
Вот, я создал скелетон: http://jsfiddle.net/Aliance/TYBN6/
В дальнейшем, просьба все изменения делать в рамках этой ссылки, чтобы все могли понимать о чем вы говорите.

Я изменил input = $(':checked',input); на input = $('input:checked', label); и все заработало.

Да, ваш пример работает на jsfiddle.net: но на сайте моем немного изменил начало, так как ругался ошибка, сделал так:

Код

getValFromLabel:function(label){
    var input=$('input,textarea',label);

    if (input.length>0 && input[0].type=='radio')
       input = $('input:checked', label);
    if (input.length>0 && input[0].type=='radio' && !input[0].checked)
        return 'nope';

    var val = input.val(), defVal = label.data('defVal');
    return label.length 
        ? (val==defVal ? 'nope' : val)
        : 'nope';
}



в функции отправки написал так:  
Код
kol:$('input.kol',_.form).val()||'nope',


Код

,submitFu:function(){
                        _.validateFu(_.labels)                            
                        if(!_.form.has('.'+_.invalidCl).length)
                            $.ajax({
                                type: "POST",
                                url:_.mailHandlerURL,
                                data:{
                                    name:_.getValFromLabel($('.name',_.form)),
                                    email:_.getValFromLabel($('.email',_.form)),
                                    phone:_.getValFromLabel($('.phone',_.form)),
                                    gate:$('input.gate',_.form).val()||'nope',
                                    key:$('input.key',_.form).val()||'nope',
                                    count:_.getValFromLabel($('.count',_.form)),
                                    
                                    kol:$('input.kol',_.form).val()||'nope',
                                    
                                    twok:$('input.twok',_.form).val()||'nope',
                                    sam:$('input.sam',_.form).val()||'nope',
                                    deliw:$('input.deliw',_.form).val()||'nope',
                                    posta:$('input.posta',_.form).val()||'nope',
                                    
                                    fax:_.getValFromLabel($('.fax',_.form)),
                                    //message:_.getValFromLabel($('.message',_.form)),
                                    message:$('textarea.message',_.form).val()||'nope',
                                    
                                    pro_duct:_.product,
                                    owner_email:_.ownerEmail,
                                    stripHTML:_.stripHTML
                                },
                                success: function(){
                                    _.showFu()
                                }
                            })            
                    },



результат, форма не отправляется просто, ошибок нет, мне кажется еще есть подстава с валидацией, так как по умолчанию все инпуты в лейблах попадают в валидацию, по этому не отправляется, но это догадка только :(

Автор: Aliance 30.4.2014, 16:01
Никто же не знает, что у вас на сайте. Если работает на фиддле, а не работает на сайте - какой вывод делаем? smile

В консоле что выдает эта надпись: $('input.kol',_.form).val() ? А что должна?

Ajax запрос отправляется? Если нет - видимо, проблема в валидации и это не в рамках этого топика уже. Если отправляется - то в чем проблема, данные не те посылаются или что?

Автор: Cheizer 30.4.2014, 16:14
Цитата(Aliance @ 30.4.2014,  16:01)
Никто же не знает, что у вас на сайте. Если работает на фиддле, а не работает на сайте - какой вывод делаем? smile

В консоле что выдает эта надпись: $('input.kol',_.form).val() ? А что должна?

Ajax запрос отправляется? Если нет - видимо, проблема в валидации и это не в рамках этого топика уже. Если отправляется - то в чем проблема, данные не те посылаются или что?

В том то и дело что ничего не выдает :(


вот полный код из файла, в html все просто. Обычная форма.

Код

//forms
;(function($){
    $.fn.forms=function(o){
        return this.each(function(){
            var th=$(this)
                ,_=th.data('forms')||{
                    errorCl:'error',
                    emptyCl:'empty',
                    invalidCl:'invalid',
                    notRequiredCl:'notRequired',
                    successCl:'success',
                    successShow:'4000',
                    mailHandlerURL:'bat/MailHandler.php',
                    ownerEmail:'[email protected]',
                    product:'Заказ',
                    stripHTML:true,
                    smtpMailServer:'localhost',
                    targets:'input,textarea',
                    controls:'a[data-type=reset],a[data-type=submit]',
                    validate:true,
                    rx:{
                        ".state":{rx:/.{2}/,target:'input'},
                        ".state":{rx:/^[a-zA-Z'][a-zA-Z-' ]+[a-zA-Z']?$/,target:'input'},
                        ".email":{rx:/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i,target:'input'},
                        ".phone":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
                        ".fax":{rx:/^\+?(\d[\d\-\+\(\) ]{5,}\d$)/,target:'input'},
                        ".message":{rx:/.{15}/,target:'textarea'}
                    },
                    preFu:function(){
                        _.labels.each(function(){
                            var label=$(this),
                                inp=$(_.targets,this),
                                defVal=inp.val(),
                                trueVal=(function(){
                                            var tmp=inp.is('input')?(tmp=label.html().match(/value=['"](.+?)['"].+/),!!tmp&&!!tmp[1]&&tmp[1]):inp.html()
                                            return defVal==''?defVal:tmp
                                        })()
                            trueVal!=defVal
                                &&inp.val(defVal=trueVal||defVal)
                            label.data({defVal:defVal})                                
                            inp
                                .bind('focus',function(){
                                    inp.val()==defVal
                                        &&(inp.val(''),_.hideEmptyFu(label),label.removeClass(_.invalidCl))
                                })
                                .bind('blur',function(){
                                    _.validateFu(label)
                                    if(_.isEmpty(label))
                                        inp.val(defVal)
                                        ,_.hideErrorFu(label.removeClass(_.invalidCl))                                            
                                })
                                .bind('keyup',function(){
                                    label.hasClass(_.invalidCl)
                                        &&_.validateFu(label)
                                })
                            label.find('.'+_.errorCl+',.'+_.emptyCl).css({display:'block'}).hide()
                        })
                        _.success=$('.'+_.successCl,_.form).hide()
                    },
                    isRequired:function(el){                            
                        return !el.hasClass(_.notRequiredCl)
                    },
                    isValid:function(el){                            
                        var ret=true
                        $.each(_.rx,function(k,d){
                            if(el.is(k))
                                ret=d.rx.test(el.find(d.target).val())                                        
                        })
                        return ret                            
                    },
                    isEmpty:function(el){
                        var tmp
                        return (tmp=el.find(_.targets).val())==''||tmp==el.data('defVal')
                    },
                    validateFu:function(el){                            
                        el.each(function(){
                            var th=$(this)
                                ,req=_.isRequired(th)
                                ,empty=_.isEmpty(th)
                                ,valid=_.isValid(th)                                
                            
                            if(empty&&req)
                                _.showEmptyFu(th.addClass(_.invalidCl))
                            else
                                _.hideEmptyFu(th.removeClass(_.invalidCl))
                            
                            if(!empty)
                                if(valid)
                                    _.hideErrorFu(th.removeClass(_.invalidCl))
                                else
                                    _.showErrorFu(th.addClass(_.invalidCl))                                
                        })
                    },
                    
                    
                    /*getValFromLabel:function(label){
                        var val=$('input,textarea',label).val()
                            ,defVal=label.data('defVal')                                
                        return label.length?val==defVal?'nope':val:'nope'
                    }*/


//////////////////////////////
getValFromLabel:function(label){
    var input=$('input,textarea',label);

    if (input.length>0 && input[0].type=='radio')
       input = $('input:checked', label);
    if (input.length>0 && input[0].type=='radio' && !input[0].checked)
        return 'nope';

    var val = input.val(), defVal = label.data('defVal');
    return label.length 
        ? (val==defVal ? 'nope' : val)
        : 'nope';
}
///////////////////////////////////
        
                    ,submitFu:function(){
                        _.validateFu(_.labels)                            
                        if(!_.form.has('.'+_.invalidCl).length)
                            $.ajax({
                                type: "POST",
                                url:_.mailHandlerURL,
                                data:{
                                    name:_.getValFromLabel($('.name',_.form)),
                                    email:_.getValFromLabel($('.email',_.form)),
                                    phone:_.getValFromLabel($('.phone',_.form)),
                                    gate:$('input.gate',_.form).val()||'nope',
                                    key:$('input.key',_.form).val()||'nope',
                                    count:_.getValFromLabel($('.count',_.form)),
                                    
                                    kol:$('input.kol',_.form).val()||'nope',
                                    
                                    twok:$('input.twok',_.form).val()||'nope',
                                    sam:$('input.sam',_.form).val()||'nope',
                                    deliw:$('input.deliw',_.form).val()||'nope',
                                    posta:$('input.posta',_.form).val()||'nope',
                                    
                                    fax:_.getValFromLabel($('.fax',_.form)),
                                    //message:_.getValFromLabel($('.message',_.form)),
                                    message:$('textarea.message',_.form).val()||'nope',
                                    
                                    pro_duct:_.product,
                                    owner_email:_.ownerEmail,
                                    stripHTML:_.stripHTML
                                },
                                success: function(){
                                    _.showFu()
                                }
                            })            
                    },
                    showFu:function(){
                        _.success.slideDown(function(){
                            setTimeout(function(){
                                _.success.slideUp()
                                _.form.trigger('reset')
                            },_.successShow)
                        })
                    },
                    controlsFu:function(){
                        $(_.controls,_.form).each(function(){
                            var th=$(this)
                            th
                                .bind('click',function(){
                                    _.form.trigger(th.data('type'))
                                    return false
                                })
                        })
                    },
                    showErrorFu:function(label){
                        label.find('.'+_.errorCl).slideDown()
                    },
                    hideErrorFu:function(label){
                        label.find('.'+_.errorCl).slideUp()
                    },
                    showEmptyFu:function(label){
                        label.find('.'+_.emptyCl).slideDown()
                        _.hideErrorFu(label)
                    },
                    hideEmptyFu:function(label){
                        label.find('.'+_.emptyCl).slideUp()
                    },
                    init:function(){
                        _.form=_.me                        
                        _.labels=$('label',_.form)

                        _.preFu()
                        
                        _.controlsFu()
                                                        
                        _.form
                            .bind('submit',function(){
                                if(_.validate)
                                    _.submitFu()
                                else
                                    _.form[0].submit()
                                return false
                            })
                            .bind('reset',function(){
                                _.labels.removeClass(_.invalidCl)                                    
                                _.labels.each(function(){
                                    var th=$(this)
                                    _.hideErrorFu(th)
                                    _.hideEmptyFu(th)
                                })
                            })
                        _.form.trigger('reset')
                    }
                }
            _.me||_.init(_.me=th.data({forms:_}))
            typeof o=='object'
                &&$.extend(_,o)
        })
    }
})(jQuery)
$(window).load(function(){
    $('#form').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ОБРАТНОГО ЗВОНКА (верх)'
    })
})
$(window).load(function(){
    $('#form1').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ОБРАТНОГО ЗВОНКА (низ)'
    })
})
$(window).load(function(){
    $('#form2').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА 5 КОМПЛЕКТОВ (верх)'
    })
})
$(window).load(function(){
    $('#form3').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА ПОКУПКУ ОПТОМ'
    })
})
$(window).load(function(){
    $('#form4').forms({
        ownerEmail:'[email protected]',
        product:'ЗАЯВКА НА 5 КОМПЛЕКТОВ (низ)'
    })
})
$(window).load(function(){
    $('#order0').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 1 КОПМПЛЕКТА'
    })
})
$(window).load(function(){
    $('#order2').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 3 КОПМПЛЕКТОВ'
    })
})
$(window).load(function(){
    $('#order3').forms({
        ownerEmail:'[email protected]',
        product:'ЗАКАЗ ПРОДУКЦИИ от 5 КОПМПЛЕКТОВ'
    })
})



Автор: Aliance 30.4.2014, 16:40
Ну так не выдает-то наверное потому, что селектор составлен не правильно? У вас написано input.kol, а нужно label.kol input:radio:checked

Автор: Cheizer 30.4.2014, 16:47
Цитата(Aliance @ 30.4.2014,  16:40)
Ну так не выдает-то наверное потому, что селектор составлен не правильно? У вас написано input.kol, а нужно label.kol input:radio:checked

написал так:

Код

kol:$('label.kol input:radio:checked',_.form).val()||'nope',


ничего не изменилось, тишина, ни ошибки ни отправки, только в консоли такое предупреждение висит: event.returnValue is deprecated. Please use the standard event.preventDefault() instead. 


Автор: Aliance 30.4.2014, 17:28
Ставьте дампы (например, console.log) по коду, смотрите куда он не заходит (а должен бы), выясняйте причину, исправляйте.
Делайте дампы переменных, чтобы знать, что в них находится.

Автор: Cheizer 5.5.2014, 08:47
Цитата(Aliance @ 30.4.2014,  17:28)
Ставьте дампы (например, console.log) по коду, смотрите куда он не заходит (а должен бы), выясняйте причину, исправляйте.
Делайте дампы переменных, чтобы знать, что в них находится.

Всем спасибо, видно реально этот код не заточен изначально для таких элементов, а переписывать пол кода не зная JS методом тыка, не дело это. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)