Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Работа с раскрывающимся списком (https://javascript.ru/forum/dom-window/69262-rabota-s-raskryvayushhimsya-spiskom.html)

ZMA 09.06.2017 18:19

Работа с раскрывающимся списком
 
Добрый день.

Создан раскрывающийся список средствами JS:

var CheckColor = function myPrice() {
    var x = document.createElement("SELECT");
    x.setAttribute("id", "mySelect");
    document.body.appendChild(x);
 
    var z = document.createElement("option");
    z.setAttribute("color", "green");
    var t = document.createTextNode("Зеленый");
    z.appendChild(t);
    document.getElementById("mySelect").appendChild(z);
    
     var z = document.createElement("option");
    z.setAttribute("color", "red");
    var t = document.createTextNode("Красный");
    z.appendChild(t);
    document.getElementById("mySelect").appendChild(z);
    
    var z = document.createElement("option");
    z.setAttribute("color", "blue");
    var t = document.createTextNode("Синий");
    z.appendChild(t);
    document.getElementById("mySelect").appendChild(z);
    
}

Далее будет функция, которая считает стоимость в зависимости от введенной площади, исходя из цены 1кв.м. Но стоимость 1 кв.м. разная, зависит от выбранного цвета.

Как можно обратиться к атрибуту с цветом из другой функции - направьте, пожалуйста.

рони 09.06.2017 18:37

ZMA,
а создать нормальный option никак?

ZMA 14.06.2017 12:23

рони, опции созданы теперь отдельно.

Но в коде что-то не так.
Предполагается, что пользователь вводит 2 значения: высота и ширина. Считается автоматом, без клавиши submit.

Также хотелось бы добавить доп. функцию: при вводе пользователем размера площадью <= 0,4 кв.м. к coefficient автоматом прибавляется 10%. Как понимаю, через через дополнительный if, куда вставить, подскажите.

Кто может, проверьте, помогите, пожалуйста.

var options = [
      {
       value: 'red',
       coefficient: 1,
       text: 'красный'
       },
       {
       value: 'green',
       coefficient: 1.2,
       text: 'зеленый'
       },
       {
       value: 'blue',
       coefficient: 2.5,
       text: 'синий'
       },
       ];
    var output = $('#output');
 
 
    function createOption(obj) {
    var option = document.createElement('option');
    var text = document.createTextNode(obj.text);
    option.appendChild(text);
    option.value = obj.value;
    option.dataset.coefficient = obj.coefficient;
    return option;
    }
 
    function createSelect(obj) {
    var select = document.createElement('select');
    select.id = 'mySelect';
    obj.forEach(function(option) {
    select.appendChild(createOption(option));
    });
    document.body.appendChild(select);
    }
 
    function calculate(height, width, coefficient) {
    return height * width * coefficient;
    }
 
    createSelect(options);
    $('#height, #width, #coefficient').on('keyup', function(){
    var height = $('#height').val() * 1;
    var width = $('#width').val() * 1;
    var select = document.getElementById('mySelect');
    var coefficient = select.options[select.selectedIndex].dataset.coefficient;
        if(!isNaN(height) && !isNaN(width)){
            output.html('Цена: ' + calculate(height * width* coefficient).toFixed(2) + ' руб.');
        } else {
            output.html('Не верный формат!');
        }
        });


<form action="" id="form">
    <input type="text" id="height">
    <input type="text" id="width">
    <ul id="output"></ul>
</form>

рони 14.06.2017 13:13

калькулятор площади
 
ZMA,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>

  <script>
  window.addEventListener('DOMContentLoaded', function() {
  var options = [
      {
       value: 1,
       text: 'красный'
       },
       {
       value: 1.2,
       text: 'зеленый'
       },
       {
       value: 2.5,
       text: 'синий'
       }
       ];

 function createOption(obj) {
    return new Option(obj.text, obj.value)
}

function createSelect(obj) {
    var select = document.createElement("select");
    select.id = "mySelect";
    obj.forEach(function(option) {
        select.appendChild(createOption(option))
    });
    return form.insertBefore(select, output)
}

function calculate() {
    var h = +height.value || 0,
        w = +width.value || 0,
        c = +select.value;
    h < 0 && (h = 0);
    w < 0 && (w = 0);
    h = h * w;
    h <= .4 && (c *= 1.1);
    h *= c;
    output.innerHTML = h.toFixed(2)
}
var form = document.querySelector("#form"),
    output = document.querySelector("#output"),
    width = document.querySelector("#width"),
    height = document.querySelector("#height"),
    select = createSelect(options);

form.addEventListener("input", calculate);
form.addEventListener("change", calculate);

      });
  </script>
</head>

<body>
<form action="" id="form" >
    <input type="text" id="height">
    <input type="text" id="width">
    <p id="output"></p>
</form>


</body>
</html>

ZMA 14.06.2017 13:37

рони, спасибо огромнейшее.

ZMA 15.06.2017 12:05

рони, можно еще вопрос.
Пытаюсь добавить, чтобы при вводе числа меньше min/max, автоматом происходила замена на min/max число. Причем на w и h min и max разные.
добавляю replace var h= +height.value.replace(/\D/g,'')||0; , if'ы <>, onblur/onchange в input, но безрезультатно.

Dilettante_Pro 15.06.2017 12:58

ZMA,
Вот же у вас проверка на min
h < 0 && (h = 0);
w < 0 && (w = 0);

Поставьте вместо нулей нужные значения min
Аналогично и по max.
Ну и исправить в инпутах
height.value = h.toString();
width.value  = w.toString();

ZMA 15.06.2017 13:04

Dilettante_Pro, к сожалению, это ограничивает только расчет.
Т.е., если вы установите max 200, а значение будет введено 305, то посчитается как 200, но значение пользователь так и будет видеть 305.
Хотелось бы, чтобы 305 менялось на 200 (установленный max) автоматически.

Dilettante_Pro 15.06.2017 13:14

h < 10 && (h = 10);
w < 20 && (w = 20);
h > 200 && (h = 200);
w > 250 && (w = 250);
height.value = h.toString();
width.value  = w.toString();

Только обработчик на input лучше убрать - не даст ввести изменения в случае ошибки

Dilettante_Pro 15.06.2017 13:18

<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>

  <script>
  window.addEventListener('DOMContentLoaded', function() {
  var options = [
      {
       value: 1,
       text: 'красный'
       },
       {
       value: 1.2,
       text: 'зеленый'
       },
       {
       value: 2.5,
       text: 'синий'
       }
       ];

 function createOption(obj) {
    return new Option(obj.text, obj.value)
}

function createSelect(obj) {
    var select = document.createElement("select");
    select.id = "mySelect";
    obj.forEach(function(option) {
        select.appendChild(createOption(option))
    });
    return form.insertBefore(select, output)
}

function calculate() {
    var h = +height.value || 0,
        w = +width.value || 0,
        c = +select.value;
    h < 10 && (h = 10);
    w < 20 && (w = 20);
    h > 200 && (h = 200);
    w > 250 && (w = 250);
    height.value = h.toString();
    width.value  = w.toString();
    h = h * w;
    h <= 400 && (c *= 1.1);
    h *= c;
    output.innerHTML = h.toFixed(2)
}
var form = document.querySelector("#form"),
    output = document.querySelector("#output"),
    width = document.querySelector("#width"),
    height = document.querySelector("#height"),
    select = createSelect(options);

// form.addEventListener("input", calculate);
form.addEventListener("change", calculate);

      });
  </script>
</head>

<body>
<form action="" id="form" >
    <input type="text" id="height">
    <input type="text" id="width">
    <p id="output"></p>
</form>


</body>
</html>

ZMA 15.06.2017 13:29

Dilettante_Pro, благодарю. Я сильно все усложнял :)

