Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Нужно передать значение переменной при нажатии button (https://javascript.ru/forum/dom-window/53900-nuzhno-peredat-znachenie-peremennojj-pri-nazhatii-button.html)

Aggao 23.02.2015 03:30

Нужно передать значение переменной при нажатии button
 
Здравствуйте. Помогите передать значение переменной "txtName" и $buttonName = true на страницу при нажатии кнопки "buttonName" без перезагрузки страницы.

if ($_POST['buttonName']) { echo $_POST['txtName']; }

}
echo '
<input id="txtId" name="txtName" type="text" value="">
<input id="buttonId" name="buttonName" type="button" onClick="" value="Добавить">';

laimas 23.02.2015 05:41

Ajax поможет, XMLHttpRequest или один из методов jQuery, если используется.

if ($_POST['buttonName']) { echo $_POST['txtName']; }

А без кнопки buttonName, что не прокатит?

if ($_POST['txtName']) { echo $_POST['txtName']; }

Aggao 23.02.2015 10:41

Это добавление товаров в корзину. Поэтому нажатие кнопки "добавить" обязательно должно быть. Я не очень владею ajax, поэтому и прошу помощи. Немного осваиваю js, но знаний не хватает на некоторые моменты связанные с отправкой переменных через формы не подгружая страницы.

Aggao 23.02.2015 10:42

Laimas, а Вы не могли бы подробнее с кодом показать как осуществить передачу переменной нажатием кнопки?

laimas 23.02.2015 16:45

Ну если корзина и добавление товара, то 'txtName', это не то что нужно, нужен идентификатор товара.

Вы используете в этом проекте jQuery или нет?

Aggao 23.02.2015 18:54

Да использую. Нужна любая реализация задуманного. Js мне хоть как-то знаком, с jquery все сложнее :)

laimas 23.02.2015 19:21

Ну на jQuery как раз сложностей нет, все намного проще. Выберите упрощенные его методы Ajax .get() или .post(), их вполне хватит. Попробуйте хотя бы по примерам что-то написать, а далее с конкретными проблемами можно и на форум.

Aggao 01.03.2015 00:46

Хотелось бы на примере увидеть. Сейчас пытаюсь изучить ajax, но не все моменты понятны. Нужен пример.

laimas 01.03.2015 02:40

Так примеры есть и по ссылке. Ну если не понятно как их задействовать конкретно к кнопке и полю ввода, то можно поступить например так - поля input, это поля вне формы, если не подразумевается добавление N-товаров с одной страницы, то есть запрос на добавление, это добавление только одного товара. Пусть все товары на странице отображаются в списке, и элемент UL имеет id "products", в нем, а не по всей странице и нужно искать кнопки инициализирующие запрос сервера:

<ul id="products">
    <li><input type="number" name="pid[100]" value="1" min="1"> <button></button></li>
    <li><input type="number" name="pid[212]" value="1" min="1"> <button></button></li>
</ul>


Поле выбора количества товара лучше сделать типа number - в Opera, Chrome, в последнем FF такое поле будет иметь кнопки. Старые браузеры будут "понимать" такое поле как text. Имя поля, это ключ содержащий идентификатор товара, в примере равен pid. На сервере идентификатор можно получить так: (int)key($_POST['pid']).

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

На время запроса сервера нужно блокировать запросы на добавление товара, а по окончании снимать блокировку. Это можно сделать с помощью двух методов jQuery - ajaxStart и ajaxStop, которые можно привязать к любою объекту. В итоге получится, что-то такое:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
function toBasket(o) {
    $.post('url', o.attr('name')+'='+o.val(), function(d) {
        //d содержит ответ сервера
        //удаляем анимацию у кнопки
        o.next().removeClass('send');
    })
}

$(function() {
    var add = $('#products').find('button');
    add.click(function() {
        //добавляем анимацию кнопке и передаем количество товара серверу
        toBasket($(this).addClass('send').prev())
    }).on({
        ajaxStart: function() {
            //блокируем отправку 
            add.prop('disabled', 1)
        },
        ajaxStop: function() { 
            //разрешаем отправку
            add.prop('disabled', 0) 
        }   
    });
});
</script>


PS. Подправил, совершенно из головы вылетел идентификатор товара )

Aggao 05.03.2015 00:54

Цитата:

Сообщение от laimas (Сообщение 359089)
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
function toBasket(o) {
    $.post('url', o.attr('name')+'='+o.val(), function(d) {
        //d содержит ответ сервера
        //удаляем анимацию у кнопки
        o.next().removeClass('send');
    })
}

$(function() {
    var add = $('#products').find('button');
    add.click(function() {
        //добавляем анимацию кнопке и передаем количество товара серверу
        toBasket($(this).addClass('send').prev())
    }).on({
        ajaxStart: function() {
            //блокируем отправку 
            add.prop('disabled', 1)
        },
        ajaxStop: function() { 
            //разрешаем отправку
            add.prop('disabled', 0) 
        }   
    });
});
</script>


Продублировал Ваш код на свой сервер.
1. Добавил скрипт между тегами <head> </head>
2. Кнопки вывел за форму (form) и добавил стиль к кнопкам .send, прописав его в css.

Ничего не получилось. :(
Изначально стиль прописывается у кнопки, и при нажатии тоже срабатывает. Но id товара не передается. Как было 0, так и осталось. Прописал строку «Номер: (int)key($_POST['pid'])» прямо под списком с кнопками.

Я явно что-то не учел :)


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