Вкладки Bootstrap 4 и ошибка javascript ajax

Я использую вкладки Bootstrap 4 для отображения содержимого, полученного из вызова AJAX. Проблема в том, что я получаю сообщение об ошибке, когда вызов завершен.

Ошибка

Uncaught TypeError: $(...).tab is not a function

Вкладки изначально скрыты, и результат вызова AJAX определяет, какие вкладки отображаются и какую вкладку открывать.

Вкладки являются стандартным примером:

<ul class = "nav nav-tabs" id = "myTab" role = "tablist">
    <li class = "nav-item">
        <a class = "nav-link active" id = "home-tab" data-toggle = "tab" href = "#home" role = "tab" aria-controls = "home" aria-selected = "true">Home</a>
    </li>
    <li class = "nav-item hidden">
        <a class = "nav-link" id = "home-tab" data-toggle = "tab" href = "#Anotherhome" role = "tab" aria-controls = "home" aria-selected = "true">Another Home</a>
    </li>
    <li class = "nav-item hidden" id = "profile-tab-container">
        <a class = "nav-link" id = "profile-tab" data-toggle = "tab" href = "#profile" role = "tab" aria-controls = "profile" aria-selected = "false">Profile</a>
    </li>
    <li class = "nav-item hidden">
        <a class = "nav-link" id = "contact-tab" data-toggle = "tab" href = "#contact" role = "tab" aria-controls = "contact" aria-selected = "false">Contact</a>
    </li>
</ul>
<div class = "tab-content" id = "myTabContent">
    <div class = "tab-pane fade show active" id = "home" role = "tabpanel" aria-labelledby = "home-tab">Home</div>
    <div class = "tab-pane fade" id = "Anotherhome" role = "tabpanel" aria-labelledby = "home-tab">Another Home</div>
    <div class = "tab-pane fade" id = "profile" role = "tabpanel" aria-labelledby = "profile-tab">Profile</div>
    <div class = "tab-pane fade" id = "contact" role = "tabpanel" aria-labelledby = "contact-tab">Contact</div>
</div>

Вызов AJAX также является стандартным. Он называется $(document).ready :

$.ajax({
    url: _url,
    method: "GET",
    success: function (data) {
        // data object gets populated here

        var _profileTab = $("#profile-tab-container");  // <= this is valid - correct object retrieved
        _profileTab.show();                             // <= show the tab on the screen. no error here
        $("#profile-tab").tab("show");                  // <= use the internal bootstrap method to select the tab. error here

    },
    error: function (err) {
        // error handling here;
    }
});

Если я поставлю точку останова на строку, которая вызывает ошибку:

$("#profile-tab").tab("show");  

вы можете видеть, что на странице есть все содержимое, но стили начальной загрузки не были применены, т.е. не настроены вкладки. Так может быть, вкладки не были применены к моменту завершения вызова AJAX?

Примечание. Ошибка возникает при загрузке страницы, но если я снова вызываю функцию AJAX вручную (через кнопку), все работает нормально.

Есть ли способ запустить весь вызов AJAX или метод отображения после применения вкладок? Или какой-то другой способ отображать контент и взаимодействия без ошибок? Я не против отображать весь контент на странице и скрывать его после совершения звонка?

Вы добавили ссылку на bootstrap.js в свой код?

dutchess 02.05.2019 12:34

«Так что может случиться так, что вкладки не были применены к моменту завершения вызова ajax» => Не думайте, потому что ошибка is not a function, но вы можете попробовать это, просто установив тайм-аут в секунду или что-то еще, прежде чем вы вызовите свою функцию .tab. @dutchess Я был бы очень удивлен, если бы он это сделал: D, но да, возможно, он просто забыл включить файл JS.

Aaron3219 02.05.2019 12:36

Вы можете увидеть порядок файлов. возможно, вы загрузили bootstrap перед jquery.

zetawars 02.05.2019 12:52

Сначала загружается jquery, а затем bootstrap.min.js. После загрузки страницы все работает нормально

DeclanMcD 02.05.2019 12:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
774
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш код работает нормально.

  1. Добавьте все необходимые библиотеки.
  2. Проверьте свой URL-адрес API ajax и его ответ, который я использовал фиктивный URL-адрес ajax: https://jsonplaceholder.typicode.com/todos/1
  3. Еще раз внимательно проверьте.

    $( document ).ready(function() {
     $.ajax({
        url: 'https://jsonplaceholder.typicode.com/todos/1',
        method: "GET",
        success: function (data) {
            // data object gets populated here
    
            var _profileTab = $("#profile-tab-container");  // <= this is valid - correct object retrieved
            //_profileTab.show();                             // <= show the tab on the screen. no error here
            $("#profile-tab").tab("show");                  // <= use the internal bootstrap method to select the tab. error here
    
        },
        error: function (err) {
            // error handling here;
        }
     });
    });
    

Добавить библиотеки в html файл

<link rel = "stylesheet" href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

Ваш код работает нормально, я просто пишу базовый код с фиктивным URL-адресом ajax, и он отлично работает. Пожалуйста, дважды проверьте свои библиотеки, я думаю, вы кого-то пропустили. Попробуйте это, я надеюсь, что это поможет вам. Спасибо

Dummy API link

$('document').ready(function() {
  $.ajax({
    url: 'https://reqres.in/api/users?page=2',
    method: "GET",
    success: function (data) {
        var _profileTab = $("#profile-tab-container");
        _profileTab.show();
        $("#profile-tab").tab("show");
    },
    error: function (err) {
        console.info(err);
    }
});
})
.hidden {
  display: none;
}
<link rel = "stylesheet" href = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity = "sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin = "anonymous">


<ul class = "nav nav-tabs" id = "myTab" role = "tablist">
    <li class = "nav-item">
        <a class = "nav-link active" id = "home-tab" data-toggle = "tab" href = "#home" role = "tab" aria-controls = "home" aria-selected = "true">Home</a>
    </li>
    <li class = "nav-item hidden">
        <a class = "nav-link" id = "home-tab" data-toggle = "tab" href = "#Anotherhome" role = "tab" aria-controls = "home" aria-selected = "true">Another Home</a>
    </li>
    <li class = "nav-item hidden" id = "profile-tab-container">
        <a class = "nav-link" id = "profile-tab" data-toggle = "tab" href = "#profile" role = "tab" aria-controls = "profile" aria-selected = "false">Profile</a>
    </li>
    <li class = "nav-item hidden">
        <a class = "nav-link" id = "contact-tab" data-toggle = "tab" href = "#contact" role = "tab" aria-controls = "contact" aria-selected = "false">Contact</a>
    </li>
</ul>
<div class = "tab-content" id = "myTabContent">
    <div class = "tab-pane fade show active" id = "home" role = "tabpanel" aria-labelledby = "home-tab">Home</div>
    <div class = "tab-pane fade" id = "Anotherhome" role = "tabpanel" aria-labelledby = "home-tab">Another Home</div>
    <div class = "tab-pane fade" id = "profile" role = "tabpanel" aria-labelledby = "profile-tab">Profile</div>
    <div class = "tab-pane fade" id = "contact" role = "tabpanel" aria-labelledby = "contact-tab">Contact</div>
</div>

 <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src = "https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
    <script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

Другие вопросы по теме