Задать вопрос
ahk
@ahk

Bootstrap — Почему модальное окно кликабельная «пустышка»?

Добрый день!
У меня окончательно закончились варианты написания необходимого.

Обобщение:
И так имеем некую HTML-страницу(в ней не прописано модальное окно). При некой ситуации на этой странице у нас должна появляться кнопка и после клика на нее- уникальное модальное окно(генерируемое за счет JS).
Есть JS(создающий само модальное окно, с необходимым содержимым,и кнопка, при нажатии на которую появится окно).
Тут всё хорошо, действительно, все создается, все отображается, НО

Подходим к сути:
с генерируемого таким образом окна не могу сдернуть введеную/выбранную информацию(даже если создать доп кнопку и привязать к ней функцию). А вот если изначально окно прописано в HTML все работает.

Вопрос-проблема:
Что не так? Модальное окно обязательно должно быть изначально прописано в HTML, а не вставленым за счет JS?

Пример кода:
PS: сильно не ругайтесь :) Если что-то слишком коряво(я только начала в этом капаться), НО с радостью прочту напутствие

/**
 * Создание всплывающего окна
 * @param idModal id-элемента(при выборе)
 * @param nameLink название выбранного пункта
 */
function createModalWindow(idModal, nameLink) {
    /**
     * modal head
     */

    var modalHead = document.createElement("div");
    modalHead.setAttribute("class", "modal-header");

    var buttonClose = document.createElement("button");
    buttonClose.setAttribute("type", "button");
    buttonClose.setAttribute("class", "close");
    buttonClose.setAttribute("onclick", "testClick");
    buttonClose.setAttribute("data-dismiss", "modal");
    var symbol = document.createTextNode('×');
    buttonClose.appendChild(symbol);

    var title = document.createElement("h4");
    title.setAttribute("class", "modal-title");
    var titleText = document.createTextNode(nameLink);
    title.appendChild(titleText);

    modalHead.appendChild(buttonClose);
    modalHead.appendChild(title);
    /**
     * modal body
     */
    var modalBody = document.createElement("div");
    modalBody.setAttribute("class", "modal-body");
    modalBody.setAttribute("id", "bodyModal" + idModal);
    /**
     * modal footer
     */
    var modalFooter = document.createElement("div");
    modalFooter.setAttribute("class", "modal-footer");
    var buttonFooter = document.createElement("button");
    buttonFooter.setAttribute("type", "button");
    buttonFooter.setAttribute("class", "btn btn-default");
    buttonFooter.setAttribute("data-dismiss", "modal");
    var textButtonFooter = document.createTextNode("Close");
    buttonFooter.appendChild(textButtonFooter);
    modalFooter.appendChild(buttonFooter);
    /**
     * modal content
     *
     */
    var modalContent = document.createElement("div");
    modalContent.setAttribute("class", "modal-content");
    modalContent.insertBefore(modalHead, modalContent.childElementCount[0]);
    modalContent.insertBefore(modalBody, modalContent.childElementCount[1]);
    modalContent.insertBefore(modalFooter, modalContent.childElementCount[2]);
    /**
     * modal dialog
     *
     */
    var modalDialog = document.createElement("div");
    modalDialog.setAttribute("class", "modal-dialog");
    modalDialog.appendChild(modalContent);
    /**
     * modal window
     *
     */
    var modalWindow = document.createElement("div");
    modalWindow.setAttribute("class", "modal fade");
    modalWindow.setAttribute("id", "modalDialog" + idModal);
    modalWindow.setAttribute("role", "dialog");
    modalWindow.appendChild(modalDialog);

    var base = document.getElementById("contain");
    base.insertBefore(modalWindow, base.childNodes[0]);

}

/**
 * Create link to modal window
 * @param selected
 * @param id селектора
 * @param idModalWindow
 */
function createLink(selected, id, idModalWindow) {
    var rowDir = document.createElement("div");
    rowDir.setAttribute("class", "row");
    rowDir.setAttribute("id", "id" + id);
    var sortDiv = document.createElement("div");
    sortDiv.setAttribute("class", "col-md-2");
    rowDir.appendChild(sortDiv);
    var link = document.createElement("button");
    link.setAttribute("id", idModalWindow);
    link.setAttribute("data-toggle", "modal");
    link.setAttribute("data-target", "#" + idModalWindow);
    link.setAttribute("class", "btn btn-link btn-md");
    var linkText = document.createTextNode(selected);
    link.appendChild(linkText);
    sortDiv.appendChild(link);
    // createModalWindow(id, selected);
    var originalDiv = document.getElementById("toolId");
    originalDiv.insertBefore(rowDir, originalDiv.childNodes[0]);
}
  • Вопрос задан
  • 357 просмотров
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
@maikttt
ahk
Модальное окно обязательно должно быть изначально прописано в HTML?

НЕТ, не обязательно, ее можно поставить прямо перед нажатьем на кнопку "открыть".

В коде что в примере, есть ошыбки
link.setAttribute("id", idModalWindow);
link.setAttribute("data-toggle", "modal");
link.setAttribute("data-target", "#" + idModalWindow);

Создается link c ID=idModalWindow и атрибут data-target=#idModalWindow - то есть предпологается что это ссылка будет открывать окно у которыи id = idModalWindow - тоесть на странице будут два элемента с id=idModalWindow (кнопка и окно)

Пример будет работать есль (могут быть и другие варианты):
1. При создании окна, еи будет задан в качесте id то что передонно как параметр idModal (что логино)
modalWindow.setAttribute("id", idModal);
2. Сылке что открывает окно даем другои id чем параметр idModalWindow (например 'link-' + id)
link.setAttribute("id", 'link-' + id);
3. При нажатии на ссылку добовляем html модальное окно
(после создания ссылки добовляем еи eventListener)
link.addEventListener('click', function() {
        createModalWindow(idModalWindow, 'TITLE');
}, false);

4. Вызываем createLink - с нужными параметрами (убедимся что на странице есть блоки #container и #toolId)
createLink('Open', 'button', 'magic-window');
После закрытья окно может быть удалено странице.

P.S.
Как и Adamos советую использовать jQuery и как писал Никита Полевой в комм. большые примеры делаете на jsfiddle или на codepen.
Ответ написан
Adamos
@Adamos
Напутствие: jQuery. Bootstrap его все равно использует.
И портянки превращаются...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы