Использование jquery load() для добавления содержимого в навигацию с вкладками

#javascript #php #jquery #html #jquery-ui

#javascript #php #jquery #HTML #jquery-пользовательский интерфейс

Вопрос:

У меня есть веб-приложение, которое использует навигацию с вкладками из набора пользовательского интерфейса: http://www.getuikit.com/docs/tab.html .

Каждая вкладка будет загружать разное содержимое, которое разбито на несколько php-скриптов, по одному на вкладку.

Один (не очень эффективный, но для успешного) вариант — загрузить все содержимое вкладок при первой загрузке страницы, чтобы использовать стандартный пример:

 <!-- This is the container of the toggling elements -->
<ul data-uk-switcher="{connect:'#my-id'}">
 <li><a id="1" class="load-tab" href="">Tab 1</a></li>
 <li><a id="2" class="load-tab" href="">Tab 2</a></li>
</ul>

<!-- This is the container of the content items -->
<ul id="my-id" class="uk-switcher">
 <li><?php require('script1.php'); ?></li>
 <li><?php require('script2.php'); ?></li>
</ul> 
 

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

Итак, что я сделал, это вместо этого добавил удерживающие divs и нацелил их на jQuery load() :

 <!-- This is the container of the content items -->
<ul id="my-id" class="uk-switcher">
 <li><div id="1"></div></li>
 <li><div id="2"></div></li>
</ul>
 

jq:

 $(document).on("click", "a.load-tab", function(){

//get the value of the tab clicked in the nav
var tab = $(this).attr('id');

//determine the filename to load based on tab clicked

if (tab == '1'){ var filename = 'script1.php'; }
if (tab == '2'){ var filename = 'script2.php'; }

//load it
$( "#" tab  ).load( filename );
});
 

Это работает нормально … иш.

Вопрос в следующем: с помощью начального (не jquery) метода каждый скрипт может использовать основные файлы главной страницы, которые уже были включены, например header.php , functions.php и т.д. и т.п. Но когда содержимое загружается из jquery, кажется, что каждый скрипт должен быть включен в scipt1.php файл и загружается снова, что приводит к созданию дублирующегося содержимого в DOM.

РЕДАКТИРОВАНИЕ script1.php в настоящее время структурировано примерно так:

  <?php
 require('header.php');
 require('connect.php');
 require('setUser.php');
 require('setParams.php');
 require('functions.php');
 ?>
 <div id="header">
 //header content
 </div>
 <table>
 //table content
 </table>
 

Страница, на которой находится навигация, давайте пока просто назовем ее index.php , уже должна содержать эти php-файлы, поэтому вы можете увидеть проблему дублирования.

Что можно сделать, чтобы избежать этого? Подумал о нескольких вариантах, таких как iframes, но, похоже, это может быть взлом.

Комментарии:

1. Что делает ваш script1.php как выглядит?

2. Если вы хотите включить эти основные файлы, то первый способ, который у вас был, — лучший. Хотя вы могли бы скрыть некоторые данные в dom и получить к ним доступ через jquery, когда вам это нужно. Это другой способ. Но не рекомендуется, особенно если вам нужны не только данные, но и функции и методы, которые вам нужны из этих других файлов. Мне бы хотелось, чтобы меню было таким, каким оно было у вас изначально. Загрузка их прямо в меню при загрузке страницы.

3. @jamie-wilson только что отредактировал мой пост. Спасибо

4. @KyleK, это не вариант. Вся причина, по которой я перешел на навигацию с вкладками, заключается в том, что мне не нужно загружать сразу 8 вкладок. Это приводит к слишком большой задержке для пользователя.

Ответ №1:

Ваша проблема, по сути, внутри ‘script1.php » у вас есть что — то , что требует … «connect.php ‘ / данные, которые заполняются. Но вы удваиваете количество элементов DOM, когда используете это.

Два решения этой проблемы: 1. создайте более тонкие версии ваших файлов lib php, которые не содержат никаких элементов DOM, только данные, необходимые для заполнения script1.php данные пользователя, или

script1.php содержит

 <?php
 require('header.php');
 require('connect.php');
 require('setUser.php');
 require('setParams.php');
 require('functions.php');
 ?>
 <div id="header">
 //header content
 </div>
 //Everything inside #content is what you want to pull in
 <div id="content">
     <table>
     //table content
     </table>
 </div>
 

А потом позвони

 $("#1").load("script1.php #content");
 

Это загрузит только HTML-код, который находится внутри #content div.

Комментарии:

1. Спасибо @jamie-wilson, это кажется таким простым, но вы попали в точку. header.php был единственным файлом, содержащим какие-либо элементы DOM, такие как <head> , и оказалось, что он все равно не нужен! Иногда вам приходится пройти через это долгий путь, чтобы очистить свой разум.