Достать значения input'ov
Здравствуйте, совсем недавно начал изучать js, так что я еще совсем чайник.
Сейчас на сайте делаю что-то вроде стены как ВК, так вот на этой стене есть 10 блоков с сообщениями, структура каждого блока следующая: <div id='block'> <input type='hidden' value='$id_message' id='id_mes'> <textarea rows='1' placeholder='Оставить комментарий..' id='com'</textarea> <input type='submit' value='Комментировать' class='button_comment' id='submit'> <div></div> </div> Первый инпут скрыт, в него php код вставляет id сообщения к которому идет комментарий. То есть, например пользователь комментирует 5-ый комментарий, то в первый инпут в id пойдет цыфра 5. Весь код php работает замечательно, но нужно сделать чтобы еще работало на ajax'e. Для этого есть такой код: $(function(){ $("#submit").click(function(){ var com=$("#com").val(); var id_mes=$("#id_mes").val(); $.ajax({.... И вот тут уже у меня нечего не получается, проблема в том что я не знаю как вытащить данные именно из того блока по которому кликнули. Этот код работает только с первым комментарием, видимо js обнаруживает все данные у первого комментария и дальше "искать" не хочет. Мне нужно написать корректно код, чтобы вытаскивались данные именно из того блока комментариев по которому было нажато, как это сделать, помогите пожалуйста! Уже неделю не могу разобраться... пробовал и this писать... все-равно не получается. |
Цитата:
Приведите HTML для двух блоков, (*пока не понял различия |
id - Identificator - Идентификатор - идентифицировать - уникальность.
У вас же нет никакой уникальности |
<form> <div id='block'> <input type='hidden' value='$id_message' id='id_mes' name='id_mess'> <textarea rows='1' placeholder='Оставить комментарий..' id='com' name='comment'></textarea> <input type='submit' value='Комментировать' class='button_comment' id='submit'> <div></div> </div> </form> <script src="//code.jquery.com/jquery-latest.min.js"></script> <script> $(".button_comment").click(function(e){ var data = $(this.form).serialize(); var url = 'comment/add' $.ajax({ url: url, data: data, complete: function(){} }); alert(data); e.preventDefault(); }); </script> |
а как сделать уникальность? если мне нужно дать все кнопкам одинаковый id, чтобы работать через js.
|
Цитата:
"Мне нужно дать всем своим детям одинаковые имена, чтобы было удобнее обращаться к ним" Vladislav, не могли бы вы приоткрыть слегка свои глаза и взгянуть на предлагаемый мною код? Особенно нужно напрячься и разглядеть 12-ю строчку. |
Цитата:
Потом я не могу понять, зачем буква "е", в конце 12-ой строчке. И еще: var data = $(this.form).serialize(); var url = 'comment/add' Что за переменные вы тут создаете, почитал про serialize ("В Javascript можно сериализовать данные и получить сериализованную строку точь в точь как в PHP."), но опять же не понял что это. Может быть все данные с этой формы заносятся в переменную data? :-? А вторая переменная url зачем была создана? Извините за нубство, пожалуйста разъясните) Я хочу понять это. :yes: |
Цитата:
Цитата:
В том числе имеет метод preventDefaul() для предотвращения действия по умолчанию. Если его не предотвратить, то произойдет отправка формы, тоесть уход со страницы. В jQuery, вместо e.preventDefault() можно просто венуть false, и это также отменит действие по умолчанию. $(".button_comment").click(function(){ .... return false; }); Цитата:
Цитата:
|
Спасибо большое, я все понял, кроме одного момента, я так и не понял:
var data = $(this.form).serialize(); Ну вот смотрите: <input type='hidden' value='$id_message' id='id_mes' name='id_mess'> <textarea rows='1' placeholder='Оставить комментарий..' id='com' name='comment'></textarea> <input type='submit' value='Комментировать' class='button_comment' id='submit'> Пользователь введет комментарий и нажмет "отправить", мы с помощью js делаем: var data = $(this.form).serialize(); Отправляем все это в php обработчик, но в php мне нужно получить переменные: comment и id_message, а как я их получу? Можете на примере показать? Раньше я в js делал вот так: var comment=$("#comment").val(); var id_message=$("#id_message").val(); |
Так ведь мы передаем data в $.ajax(options) (17 строка)
В случае GET запроса (а $.ajax по умолчанию делает get-запрос, и следует выставить post вместо него) будет сделан запрос на site.ru/path/to/controller?&comment=БлаБла&id_mess=5 Что в пхп достается через $message_id = (integer) $_GET['id_mess']; $comment_content = (string) $_GET['comment']; Но нужно выставить $.ajax({type: 'POST'}); Тогда на серваке нужно будет использовать $_POST[] Цитата:
|
У меня было так:
$(function(){ $("#com_wall_submit").click(function(){ var comment=$("#comment").val(); var id_message=$("#id_message").val(); $.ajax({ type: "POST", url: "handlers/com_wall", data: {"comment": comment, "id_message": id_message}... Дальше в php я просто получал эти переменные следующим образом: $comment=$_POST['comment']; $id_message=$_POST['id_message']; и работал с ними. |
Как я уже говорил, $.ajax() принимает в качестве data несколько форматов. Так что без разницы
var data = {comment: $('#comment').val(), id_message: $('id_message').val()}; или var data = 'comment=comment_content&id_message=message_id' Оба варианта приемлемы. И сервера эти различия не касаются. |
Сделал как вы говорите, то есть:
js: $(function(){ $(".button_comment").click(function(){ var data = $(this.form).serialize(); $.ajax({ type: "POST", url: "handlers/com_wall", data: data,... html: <form class='form-container' action='handlers/com_wall' method='post'> <textarea rows='1' placeholder='Оставить комментарий..' id='com'></textarea> <input type='hidden' value='$id_message' id='id_mes'> <input type='hidden' value='$id_mine' id='sender'> <div class='wrap_button_comment'> <div class='error_com_box' id='error_com_box'></div> <input type='submit' value='Комментировать' class='button_comment' id='com_wall_submit'> <div class='clear'></div> </div> </form> php: <?php if (isset($_POST['com'])) {$com=$_POST['com'];if ($com=='') {unset($com);}} if (isset($_POST['id_mes'])) {$id_mes=$_POST['id_mes'];if ($id_mes=='') {unset($id_mes);}} if (isset($_POST['sender'])) {$sender=$_POST['sender'];if ($sender=='') {unset($sender);}} if (empty($id_mes) OR empty($sender)){ echo 0; exit(); } .... и мне выдает ошибку "0", то есть переменная $sender или $id_mes пустые... |
Vladislav, ну вы опять закрыли глаза. Посмотрите на первый мой пример. Там в html прописаны name для элементов формы.
unset($var) не нужно делать, ибо empty($var = '') выдаст true |
как не прискорбно мне про это говорить, но я убрал unset, добавил name и все равно нечего не получается, хоть на этот раз ошибку уже не выводит.
Ладно, поробую еще в нете покапаться, может быть пример найду какой-то... Вам спасибо большое, даже огромное!! Я еще вернусь! |
Учитесь локализовывать ошибки. Для начала проверьте данные, которые отправляет браузер (вкладка Сеть(Network)). Если все ок, значит проблема на сервере. var_dump обычно помогает во всем разобраться.
|
Вот как это выглядит в Chrome Developer Tools:
![]() |
Часовой пояс GMT +3, время: 19:03. |