ZMA 15.06.2017 17:43

--

ZMA 16.06.2017 13:11

--

ФедорН 19.06.2017 00:09

привет.
У меня очень похожая ситуация. этот скрипт тоже подойдёт,но на элементы в том числе селект, нужно навешивать стили и т.п,а в js я ноль с плюсом.
если есть возможность поделитесь как переделать,чтобы select был не в скрипте, а в form вместе с input и output. Заранее выражаю благодарность

j0hnik 19.06.2017 00:25

<!DOCTYPE html>

<html>
<head>
	<title>Untitled</title>
	<meta charset="utf-8">
	<style type="text/css">
	</style>

	<script>
		window.addEventListener('DOMContentLoaded', function() {

function calculate() {
	var h = +height.value || 0,
	w = +width.value || 0,
	c = +select.value;
	h < 10 && (h = 10);
	w < 20 && (w = 20);
	h > 200 && (h = 200);
	w > 250 && (w = 250);
	height.value = h.toString();
	width.value  = w.toString();
	h = h * w;
	h <= 400 && (c *= 1.1);
	h *= c;
	output.innerHTML = h.toFixed(2)
}
var form = document.querySelector("#form"),
output = document.querySelector("#output"),
width = document.querySelector("#width"),
height = document.querySelector("#height"),
select = document.querySelector("#mySelect");

form.addEventListener("change", calculate);

});
</script>
</head>

