Ответ 1
easy: serialize().replace(/%5B%5D/g, '[]')
У меня есть эта часть кода в моем PHP-коде:
while ($row = mysqli_fetch_assoc($result))
{
extract($row);
echo "<tr>";
echo "<td bgcolor='#FFFFFF'><input id='bookArray[]' name='bookArray[]' type='checkbox' value='$book_id' />$book_id</td>";
echo "<td bgcolor='#FFFFFF'>$threat_name</td>";
echo "</tr>";
}
В HTML-странице я хочу использовать метод jQuery serialize() для отправки массива выбранных книг в bookArray []. В моем JavaScript
var selectedbooks = $("book_form").serialize();
alert (selectedbooks);
В окне предупреждений я не получил никакого значения (пустая строка).
Раньше, когда я использовал Prototype, он работал красиво.
easy: serialize().replace(/%5B%5D/g, '[]')
Я придумал метод, который будет, когда данные будут отправлены с использованием post
с другой стороны позволяет вам обращаться к вашим элементам с помощью $_['post']['name']
Если это массив (например, множественный выбор), то на вашем сервере вы можете получить к нему доступ в виде массива снова $_POST['myselect'][0]...
код: Функция для сериализации данных формы для сообщения
function serializePost(form) {
var data = {};
form = $(form).serializeArray();
for (var i = form.length; i--;) {
var name = form[i].name;
var value = form[i].value;
var index = name.indexOf('[]');
if (index > -1) {
name = name.substring(0, index);
if (!(name in data)) {
data[name] = [];
}
data[name].push(value);
}
else
data[name] = value;
}
return data;
}
var arTags = new Array();
jQuery.map( $("input[name='tags[]']") , function(obj,index)
{
arTags .push($(obj).val());
});
var obj = {'new_tags' : $("#interest").val() ,
'allready_tags[]' : arTags };
var post_data = jQuery.param(obj,true);
$.ajax({
type : 'POST',
url : 'some_url',
data : post_data,
dataType : "html",
success: function(htmlResponse)
{
}
});
Прототип/Scriptaculous функции сериализации для jQuery:
<script>
function toObjectMap( queryString )
{
return '{\'' + queryString.replace(/=/g, '\':\'').replace(/&/g, '\',\'') + '\'}';
}
</script>
...
<div id="result"></div>
...
<form onSubmit="$('#result').load( ajaxURL, toObjectMap( $('#formId').serialize() ) );" ...>
...
@Tomalak Вы можете использовать символы квадратных скобок "[" и "]" в XHTML видеть http://www.w3.org/TR/xhtml1/dtds.html#dtdentry_xhtml1-transitional.dtd_input
Таким образом, это означает, что имя может содержать много разных символов юридически в XHTML, хотя не имеет смысла использовать слэши или скобки. PHP поддерживает использование нотации массива в именах форм, поэтому вам может не хватать трюка, если вы не используете нотацию массива в некоторых случаях.
jQuery 1.4
var myform = $("book_form").serialize();
decodeURIComponent(myform);
правильно работать jquery = >
var data = $('form').serialize();
$.post(baseUrl+'/ajax.php',
{action:'saveData',data:data},
function( data ) {
alert(data);
});
php = >
parse_str($_POST['data'], $searcharray);
echo ('<PRE>');print_r($searcharray);echo ('</PRE>');
output = >
[query] =>
[search_type] => 0
[motive_note] =>
[id_state] => 1
[sel_status] => Array
(
[8] => 0
[7] => 1
)
и вы можете делать все, что хотите, с данными массива, благодаря fooobar.com/questions/48241/...
Возможно, вам придется изменить свой PHP, как предлагает @Tomalak, но вам также нужно будет изменить свой javascript. Для ссылки на именованный элемент используйте селектор #name:
var selectedbooks = $('form#book_form').serialize();;
Спасибо Томалаку.
В PHP файле я использую следующий код:
while ($row = mysqli_fetch_assoc($result)) {
extract($row);
echo "<tr>";
echo "<td bgcolor='#FFFFFF'><input id='$book_id' name='bookArray[]' type='checkbox' value='$book_id' />$book_id</td>";
echo "<td bgcolor='#FFFFFF'>$book_name</td>";
echo "</tr>";
} // while
** Book_id уникален.
Используя решение tvanfosson, теперь я могу получить массив входных значений
var selectedBooks = $('form # book_form'). serialize(); alert (selectedBooks);
Из окна сообщения оповещения я получаю == > bookArray% 5B% 5D = T2.05 и bookArray% 5B% 5D = T2.81
Теперь, когда я отправил значение ввода сериализации в файл PHP с помощью JQuery
var selectedBooks = $('form#book_form').serialize();
alert (selectedBooks);
var url = 'saveBookList.php';
// Send to server using JQuery
$.post(url, {bookArray: selectedBooks}, function(responseData) {
$("#save-result").text(responseData);
});
Внутри saveBookList.php для обработки формы сериализации, я получил эту ошибку Msgstr "Недопустимый аргумент для foreach()".
Внутри savebookList.php,
// If you have selected from list box.
if(isset($_POST['bookArray'])) {
// Get array or bookID selected by user
$selectedBookId = $_POST['bookArray'];
echo $selectedBookId;
foreach($selectedBookId as $selectListItem) {
echo "You sent this -->" . $selectListItem . "\n";
}
}
PHP-код выше работает отлично, если я отправляю с использованием Prototype.
Для прототипа, когда я делаю echo $selectedBookId;
Я получил Array.
Для JQuery, когда я делаю echo $selectedBookId;
Я получил == > bookArray% 5B% 5D = T4.11 & bookArray% 5B% 5D = T4.38
Мой вопрос, поддерживает ли значение jQuery значение массива для метода post?
Проблема решена! Вот что я сделал.
Внутри PHP файла для создания строк динамических флажков,
while ($row = mysqli_fetch_assoc($result))
{
extract($row);
echo "<tr>";
echo "<td bgcolor='#FFFFFF'><input name='books' type='checkbox' value='$book_id' />$book_id</td>";
echo "<td bgcolor='#FFFFFF'>$book_name</td>";
echo "</tr>";
} // while
Я больше не использую метод JQuery $.post. Я изменил свой код на следующий
var my_query_str = '';
$("input[@type='checkbox'][@name='books']").each(
function()
{
if(this.checked)
{
my_query_str += "&bookArray[]=" + this.value;
}
});
$.ajax(
{
type: "POST",
url: "saveBookList.php",
data: "dummy_data=a" + my_query_str,
success:
function(responseData)
{
$("#save-result").empty().append(responseData);
},
error:
function()
{
$("#save-result").append("An error occured during processing");
}
});
Теперь, на странице savebookList.php, значение $_POST ['bookArray'] является массивом. Yey! Yey!
Я надеюсь и желаю, чтобы метод $.post JQuery мог поддерживать тип данных массива, как это делает Prototype.:)
var data = $(form).serialize();
$.post('post.php', '&'+data);
Это не проблема с jQuery Post, она с сериализацией вы можете сделать это:
var my_query_str = '';
$("input[@type='checkbox'][@name='books']").each( function() {
if(this.checked) { my_query_str += "&bookArray[]=" + this.value; }
});
jQuery.post(
"saveBookList.php",
"dummy_data=a" + my_query_str ,
function(responseData){
$("#save-result").empty().append(responseData);
},
error: function() {
$("#save-result").append("An error occured during processing");
}
});
но все, что вам действительно нужно сделать, это заменить "['и" ] на себя после их сериализации. потому что serialize(); изменили их на их htmlencoded значение!
Если вам нужно разместить только этот массив, а не другие поля ввода, это чистое и быстрое решение:
var selectedbooks = $('book_form input[name^="bookArray["]').serialize();
alert (selectedbooks);
Explaination:
Селектор ^ = выбирает все элементы со значением атрибута name, начинающимся с "bookArray", открытой квадратной скобкой "[" гарантирует, что элемент - это массив, который мы хотим сериализовать, а не только переменная, начинающаяся со строки "bookArray".
Вы должны заменить левые квадратные скобки и прямоугольные скобки следующим образом:
data: $(this).serialize().replace(/%5B/g, '[').replace(/%5D/g, ']'),