Загрузка данных после вызова ajax во вкладке
Я получаю данные из базы данных и использую вкладки jquery для ее отображения:
<script>
$(function () {
$( "#treeTabs" ).tabs();
});
</script>
<div id="treeTabs">
<ul>
<?php
$hod_result = getFamilyTree();
$i = 0;
while($hod_row = mysqli_fetch_array($hod_result))
{
?>
<li>
<a href="#<?php echo $hod_row["staff_id"]?>" class="tab_header"><span class="closer" data-id3="<?php echo $hod_row["staff_id"] ?>"><i class="fa fa-times" aria-hidden="true"></i></span><?php echo $hod_row["longname"].' ('.$hod_row["team_role"].')' ?></a>
</li>
<?php $i++;} ?>
</ul>
<?php
$hod_result_tabs = getFamilyTree();
$i_tabs = 0;
while($hod_row_tabs = mysqli_fetch_array($hod_result_tabs))
{
?>
<div id="<?php echo $hod_row_tabs["staff_id"]?>">
<div class="tree" id="<?php echo $hod_row_tabs["staff_id"]?>">
<ul>
<li>
<?php
$hod_id_list = $hod_row_tabs["staff_id"];
$sv_result_list= getSupervisorRole($hod_id_list);
?>
<a href="#">
<table>
<tr>
<th colspan="3">Head Of The Department:</th>
</tr>
<tr>
<td>
<?php echo $hod_row_tabs["username"].' '.$hod_row_tabs["staff_id"]; ?>
<span class="closer" data-id3="<?php echo $hod_row_tabs["staff_id"]; ?>"><i class="fa fa-times" aria-hidden="true"></i></span>
<a href="#" style="background-color:#808080; color:white; font-size: 8px; padding: 3px 3px 3px 3px;"><?php echo substr($hod_row_tabs["team_role"], 0, 3); ?></a>
<span class="createTree" data-id3="<?php echo $hod_row_tabs["staff_id"].'|Supervisor';?>"><!--<img alt="" src="imagesAssessment/add.png">--><i class="fa fa-user-plus fa-lg" aria-hidden="true"></i></span>
<span class="btn_details" data-id3="<?php echo $hod_row_tabs["staff_id"]; ?>"><!--<img title="View Evaluation Details" src="imagesAssessment/details.png">--><i class="fa fa-search fa-lg" aria-hidden="true"></i></span>
</td>
</tr>
</table>
</a>
<?php
$sv_result= getSupervisorRole($hod_id_list);
if(mysqli_num_rows($sv_result) > 0){
?>
<ul>
<?php
while($sv_row = mysqli_fetch_array($sv_result))
{
?>
<!--<ul>-->
<li>
<a href="#" >
<table style='all:unset;'>
<tr>
<td>
<a href="#" style='all:unset;' class="expand" data-id3="<?php echo $sv_row["staff_id"].'|'.$sv_row["username"].'|'.$sv_row["importance"]; ?>">
<?php echo $sv_row["username"]; ?>
</a>
<span class="closer" data-id3="<?php echo $sv_row["staff_id"]; ?>"><i class="fa fa-times" aria-hidden="true"></i></span>
<a href="#" style="background-color:#808080; color:white; font-size: 8px; padding: 3px 3px 3px 3px;"><?php echo strtoupper(substr($sv_row["team_role"], 0, 3)); ?></a>
</td>
</tr>
<tr>
<td>
<?php echo $sv_row["staff_id"]; ?>
<span class="createTree" data-id3="<?php echo $sv_row["staff_id"].'|Checker'; ?>"><!--<img alt="" src="imagesAssessment/add.png">--><i class="fa fa-user-plus fa-lg" aria-hidden="true"></i></span>
<span class="btn_details" data-id3="<?php echo $sv_row["staff_id"]; ?>"><!--<img title="View Evaluation Details" src="imagesAssessment/details.png">--><i class="fa fa-search fa-lg" aria-hidden="true"></i></span>
</td>
</tr>
</table>
</a>
<?php
$sv_id=$sv_row["staff_id"];
$ch_result= getCheckerRole($sv_id);
if (mysqli_num_rows($ch_result) > 0){?>
<ul style='' >
<li >
<?php
while($ch_row = mysqli_fetch_array($ch_result)){ ?>
<a href="#" style='display: block;'>
<table style='all:unset;'>
<tr>
<td>
<a href="#" style='all:unset;' class="expand" data-id3="<?php echo $ch_row["staff_id"].'|'.$ch_row["username"].'|'.$ch_row["importance"]; ?>">
<?php echo $ch_row["username"]; ?>
</a>
<span class="closer" data-id3="<?php echo $ch_row["staff_id"]; ?>"><i class="fa fa-times" aria-hidden="true"></i></span>
<a href="#" style="background-color:#808080; color:white; font-size: 8px; padding: 3px 3px 3px 3px;"><?php echo strtoupper(substr($ch_row["team_role"], 0, 3)); ?></a>
</td>
</tr>
<tr>
<td>
<?php echo $ch_row["staff_id"]; ?>
<span class="createTree" data-id3="<?php echo $ch_row["staff_id"].'|Squad Leader'; ?>"><!--<img alt="" src="imagesAssessment/add.png">--><i class="fa fa-user-plus fa-lg" aria-hidden="true"></i></span>
<span class="btn_details" data-id3="<?php echo $ch_row["staff_id"]; ?>"><!--<img title="View Evaluation Details" src="imagesAssessment/details.png">--><i class="fa fa-search fa-lg" aria-hidden="true"></i></span>
</td>
</tr>
</table>
</a>
<?php } ?>
</li>
</ul>
<?php } ?>
</li>
<!--</ul>-->
<?php }} ?>
</ul>
</li>
</ul>
</div>
<div class="input"></div>
</div>
<?php $i_tabs++;} ?>
</div>
Внутри каждой вкладки я получаю дерево имен:
![введите описание изображения здесь]()
Затем, нажав на
, появится всплывающее окно с список пользователей:
![введите описание изображения здесь]()
Вот код для диалогового окна:
var addUserDlg, form;
/*create and open pop up window to create a team*/
addUserDlg = $("#addUserDialog").dialog({
autoOpen: false,
height: 650,
width: 570,
modal: true,
position: { my: "center", at: "top" },
buttons: {
"Create a tree": addUser,
Cancel: function () {
addUserDlg.dialog("close");
}
},
close: function () {
form[ 0 ].reset();
}
});
$(document).on('click', '.createTree', function(){
addUserDlg.dialog("open");
var leader_role = $(this).data("id3");
$.ajax({
url: "comAssessment/hr_tree_list.php",
method: "POST",
data: {leader_role: leader_role},
success: function (data) {
$('#users').html(data);
}
});
});
form = addUserDlg.find("form").on("submit", function (event) {
event.preventDefault();
addUser();
});
И функция addUser:
/*function to add new user to team*/
function addUser() {
var insert = [];
if ($('input[name="chk"]:checked').length > 0)
{
$('.get_value').each(function () {
if ($(this).is(":checked"))
{
insert.push($(this).val());
}
});
var user_to_leader = $('#user_to_leader').val();
var team_role = $('#team_role').val();
insert = insert.toString();
$.ajax({
url: "comAssessment/hr_tree_insert.php",
method: "POST",
data: {insert: insert, user_to_leader:user_to_leader, team_role:team_role},
success: function (data) {
location.reload();
addUserDlg.dialog("close");
}
});
}
}
Сейчас я обновляю всю страницу location.reload();
, но она не выглядит красивой, потому что она открывает первую вкладку каждый раз. Как обновить только текущую вкладку после добавления новых пользователей?
ИЗМЕНИТЬ
Хорошо, я попытался получить индекс вкладки и обновить ее. Я добавил кнопку для тестирования:
<button id="button">Click me</button>
<div class="test_bt"></div>
И jquery:
$("#button").click(function() {
var current_index = $("#treeTabs").tabs("option","active");
$("#treeTabs").tabs('load',current_index);
$('.test_bt').html(current_index);
});
Затем я удалил location.reload();
из функции успеха ajax, чтобы проверить, будет ли моя кнопка работать. Но это не работает. Я получаю только индекс, загрузка не происходит.
function addUser() {
var insert = [];
if ($('input[name="chk"]:checked').length > 0)
{
$('.get_value').each(function () {
if ($(this).is(":checked"))
{
insert.push($(this).val());
}
});
var user_to_leader = $('#user_to_leader').val();
var team_role = $('#team_role').val();
insert = insert.toString();
$.ajax({
url: "comAssessment/hr_tree_insert.php",
method: "POST",
data: {insert: insert, user_to_leader:user_to_leader, team_role:team_role},
success: function (data) {
addUserDlg.dialog("close");
}
});
}
}
Ответы
Ответ 1
У вас есть две опции
- Создайте содержимое html-вкладок на клиентах с помощью ajax и javascript.
- Поместите привязку текущей вкладки в URL-адрес, чтобы вы могли отображать текущую вкладку, когда страница обновляется.
Вариант 1 - это много работы, поэтому теперь я собираюсь разработать вариант 2.
Замените текущий код инициализации этой вкладки следующим образом:
Для jQuery 1.11
<script>
$(function () {
var url_hashtag_index = location.href.indexOf('#')
var initial_tab = url_hashtag_index==-1 ? 0 : parseInt(location.href.slice(url_hashtag_index+1))
$("#treeTabs").tabs({activate: tabSelected, active: initial_tab});
function tabSelected(event,ui){
var tab_index = $('#treeTabs').tabs("option", "active")
var hashtag_index = location.href.indexOf('#')
var url = hashtag_index==-1 ? location.href : location.href.slice(0,hashtag_index)
location.replace(url+'#'+tab_index)
}
});
</script>
Для jQuery 1.9 +
<script>
$(function () {
var url_hashtag_index = location.href.indexOf('#') // check if # is un url
var initial_tab = url_hashtag_index==-1 ? 0 : parseInt(location.href.slice(url_hashtag_index+1)) // if so get tab index
$("#treeTabs").tabs({select: tabSelected, selected: initial_tab}); // set tab index and add listener for tab selection
function tabSelected(event,ui){
var hashtag_index = location.href.indexOf('#')
var url = hashtag_index==-1 ? location.href : location.href.slice(0,hashtag_index) // remove existing tab from url
location.replace(url+'#'+ui.index) // replace url with new tab index (replace -> no history in browser)
}
});
</script>
Ответ 2
Я пытаюсь ответить на Manuel Otto Answer на вопрос, значительно упростив логику благодаря использованию свойства window.location.hash
.
<script>
$(function () {
// Setup event for selecting a tab
$("#treeTabs").tabs({ activate: tabSelected });
// Bail if there is no hash as the first tab will load by default
if (!window.location.hash) { return; }
// Get the index
var tabIndex = location.hash.split("#")[1]
// Set the current index
$("#treeTabs").tabs({ activate: tabSelected, active: tabIndex });
});
function tabSelected(event, ui) {
window.location.hash = "#" + ui.newTab.index();
return false; //disables browser anchor jump behavior
}
</script>
Эта логика потерпит неудачу, если вы решили использовать HASH для чего угодно, кроме индекса вашей вкладки, но должны начать с решения. Если вам нужно более полное использование URL HASH, оставляйте комментарий ниже, и я был бы рад расширить ответ.
Ответ 3
Вы можете извлечь код из цикла, который заполняет содержимое вкладки и создает новый файл. Новый файл должен использовать staffid/hod из параметра querystring и вместо использования id из цикла. Затем на главной странице каждая вкладка получает пустой div с идентификатором сотрудника. Когда вы сначала загружаете страницу, используйте ajax для заполнения первой вкладки из нового script. Когда вы обновляете любую вкладку, просто используйте ajax, чтобы опубликовать изменение, и в случае успеха снова загрузите содержимое текущей вкладки в div. Еще лучше, верните обновленные результаты из сообщения и вставьте его в div.
Ответ 4
В настоящее время он не делает вкладки ajax (пока). Невероятно, никто еще не просил об этом, поэтому я просто так и не добрался до этого. Возможно, я мог бы это сделать в следующей версии.
Тем временем вы можете сделать что-то вроде этого:
<div id="container">
<a href="#panel-1" data-url="/some/url/path" class="tabs">I'm a tab</a>
...
<div id="panel-1"></div>
...
</div>
И затем в вашем javascript, имея что-то вроде:
$('#container').easytabs();
$('.tabs').click(function(){
var $this = $(this);
$($this.attr('href')).load($this.data('url'));
});
Я думаю, что это обсуждение очень полезно для
Загрузка содержимого вкладки через Ajax