<body>
	<form action="" id="form" >
		<input type="text" id="height">
		<input type="text" id="width">
		<select id="mySelect">
			<option value="1"/>красный</option>
			<option value="1.2"/>зеленый</option>
			<option value="2.5"/>синий</option>
		</select>
		<p id="output"></p>
	</form>


</body>
</html>

laimas 19.06.2017 03:09

Цитата:

Сообщение от j0hnik
output.innerHTML = h.toFixed(2)

<output id="output"></output>

output.value = ....


Цитата:

Сообщение от j0hnik
height.value = h.toString();
width.value = w.toString();

А это зачем?

ФедорН 19.06.2017 09:37

j0hnik, laimas, спасибо

Цитата:

Сообщение от laimas (Сообщение 455875)
А это зачем?

Судя по тому что обсуждалось выше,это для того чтобы я инпут устанавливалось автоматически минимальное и максимальное значение при вводе юзером значения меньше/больше установленного

laimas 19.06.2017 10:12

Цитата:

Сообщение от ФедорН
это для того чтобы я инпут устанавливалось автоматически минимальное и максимальное ...

Вставляйте что душе угодно, но height.value = h, toString() тут совсем не нужен.

ФедорН 19.06.2017 13:34

laimas, понял. Спасибо

Сориентируйте ещё пожалуйста. Скрипт и форма располагаются просто на странице, если сделать так чтобы пользователь вводит цвет , размеры , видит стоимость , нажимает добавить ещё , появляется такая же строка , он вводит другой цвет, размеры и т.д. несколько раз. Потом он нажимает заказать , открывается попап форма для ввода телефона и комментария. В поле комментарий автоматом текстом вставляются цвет и размеры введённые ранее. Добавить ещё (это будет рекурсия? )и вставку введённых данных в существующую форму (как понимаю, инпуты и селект переменных нужно присвоить?) это сложно реализовать? Как понимаю, дополнительная работа с базой данных тут не нужна ? Т. К. данные автоматом при заказе уйдут мне на почту.

laimas 19.06.2017 13:40

Цитата:

Сообщение от ФедорН
ак понимаю, дополнительная работа с базой данных тут не нужна ? Т. К. данные автоматом при заказе уйдут мне на почту.

А что вы хотите получать почтой - мусор всякий или же все таки то, что есть в базе? А если действительно имеющееся, то нужна ли будет проверка данного в базе? А если нужна, то каким образом можно будет определить есть ли в базе, то есть вам формой прислали не мусор, если формой прислали кучу текста?

ФедорН 19.06.2017 14:02

Цитата:

Сообщение от laimas (Сообщение 455898)
А что вы хотите получать почтой - мусор всякий или же все таки то, что есть в базе? А если действительно имеющееся, то нужна ли будет проверка данного в базе? А если нужна, то каким образом можно будет определить есть ли в базе, то есть вам формой прислали не мусор, если формой прислали кучу текста?

