Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Не работает валидация для 1 из 3 полей формы (https://javascript.ru/forum/jquery/78877-ne-rabotaet-validaciya-dlya-1-iz-3-polejj-formy.html)

laimas 17.11.2019 17:38

Цитата:

Сообщение от stavatar@yandex.ru
Форма отправляется спокойно.

Капец какой-то - вот что вы отправляете и асинхронным запросом:

url:'controller',//url адрес файла обработчика
data:{InputX: x, InputY: y, InputR: R, Flag: false}

здесь полей формы даже и близко нет. А форма имеет тот же адрес запроса, и также отправляется методом POST. И это вы называете нормальной работой? Либо выбрасываете ajax запрос и отправляете форму, либо блокируйте отправление формы и отправляйте асинхронный запрос.

Цитата:

Сообщение от stavatar@yandex.ru
Проблема лишь в валидации

А она вам нужна?

input type="checkbox" onclick="changeX(-5)" и так у всех флажков, то есть выбран ли флажок или не выбран скрытое поле получит значение именно этого флажка. Это что за бардак?

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

laimas 17.11.2019 18:03

Ну что поясните, что это значит?

Сервер получает постоянно асинхронные запросы каких то расчетов, и также под именами полей формы, и возвращает что-то. А "контрольный выстрел", это отправка самой формы методом "аля-ajax" для чего-то иного. Сервер же распознает, что пришло, по наличию заголовка асинхронного запроса. Так?

stavatar@yandex.ru 17.11.2019 20:13

Цитата:

Сообщение от laimas (Сообщение 515670)
Капец какой-то - вот что вы отправляете и асинхронным запросом:

url:'controller',//url адрес файла обработчика
data:{InputX: x, InputY: y, InputR: R, Flag: false}

здесь полей формы даже и близко нет. А форма имеет тот же адрес запроса, и также отправляется методом POST. И это вы называете нормальной работой? Либо выбрасываете ajax запрос и отправляете форму, либо блокируйте отправление формы и отправляйте асинхронный запрос.



А она вам нужна?

input type="checkbox" onclick="changeX(-5)" и так у всех флажков, то есть выбран ли флажок или не выбран скрытое поле получит значение именно этого флажка. Это что за бардак?

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

Проверять - было ли заполнено поле X.
Насчет флажков.Да.. я уже понял.Исправлю

stavatar@yandex.ru 17.11.2019 20:16

Цитата:

Сообщение от laimas (Сообщение 515672)
Ну что поясните, что это значит?

Сервер получает постоянно асинхронные запросы каких то расчетов, и также под именами полей формы, и возвращает что-то. А "контрольный выстрел", это отправка самой формы методом "аля-ajax" для чего-то иного. Сервер же распознает, что пришло, по наличию заголовка асинхронного запроса. Так?

Ну.Есть форма и есть график.Можно либо задать данные через форму ,либо нажать на график ,определив некоторую точку.В обоих случаях посылается запрос на сервер и выдает таблицу с результатами.
ajax запрос - нужен для 2ого.Нажатие на график изменяет переменные x,y,r и передает их через ajax запрос на сервер

laimas 18.11.2019 00:19

Таблица с результатами, это html, зачем в нем data.replace('true', '') и data.replace('false','') не понятно. Это определяет способ выбора, и в обеих случаях можно было задействовать ajax (без iframe). Ну бог с ним, но ведь остальное то к чему. Валидацию можно выбросить с чистой совестью. Элементы выбора либо все списки, либо радио кнопки, либо number, либо range. Единственно, это выбор Y, если он с сотыми и то радио кнопки не пойдут, а number будет утомителен, хотя в нем можно и в ручную набирать. Все поля уже имеют значения по умолчанию.

Здесь только основное:

<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div class="container" >
    <form id="myform" autocomplete="off">
        <div>
            <label>X</label>
            <input type="range" name="InputX" min="-5" max="3" value="0" /> <output>0</output>
        </div>
        <div>
            <label>Y</label>
            <input type="text" class="Y" maxlength="5" name="InputY" placeholder=" От -5 до  3" />
        </div>
        <div>
            <label>R</label>
            <input type="range" name="InputR" min="1" max="5" value="1" /> <output>1</output>
        </div>
        <div>
            <input type="radio" name="r" value="1" /> <input type="radio" name="r" value="2" checked="" /> <input type="radio" name="r" value="3" />
        </div>
        <input type="hidden" name="Flag" value="true" />
     </form>
    <div class="ItemFlex">
        <canvas id="plot" width="300" height="300">
        </canvas>
    </div>
</div>

<script>
    var frm = document.getElementById("myform"),
        plot_canvas = document.getElementById("plot"),
        plot_context = plot_canvas.getContext("2d");
    
    frm.addEventListener('change', function(e) {
        if(e.target.type=="range") e.target.nextElementSibling.value = e.target.value;
        console.log(this.r.value) //значение RadioNodeList
    });
    
    frm.InputY.addEventListener('input', function(e) {
        this.value = this.value.replace(/[^\d\.-]/,'');
    });

    plot_canvas.addEventListener("click", drawPoint, false);
    
    plot_context.beginPath();
    plot_context.arc(150, 150, 100, 0, Math.PI/2);
    plot_context.lineTo(150, 150);
    plot_context.closePath();
    plot_context.rect(50, 100, 100, 50);
    plot_context.fillStyle = 'red';
    plot_context.fill();
    plot_context.beginPath();
    plot_context.moveTo(100, 150);
    plot_context.lineTo(150, 250);
    plot_context.lineTo(150, 150);

    plot_context.fillStyle = 'red';
    plot_context.stroke();
    plot_context.closePath();
    plot_context.fillStyle = 'red';
    plot_context.fill();
    plot_context.beginPath();
    //Ox
    plot_context.moveTo(30, 150);
    plot_context.lineTo(270, 150);
    plot_context.lineTo(260, 140);
    plot_context.moveTo(270, 150);
    plot_context.lineTo(260, 160);
    //Oy
    plot_context.moveTo(150, 30);
    plot_context.lineTo(140, 40);
    plot_context.moveTo(150, 30);
    plot_context.lineTo(160, 40);
    plot_context.moveTo(150, 30);
    plot_context.lineTo(150, 270);

    plot_context.moveTo(30, 150);
    plot_context.closePath();
    plot_context.stroke();

    function drawPoint(e) {
        
        var R = frm.InputR.valueAsNumber, pos = getCursorPosition(e);
            plot_context.beginPath();
            plot_context.rect(pos.x, pos.y, 5, 5);
            pos.x -= 149;
            pos.y -= 148;
            pos.y *= -1;
            pos.x = x/100*R;
            pos.y = y/100*R;
            console.clear()
            console.dir({InputX: pos.x, InputY: pos.y, InputR: R, Flag: false})
  
    }

    function getCursorPosition(e) {
        if (e.pageX != undefined && e.pageY != undefined) {
            x = e.pageX;
            y = e.pageY;
        }
        else {
            x = e.clientX + document.body.scrollLeft +
                document.documentElement.scrollLeft;
            y = e.clientY + document.body.scrollTop +
                document.documentElement.scrollTop;
        }
        x -= plot_canvas.offsetLeft ;
        y -= plot_canvas.offsetTop ;
        return {x: x, y: y}
    }
</script>
</body>
</html>


Радио кнопки в форме для примера, для демонстрации, что получить значение этой группы также легко как и списка. Это со слайдером и текстовым полем, хотя, на мой взгляд, здесь удобнее тип number, в которых ручной ввод разрешить только для Y.

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


Часовой пояс GMT +3, время: 16:57.