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

  • Автор темы rigid
  • 43
  • Обновлено
  • 12, May 2024
  • #1
С помощью этой базовой формы поиска, когда я открываю страницу с формой поиска и выбираю категорию в форме поиска, в раскрывающемся списке отображаются два моих варианта.



Когда я выбираю любой из них, а затем выбираю «Подкатегорию», в этом раскрывающемся списке нет вариантов (только «Подкатегория»). Если я обновлю страницу, результат тот же. Но если я выберу «Отправить», перейду на страницу результатов, а затем вернусь на страницу формы поиска, форма будет работать правильно со всеми доступными категориями и подкатегориями.



Если я обновлю страницу, выбор все равно будет доступен.

И если я закрою страницу, а затем вернусь, повторно введя URL-адрес, у меня не будет выбора в подкатегории, пока я не отправлю и не вернусь.

Тот же сценарий в Chrome и IE. Есть ли способ исправить это, чтобы все варианты были доступны без предварительной отправки и возврата? Вот код:
 <form method="get" action="../search.php" name="" />

<input id="keyword" name="keyword" value="SEARCH WORDS" onfocus="if (this.value=='SEARCH WORDS') {this.value=''; this.style.color='#000000';}" onclick="clickclear(this, 'Enter Search Words')" onblur="clickrecall(this,'Enter Search Words')" value="" />

<select size="1" name="channel" class="dropdown" />

<option value="">SELECT</option>

<option value="All">ALL</option>

<option value="1">Channel1</option>

<option value="2">Channel2</option>

</select>

<select size="1" name="sub_category" class="dropdown" />

<option value="All">Sub-Category</option>

</select>

<input type="submit" value="VIEW"/>

</td>

</form>
Код (разметка):

rigid


Рег
03 Feb, 2014

Тем
1

Постов
1

Баллов
11
  • 18, May 2024
  • #2
Хорошо, во-первых, у вашего HTML-кода есть серьезные проблемы. Вы используете замыкания XHTML, даже если это не требуется. Если вы не используете XHTML, оставьте их (/> на концах). Попробуйте это и посмотрите, работает ли это: HTML:
 

$("#channel").change(function() {

var channelID = $(this).val();

console.log(channelID);

$.post("../ajax.php", {channel_id:channelID}, function(data) {

data = $.parseJSON(data);

for(i = 0; i < data.length; i++) {

$("#sub_category").append('<option value="'+data.sub_channel_id+'">'+data.sub_channel_name+'</option>');

}

});

});

Код (разметка): jQuery:
  <form method="get" action="../search.php"> <input id="keyword" name="keyword" placeholder="Поисковые слова"> <select size="1" id="channel" name="channel" class="dropdown"> <option value="" selected disabled>Select an option</option> <option value="all">All</option> <option value="1">Channel1</option> <option value="2">Channel2</option> </select> <select size="1" id="sub_category" name="sub_category" class="dropdown"> <option value="all">Sub-Category</option> </select> <input type="submit" value="Select"> </form> 
Код (разметка):
 

Mopcкoй_жиpaф


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2
  • 19, May 2024
  • #3
Большое спасибо за ваши ответы. Я попробовал код, но безуспешно. Тот же результат. Кроме того, я не уверен, что вы подразумеваете под «что насчет встроенного js»? Любые другие идеи будут оценены по достоинству.
 

GranD97


Рег
03 Sep, 2013

Тем
0

Постов
3

Баллов
3
  • 20, May 2024
  • #4
Что ж, это должно что-то вернуть — код ужасен, но проблема не в этом. Хорошо, я немного переписал его для тестирования на своем сервере, и это работает:
 

<?php

// error_reporting(0);

// include_once (__DIR__.'/classes/config.php');

// include_once (__DIR__.'classes/sessions.php');

// if(isset($_POST["channel_id"]) && is_numeric($_POST["channel_id"])) {

// $sql = "SELECT sub_channel_id, sub_channel_name FROM sub_channels where parent_channel_id = ".$_POST["channel_id"]." ORDER BY sub_channel_name";