В базе нет наполнения товаров, проверка наличия не нужна, все под заказ. Грубо говоря вы ввели красный высота 160см ширина 40см , вывелась цена 2000 руб вы нажимаете "+" дальше вводите синий ширина 120 см высота 200см. и тд Цена 4000р. -> заказать .открылась попап форма где вы видите что вы ввели: красный 160х40 2000, синий 120х2000 4000..., это поле я сделаю не активным для ввода данных пользователем , в других полях вводите имя и телефон и отправляете. На почту мне приходит в том же виде : цвет, размеры, цена, имя и телефон

laimas 19.06.2017 14:08

Цитата:

Сообщение от ФедорН
Грубо говоря вы ввели красный высота 160см ширина 40см , вывелась цена 2000 руб вы нажимаете "+" дальше вводите синий ширина 120 см высота 200см.

Грубо говоря, если я пойму, что это туфта, то я такую и буду вам отправлять, зачем мне чего-то вообще выбирать. Даже безобидное отправлять "Привет!", и то замордовать можно так, что мало не покажется. Как вам такая перспектива?

Всего один вопрос - нахрена вам вообще тогда серверный язык? Ну создайте вы статичные страницы, в них укажите свое мыло, все свои товары опишите в них же, клиентским скриптом пусть там чего-то выбирают, а почту шлют прямо с клиента, либо через POP3, если доступен, либо через сервис.

Dilettante_Pro 19.06.2017 14:30

ФедорН,
Цитата:

Сообщение от ФедорН
В базе нет наполнения товаров, проверка наличия не нужна, все под заказ.

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

ФедорН 19.06.2017 14:59

Цитата:

Сообщение от laimas (Сообщение 455902)
Грубо говоря, если я пойму, что это туфта, то я такую и буду вам отправлять, зачем мне чего-то вообще выбирать. Даже безобидное отправлять "Привет!", и то замордовать можно так, что мало не покажется. Как вам такая перспектива?

Всего один вопрос - нахрена вам вообще тогда серверный язык? Ну создайте вы статичные страницы, в них укажите свое мыло, все свои товары опишите в них же, клиентским скриптом пусть там чего-то выбирают, а почту шлют прямо с клиента, либо через POP3, если доступен, либо через сервис.

На попап форту прикручу гугл капчу. На сайтах сейчас полно callback форм, в них тоже можно отправлять что угодно. Это тот же принцип , только ещё будут размеры и цвет указаны, все.
Нет, я не имел в виду что я вообще БД не использую.
Сайт полностью наполнен информацией, я имею в виду только что в данном конкретном случае отдельно данные заказа можно не сохранять. Колбэк форма кроме отправки на почту данные в админке сохраняет.
Разумеется с такой схемой при появлении объёмов работать не планируется. Если появятся объёмы будет делаться новый сайт, не на CMS

laimas 19.06.2017 15:14

Цитата:

Сообщение от ФедорН
На попап форту прикручу гугл капчу.

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

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

ФедорН 19.06.2017 16:27

Цитата:

Сообщение от laimas (Сообщение 455909)
А причем тут каптча. Вы надеетесь на клиента, хотя если судить по вопросам здесь, может и на него тоже нет надежды, просто что-то считает и бог с ним.

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

Если пользователю это нужно, ему захочется узнать стоимость , а для этого нужно ввести нужные ему размеры. По-другому никак. Склада нет , все индивидуально.
Онлайн оплаты тоже нет т.к продвигаться будет изначально в ручном режиме. Все пока рассчитано преимущественно на Юр лиц.
Если бы нужно было создать базу товаров и пр то я бы поставил какой-нибудь woocommerce и не грел голову. Но тут подобное не имеет здравого смысла. 3 вида товара. Фишка в индивидуальном размере. Не создавать же базу с изделиями 30х30, 30х31, 30х32.... 31х32... и так до 200х250. А если ещё и с миллиметрами?
Пока спрос будет изучаться в рамках региона , а если и будет отправка, то только ТК, и то есть нюансы в виде обрешётки и тд, поэтому формирование почтового отправления тут тоже неуместно.

Обсудили -то здорово, но как насчёт сориентировать по тому как сделать в первом запросе )) просто "добавить ещё" (вставляемся аналогичная строев ниже) и эти данные вставляются в форму.

laimas 19.06.2017 17:07

Цитата:

