#php #jquery #twitter-bootstrap-3
#php #jquery #twitter-bootstrap-3
Вопрос:
Я работаю над веб-сайтом на основе twitter-bootstrap и решил сохранить верхний и нижний колонтитулы в виде отдельных php-файлов, включенных в каждую подстраницу веб-сайта. Все работало отлично, пока я не захотел добавить «активный» класс к моему текущему выбору (т.е. страница, на которой пользователь находится в данный момент).
Я нашел этот скрипт, который должен работать нормально:
$("a").click(function() {
$(".active").removeClass("active");
$(this).parent("div").addClass("active");
});
но я понял, что это работает только на долю секунды, а затем мы вернулись к меню по умолчанию -ничего не выбрано. Я проверил страницу html, и класс не был добавлен. Я понял, что это потому, что после перенаправления на новый URL, новый header.php загружается — поэтому выделение не применяется.
Любой совет о том, как я могу обойти это?
Комментарии:
1. Как выглядит ваш полностью отображаемый HTML-код? Возможно, вы что-то упускаете в разметке.
2. Вы должны знать, на какой странице вы находитесь в PHP. Затем просто проверьте и добавьте встроенный класс в PHP.
3. Отображаемый html не включает class=»active», хотя, вероятно, потому, что весь сайт перезагружается и hearder.php начинается все сначала. Адрес веб-сайта меняется правильно: name/index.php или name/about.php , но меню загружается каждый раз из header.php (приведенный выше js-скрипт находится в header.php файл). Что вы подразумеваете под «добавлением встроенного класса в PHP»?
Ответ №1:
Для такого сценария есть одно решение. Всякий раз, когда вы визуализируете страницу, укажите имя флага для этой страницы и используйте это условие флага в своем заголовочном файле,
Например, у вас есть домашняя страница, поэтому при рендеринге на домашнюю страницу передайте home_page_flag как True или любое другое значение в нем, просто добавьте условие в свой заголовок страницы, если это заголовок, и добавьте в него активный класс.
<ul>
<li <?php if ($_SERVER['PHP_SELF'] == '[this_link]') { ?>class="active"<?php } ?>>
<a href="[this_link]">Home</a>
</li>
</ul>
Синтаксис может быть неправильным, так как я не специалист по PHP, и этот логин должен работать на любом языке, установленном вашим дружелюбным соседским PHP-парнем — пожалуйста, замените экземпляры [this_link]
вашего фактического текста href
Комментарии:
1. Если бы вы изменили ‘[this_link]’ на переменную — ее было бы проще поддерживать и меньше вводить. Например, var $home = ‘index.php ‘; Тогда вы могли бы использовать $home как в вашем операторе if, так и в вашем атрибуте href.
2. Спасибо, ребята, но с этим 2 проблемы. Во-первых, мне нужно вставить «активный» класс в существующий класс: <div class=»col-sm-2 …active …»> Во-вторых, $_SERVER[‘PHP_SELF’], похоже, не работает (ничего не вставляется). Я работаю на localhost, может ли это быть причиной?
Ответ №2:
Проверьте, что возвращается с глобального сервера, просто выполнив такой тест:
<?php echo $_SERVER['PHP_SELF']; ?>
Даже если вы работаете на localhost, пока на вашем локальном сервере работает php версии 4 или выше, это должно что-то вернуть.
Я предполагаю, что причина, по которой он кажется «не работающим», как указано в вашем комментарии, заключается в том, что он возвращает все после доменной части URL страницы, выполняющей скрипт (т. Е. Не Ваш include, а фактическую страницу, которая будет возвращена пользователю). Так, например, http://example.com/foo/bar.php бы вернуться /foo/bar.php . В результате вполне возможно, что это НЕ равно href в вашем теге привязки. Например, если вы ссылаетесь на страницу /foo/bar.php от foo/foo.php , вы могли бы использовать относительный путь, например href=»bar.php «. Итак, если вы проверите, равен ли $_SERVER[‘PHP_SELF’] ссылке href , они не будут равны, даже если это одна и та же страница. Имеет смысл?
Как бы я это сделал на PHP:
Вы не показываете структуру своего сайта или вашего html, поэтому в этом примере просто предполагается, что есть 2 страницы (index.php и contact.php ), которые оба находятся в корневой папке сервера. Также предполагается, что html для меню имеет форму div, содержащего привязочный тег для каждого пункта меню.
<?php
$currentpage = $_SERVER['PHP_SELF'];
$home = "index.php";
$contact = "contact.php";
?>
<div class="col-sm-2<?php echo ($currentpage == '/'.$home) ? ' active' : ''; ?>">
<a href="<?php echo $home; ?>">Home</a>
</div>
<div class="col-sm-2<?php echo ($currentpage == '/'.$contact) ? ' active' : ''; ?>">
<a href="<?php echo $contact; ?>">Contact</a>
</div>
Итак, что это делает?
Сначала есть несколько переменных: одна для $currentpage с использованием $_SERVER[‘PHP_SELF’] и по одной для ссылки на страницу в моем меню.
Затем внутри разметки для класса, в который будет добавлен или нет активный класс, я бы использовал тернарный оператор — если вы с ними не знакомы, это похоже на сокращение для оператора if . Синтаксис для этого выглядит так: (что нужно проверить на истинность)? что делать, если это правда : что делать, если это не так ;.
В этом случае я сравниваю значение $currentpage со значением переменной $home, перед которой стоит косая черта (чтобы она соответствовала тому, как $_SERVER[‘PHP_SELF’] возвращает путь к странице). Если это правда, я повторяю пробел плюс слово active. Если это не так, и это важно, я вообще ничего не повторяю, используя только пустую строку. Это одна особенность троичных операторов по сравнению с операторами if, вы должны указать, что делать в случае ‘else’.
Это почти все, что есть. Единственное, что я использую переменную url страницы в атрибуте href.
Хорошо, так что это то, что я бы сделал, но я просто хочу упомянуть, что есть много других способов сделать это. Например, вы могли бы сделать то же самое в javascript или jQuery. В этом случае вы просто включите скрипт на каждую страницу, использующую window.Расположение.имя пути и оператор switch, чтобы определить, по какой ссылке должен быть добавлен активный класс.
Комментарии:
1. Спасибо, мой друг, проблема заключалась в том, что вы упомянули в первой части своего ответа, я просто поставил /index.php вместо всего пути, и именно поэтому это не сработало. Вставка всего пути со всеми вложенными папками из основного домена сделала свое дело. Большое спасибо, ребята!