// $result = @mysql_query($sql);

// $response = array();

// while ($row = @mysql_fetch_array($result, MYSQL_ASSOC)) {

// $response[] = $row;

// }

// echo json_encode($response);

// }

if (isset($_POST['channel_id'])) {

echo json_encode([0=>['sub_channel_id'=>1,'sub_channel_name'=>'Test 1'],1=>['sub_channel_id'=>2,'sub_channel_name'=>'Test 2']]);

}

?>

Код (разметка): Это был html — вы увидите, что я изменил несколько вещей, в том числе расположение скрипта для ajax.php, но это мелочи. Я сделал это в ajax.php:
  <!DOCTYPE html> <html lang="no"> <head> <meta charset="UTF-8"> <script src="[URL='https://lumtu.com/yti/agLLganNodHRwczovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8zLjEuMC9qcXVlcnkubWluWbu']https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js[/URL]"></script> <script type="text/javascript"> $(document).ready(function() { $("#channel").change(function() { var channelID = $(this).val(); console.log(channelID); $.post("ajax.php", {channel_id:channelID}, function(data) { data = $.parseJSON(data); for(i = 0; i < data.length; i++) { $("#sub_category").append('<option value="'+data[i].sub_channel_id+'">'+data[i].sub_channel_name+'</option>'); } }); }); }) </script> </head> <body> <form method="get" action="../search.php"> <input id="keyword" name="keyword" placeholder="Поисковые слова"> <select size="1" id="channel" name="channel" class="dropdown"> <option value="" selected disabled>Select an option</option> <option value="all">All</option> <option value="1">Channel1</option> <option value="2">Channel2</option> </select> <select size="1" id="sub_category" name="sub_category" class="dropdown"> <option value="all">Sub-Category</option> </select> <input type="submit" value="Select"> </form> </body> </html> 


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

Но код работает нормально и заполняет второй раскрывающийся список при первом изменении раскрывающегося списка.
 

руслан156


Рег
28 Feb, 2014

Тем
0

Постов
3

Баллов
3
  • 21, May 2024
  • #5
Спасибо за ваш ответ. Если просмотр кода ajax.php поможет, вот он:
 

<?php

error_reporting(0);

include_once (__DIR__.'/classes/config.php');

include_once (__DIR__.'classes/sessions.php');

if(isset($_POST["channel_id"]) && is_numeric($_POST["channel_id"])) {

$sql = "SELECT sub_channel_id, sub_channel_name FROM sub_channels where parent_channel_id = ".$_POST["channel_id"]." ORDER BY sub_channel_name";

$result = @mysql_query($sql);

$response = array();

while ($row = @mysql_fetch_array($result, MYSQL_ASSOC)) {

$response[] = $row;

}

echo json_encode($response);

}

?>
Код (разметка): Любая дополнительная помощь будет оценена по достоинству.
 

enyata


Рег
26 Jan, 2011

Тем
1

Постов
3

Баллов
13
  • 31, May 2024
  • #6
Этот код.

Очень плохой, и он не относится к категории PHP.



Почему вы просто не используете $.post и что насчет встроенного js? На моем телефоне, поэтому сейчас не могу его переписать, но... И почему вы не используете идентификаторы для выбора вместо того, чтобы выбирать их по атрибуту имени? Все они должны иметь идентификатор для сопоставления меток с входами.



Но ведь тебе также не хватает ярлыков, так что...
 

Tank2


Рег
25 Apr, 2012

Тем
1

Постов
4

Баллов
14
  • 31, May 2024
  • #7
Я не вижу вашего кода, поэтому не могу определить, в чем проблема.

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

Происходит одно или несколько событий.



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

Добавьте в код несколько точек останова и проверьте, что и в каком порядке происходит.

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

ROLF1


Рег
19 Jun, 2014

Тем
1

Постов
2

Баллов
12
Тем
49554
Комментарии
57426
Опыт
552966

Интересно