Сообщение от ФедорН
Если пользователю это нужно, ему захочется узнать стоимость , а для этого нужно ввести нужные ему размеры.

Если вы рассчитываете сумму набранного (речь то тут о калькуляторе была), то цена за единицу товара уже должна быть известна. Это как раз чтобы узнать сумму за количество нужно ввести это количество.

Изучение спроса либо на "пустом месте", тогда да, вам пишут что угодно, а вы уж решаете. Но коли у вас калькулятор, а далее вопрос "Добавить еще ...", значит не на пустом месте, а все таки есть предложения. Размеры, цвет, все что угодно, но что-то есть. А если спрос и допускается помимо предложений и произвольное от заказчика, то это из того же списка "Другое....", и тогда будет доступно поле ввода для указания например цвета, или размера.

То есть иное, это как раз и можно отправлять в "Комментарий", который дополнение к конкретному предложенному, либо вообще ничего не выбирается из предложенного, а чисто текстом описывается ....

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

Добавить в форму набор полей не сложно, полную структуру этих полней формы покажите. И на чем надо, JS или jQuery?

ФедорН 20.06.2017 10:14

Цитата:

Сообщение от laimas (Сообщение 455922)
Если вы рассчитываете сумму набранного (речь то тут о калькуляторе была), то цена за единицу товара уже должна быть известна. Это как раз чтобы узнать сумму за количество нужно ввести это количество.

Изучение спроса либо на "пустом месте", тогда да, вам пишут что угодно, а вы уж решаете. Но коли у вас калькулятор, а далее вопрос "Добавить еще ...", значит не на пустом месте, а все таки есть предложения. Размеры, цвет, все что угодно, но что-то есть. А если спрос и допускается помимо предложений и произвольное от заказчика, то это из того же списка "Другое....", и тогда будет доступно поле ввода для указания например цвета, или размера.

То есть иное, это как раз и можно отправлять в "Комментарий", который дополнение к конкретному предложенному, либо вообще ничего не выбирается из предложенного, а чисто текстом описывается ....

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

Добавить в форму набор полей не сложно, полную структуру этих полней формы покажите. И на чем надо, JS или jQuery?

Здесь не нужно нагружать пользователя. Ну, знаю я, что квадратный метр стоит например 5580, а мне нужен размер 61х92, не отковывать же калькулятор и т.д. А тут сразу видно сколько стоит мое изделие.

Размеры вводит пользователь. Цвет выбирает тоже пользователь , возможность выбора как раз реализована в скрипте, который опубликован изначально в этой ветке. Текстом пользователю ничего вводить не нужно т.к. Цвета 3, в этом все отличие. Собственно , на данном этапе нет никаких доп. фишек , которые бы пользователь мог для заказа достать из собственной головы , все фиксированно.

JS. По поводу попап формы , использую данный плагин. Лишнее для себя из него убрал, но принцип остаётся тот же. Подскажите , если нужно куда-то выгрузить или скопировать часть кода только окна формы , сделаю. Буду очень благодарен если наставите на путь истинный)

ФедорН 20.06.2017 10:16

Цитата:

Сообщение от Rise (Сообщение 455923)
ФедорН, а цена откуда берется раз базы нет, живет в скрипте?)

А тут же в скрипте который выложен в value заданы значения которые у меня и служат ценой. Получается размер умножается на value , а больше ничего и не нужно
Это не торговая сеть, поэтому цена статична. Если ее нужно поменять будет, то раз в год. А через год если спрос будет уже и мысли о новом сайте будут, а то и раньше. Даже если скрипт один раз потребуется открыть для (хотя прекрасно понимаю это неправильно ) изменения, то ничего страшного. Если вы это имели ввиду

laimas 20.06.2017 10:55

Цитата:

Сообщение от ФедорН
Здесь не нужно нагружать пользователя. Ну, знаю я, что квадратный метр стоит например 5580, а мне нужен размер 61х92, не отковывать же калькулятор и т.д. А тут сразу видно сколько стоит мое изделие.

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

Почта в данном случае полезна была бы мне не как "ах заказ пришел", а отправление этого заказа клиенту на указанную почту. До этого параметры заказа хранятся в базе. Если придет подтверждение заказа, значит работаем, если нет, удаляем его из базы.

По поводу плагина ничего не понять - вы используете wordpress поэтому этот плагин или просто понравилось? Дело в том, что нужно связать поля окна с полями заказа. Нельзя отправить две формы сразу.

ФедорН 20.06.2017 11:39

Цитата:

Сообщение от Rise (Сообщение 455990)
ФедорН, дело не в том как часто ты будешь менять цену, а в том что теоретически любой вася при большом желании сможет подправить цены в этом скрипте у себя в браузере и отправятся тебе на почту неверные расчеты по цене, как ты это будешь контролировать без проверки по базе цен перед отправкой на почту, или будешь вручную пересчитывать каждый раз каждое письмо или у тебя память феноменальная и содержит все возможные варианты значений цены и сможешь на глаз определить подлог?

Теоретически каждый Вася, а практически круг таких людей на общую массу населения сильно ограничен. Из них в код каждого сайта на котором есть калькулятор заходят ещё единицы. На сайте нет онлайн оплаты , работа подавляюще с Юр лицами (выставление счета и тд), зачем это Васе с улицы нужно ? Просто от нечего делать?

Если говорить о сделано все как положено , то хороший сайт и на Wordpress не должен работать.

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

ФедорН 20.06.2017 11:51

Цитата:

Сообщение от laimas (Сообщение 455992)
Вы не понимаете сути того, о чем вам говорят. Никто не говорит, что пользователя нужно заставить решать теоремы, есть калькулятор, пусть считает. Но это сервис для него, а сервер должен получить ID продукта и выбор - ширина, высота. Цену продукта сервер знает, рассчитать он может, и должен, без клиента.

Почта в данном случае полезна была бы мне не как "ах заказ пришел", а отправление этого заказа клиенту на указанную почту. До этого параметры заказа хранятся в базе. Если придет подтверждение заказа, значит работаем, если нет, удаляем его из базы.

По поводу плагина ничего не понять - вы используете wordpress поэтому этот плагин или просто понравилось? Дело в том, что нужно связать поля окна с полями заказа. Нельзя отправить две формы сразу.

по поводу подтверждения заказа вы имеете в виду клиент через свою почту подтверждает заказ? Нет , этот вариант не пойдёт. Попап форма здесь служит больше колбэк-формой на которую будет реагирование в виде звонка. А организовать в подобной форме подтвердите нам по смс что это вы, тогда... не пойдёт )

Да, я использую wp и именно это плагин.
По поводу связи мне вот не совсем понятно , как помечать и вытаскивать значения селектов и инпутов в моем случае. Возможно, я что-то не так представляю, 2 формы отправлять и не нужно. Ввёл на странице размеры , цвет нажал добавить ещё, снова ввёл -> заказать открылась форма где в одно из полей вставлены значения , вводишь телефон и имя , и отправляешь

laimas 20.06.2017 12:09

Хорошо, отправляйте что хотите, имеется ввиду не проверяя, что шлет клиент. Но Теоретически каждый Вася, а практически круг таких людей на общую массу населения сильно ограничен., это ну просто дилетантский подход к веб приложению.

Цитата:

Сообщение от ФедорН
как помечать и вытаскивать значения селектов и инпутов в моем случае.

Не надо ничего вытаскивать. Поля формы через атрибут form можно можно связать с формой, при этом будучи находясь вне ее. Допустим ваш плагин не только принимает ввод, но и отправляет форму. Если этой форме к примеру дать id="order", а полям и спискам, которые определяют параметры заказа прописать атрибут form="order", то форма отправляемая плагином отправит и эти поля.

ФедорН 20.06.2017 12:19

Цитата:

Сообщение от laimas (Сообщение 456005)
Хорошо, отправляйте что хотите, имеется ввиду не проверяя, что шлет клиент. Но Теоретически каждый Вася, а практически круг таких людей на общую массу населения сильно ограничен., это ну просто дилетантский подход к веб приложению.

насчет дилетантства я с вами полностью согласен.


Цитата:

Сообщение от laimas (Сообщение 456005)
Не надо ничего вытаскивать. Поля формы через атрибут form можно можно связать с формой, при этом будучи находясь вне ее. Допустим ваш плагин не только принимает ввод, но и отправляет форму. Если этой форме к примеру дать id="order", а полям и спискам, которые определяют параметры заказа прописать атрибут form="order", то форма отправляемая плагином отправит и эти поля.

А как сделать "добавить ещё"? При этом форма остаётся одна, просто внутри неё добавляется ещё каким-то образом строка?

laimas 20.06.2017 12:28

Цитата:

Сообщение от ФедорН
А как сделать "добавить ещё"?

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

ФедорН 20.06.2017 13:02

Цитата:

Сообщение от laimas (Сообщение 456008)
Клонировать элементы формы и вставляя их в форму, очистив их. Я просил показать точный html код формы, его нет, поэтому конкретный код написать не могу.

<?php
function callback_display_form($lightbox = true) {
   $field_email = null;
   $field_time = null;
   $field_message = null;
   $label = null;
   $script = null;
   $description = wpautop(wpcallback_get_description());
   $inline_container = null;
   $field_label_name = wpcallback_get_option('field_option_label_name');
   $field_placeholder_name = wpcallback_get_option('field_option_placeholder_name');
   $field_label_telephone = wpcallback_get_option('field_option_label_telephone');
   $field_placeholder_telephone = wpcallback_get_option('field_option_placeholder_telephone');
   $field_label_email = wpcallback_get_option('field_option_label_email');
   $field_placeholder_email = wpcallback_get_option('field_option_placeholder_email');
   $field_label_message = wpcallback_get_option('field_option_label_message');
   $field_placeholder_message = wpcallback_get_option('field_option_placeholder_message');
   $field_label_submit = wpcallback_get_option('field_option_label_submit');

   if($lightbox) {
      $label = '<h1>' . callback_get_option('label') . '</h1>';
      $script = '<script type="text/javascript" src="' . plugins_url('js/callback.js', __FILE__) . '"></script>';
   }
   else {вариант к моему случаю не относится поэтому вырезал}

   $form_action = get_site_url() . '/?callback_action=email';
        $form = <<<EOT
<div class="callback-form {$inline_container}">{$label}{$description}<form class="clearfix callback-form-container" action="{$form_action}" method="post"><label class="hear-about-us"><span>Hear about us</span><input type="text" autocomplete="off" name="hear_about_us"></label><label><span class="callback-label"><span class="label-text">{$field_label_name}</span> <span class="input-required">*</span></span><input class="validate" type="text" autocomplete="off" name="callback_name" placeholder="{$field_placeholder_name}"></label><label><span class="callback-label"><span class="label-text">{$field_label_address}</span> <span class="input-required">*</span></span><input class="validate" type="text" autocomplete="off" name="callback_address" placeholder="{$field_placeholder_address}"></label><label><span class="callback-label"><span class="label-text">{$field_label_telephone}</span> <span class="input-required">*</span></span><input class="validate" type="text" autocomplete="off" name="callback_telephone" placeholder="{$field_placeholder_telephone}"></label>{$field_email}{$field_time}{$field_message}<input class="submit-button" type="submit" value="{$field_label_submit}"></form></div>{$script}
EOT;
   return $form;
}


Код:

<form action="" id="form" >
<div class="col-md-3 col-sm-6 col-xs-12 form-col-1">
<select id="mySelect">
<option value="1.2"/>Зеленый</option>
<option value="1.6"/>Синий</option>
<option value="1.8"/>Красный</option>
</select>
</div>
<div class="col-md-3 col-sm-6 col-xs-12 form-col-2">
<input type="number" step="1" id="height">
</div>
<div class="col-md-3 col-sm-6 col-xs-12 form-col-3">
<input type="number" id="width">
</div>
<div class="col-md-3 col-sm-6 col-xs-12 form-col-4">
<output id="output"></output>
</div>
</form>

Прикрепил попап форму, а ниже форму калькулятора, в том виде, в клиром она у меня. Признателен, если подскажите

ФедорН 20.06.2017 13:16

Цитата:

Сообщение от Rise (Сообщение 456016)
Тогда сними входную дверь, и узнаешь нужно Васе с улицы что-то или нет. Просто от нечего делать могут и убить. Что за идиотские вопросы кому это нужно, тебе что 5 лет? Иначе бы мы жили в идеальном мире если бы все делали только то что нужно. Есть такое слово безопасность, оно актуально везде где есть человек, и интернет не исключение.

Но там всё как положено, а не как тебе кажется.

Если не необходимости не значит что он этого не сделает.

Я согласен, что это по-дилетантски как уже сказали выше. И вы как человек знающий Веб разработку рассуждаете абсолютно правильно. Работа мастером должна быть сделана качественно и корректно. В частных случаях человек может обойтись тем решение, которое его устроит на какое -то время. На свой страх и риск.

Дальнейшее словоблудие- бесполезная трата времени и не более.

laimas 20.06.2017 13:35

Если делать так как я говорил, то <form id="send" class="clearfix callback-form-container" action="{$form_action}" method="post"> - добавляем ID форме.

<option value="1.2"/> - это неправильно, не должно быть тут слеша.

А вот если отправлять поля формы id="form", то тег этой формы заменить на тег DIV, а полям добавит атрибуты form="send". Но, чтобы эти поля отправились на сервер, они должны иметь имена, например список, это name="color[]", и соответственно name="width[]" и name="height[]" у полей ввода. ID у полей и списка удалить, так как они должны быть уникальны. Если ID эти используются в калькуляторе, то его код нужно переписать делегируя обработку общему родителю - id="form", так как поля добавляются.

Именование как name[], означает, что это элемент массива name. То есть сервер получит такой массив:

Код:

Array
(
    [color] => Array
        (
            [0] => значение
            [1] => значение
            ....
        )

    [width] => Array
        (
            [0] => значение
            [1] => значение
            ....
        )

    [height] => Array
        (
            [0] => значение
            [1] => значение
            .....
        )

)

Это бутстрап, не знаю где кнопка добавить, тут для примера. Списку добавить опцию с пустым значением (если только Зеленый, это не значение по умолчанию).

<div id="form" >
    <div class="roword">
        <div class="col-md-3 col-sm-6 col-xs-12 form-col-1">
            <select form="send" name="color[]">
                <option value="">Выберите цвет</option>
                <option value="1.2">Зеленый</option>
                <option value="1.6">Синий</option>
                <option value="1.8">Красный</option>
            </select>
        </div>
        <div class="col-md-3 col-sm-6 col-xs-12 form-col-2">
            <input form="send" type="number" step="1" name="width[]">
        </div>
        <div class="col-md-3 col-sm-6 col-xs-12 form-col-3">
            <input form="send" type="number" name="height[]">
        </div>
        <div class="col-md-3 col-sm-6 col-xs-12 form-col-4">
            <output></output>
        </div>
    </div>
</div>

<button>Add</button>


И обработчик:

$(function() {
    $('button').click(function() {
        $('div.roword').first().clone().appendTo($('#form')).find('select, input').val('')
    })
});

ФедорН 20.06.2017 23:28

относительно разобрался.

id в скрипте используются. Правильно ли я понимаю, что я document.querySelector("#id") должен заменить на что-то вроде width=document.querySelector("#form" input[name=width[]]) ? Надеюсь, хотя бы мыслю в правильном направлении.

Для наглядности продублирую скрипт:

function calculate() {
        var h = +height.value || 0,
            w = +width.value || 0,
            c = +select.value;
        h < 40 && (h = 40);
        w < 40 && (w = 40);
        h > 200 && (h = 200);
        w > 300 && (w = 300);
        height.value = h;
        width.value  = w;
        h = h * w;
        h *= c;
        output.value = h.toFixed(0)
    }
    var form = document.querySelector("#form"),
        output = document.querySelector("#output"),
        width = document.querySelector("#width"),
        height = document.querySelector("#height"),
        select = document.querySelector("#mySelect");
    form.addEventListener("change", calculate);
});

j0hnik 21.06.2017 00:48

Где ваш HTML?
насчет замены. это не обязательно, можно обращаться по ID.


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