Получить данные динамически добавляемых элементов с помощью JQuery

Очень похожая проблема с Динамически добавленные элементы HTML не могут быть найдены с помощью jQuery, но я хочу получить доступ к данным нового элемента, а не к его событию .

Элемент добавляется JQuery через запрос AJAX. Он не отсутствует в DOM, когда я пытаюсь получить к нему доступ.

<button id="get-data">Get data</button>
<div id="container">
    <!-- everything here is added through the first ajax call -->
    <button id="update-data">Update</button>
    <input type="hidden" id="elem" data-data="someData" />
</div>

Итак, я попытался:

$('#elem').data('data');
$(this).parents().find('#elem').data('data');
$(document).find('#elem').data('data');

...безуспешно.

И это не сработает: JQuery не находит #elem в DOM:

console.log($('input'));
// OR
console.log($(document).find('input'));

...выведите список input элементов в DOM, но #elem нет в этом списке.

Я предполагаю, что я не могу использовать $().find() или прямой $() для получения динамически добавляемого контента, так как мне его получить?

Вот как организован мой JS:

$(function() {
    $('#get-data').click(function() {
        $.ajax({
            url: "/"
        }).done(function() {
            $('#container').html(ajaxResult)
        });
    });
    $(document).on('click', '#update-data', function() {
        $.ajax({
            url: "/new",
            data: $('#elem').data('data')
        });
        //This ajax call doesn't work as expected because data is missing.
        //#update-data is inserted by the first AJAX call, but the click even is catched without any problem here.
    });
});

Изменить после дальнейших исследований:

Я попытался вывести результат разных селекторов JQuery:

$('#container').find('#elem');

Объект JQuery (длина: 0) => prevObject: [input#elem]


$('#container').find('#elem').first();

Объект JQuery (длина: 0) => prevObject : Объект JQuery (длина: 0) => prevObject : [input#elem]


$('#elem');
//or
$(document).find('#elem');
//or
$('#container #elem');

JQueryObject (длина: 0) => предыдущий объект: [ HTMLDocument my_website.com ]


$('#elem').first();
//or
$(document).find('#elem').first();
//or
$('#container #elem').first();

Объект JQuery (длина: 0) => prevObject : Объект JQuery (длина: 0) => prevObject : [ HTMLDocument my_website.com ]


person Jean-Marc Zimmer    schedule 14.12.2018    source источник
comment
#elem Это идентификатор вашего ввода? я вижу, что у ввода нет идентификатора. Можете ли вы также поделиться, когда и где вы обращаетесь к этому элементу?   -  person Jai    schedule 14.12.2018
comment
Вы пытались ввести id = elem?   -  person JustAMicrobe    schedule 14.12.2018
comment
Упс, забыл добавить id="elem" в пост. Виноват. Редактирование...   -  person Jean-Marc Zimmer    schedule 14.12.2018
comment
$('#elem').data('data'); должно работать: jsfiddle.net/751zcokp   -  person Islam Elshobokshy    schedule 14.12.2018
comment
Ну, это не так. -_-'   -  person Jean-Marc Zimmer    schedule 14.12.2018
comment
Чувак, я не умею создавать фиктивные значения из своей работы! У меня нет '#' в моей работе - и это все еще не работает. Даже $('input') не находит.   -  person Jean-Marc Zimmer    schedule 14.12.2018
comment
Таким образом, вы не сможете найти элемент, пока он не будет добавлен в DOM. Прямо сейчас $('#container').html(ajaxResult) ничего не делает, потому что ajaxResult не определено.   -  person Heretic Monkey    schedule 14.12.2018
comment
Как я сказал в посте, элемент находится в DOM — я даже проверил его с помощью F12, прежде чем нажать кнопку «Обновить».   -  person Jean-Marc Zimmer    schedule 14.12.2018
comment
HereticMonkey Я использовал ajaxResult, чтобы сделать код в посте легче — я делаю некоторые изменения в ответе AJAX, прежде чем добавлять его. Обратите внимание, что он не удаляет цель input   -  person Jean-Marc Zimmer    schedule 14.12.2018
comment
Хорошо, здесь нет ничего плохого в jquery - есть что-то в коде/html, что вы нам не показали, что мешает ему работать. Вот рабочий пример динамического добавления html с корректной работой jquery: jsfiddle.net/faqzc1uh фрагмент/скрипка с рабочим кодом, демонстрирующим, что он работает неправильно? минимальный воспроизводимый пример   -  person freedomn-m    schedule 14.12.2018
comment
В настоящее время я пытаюсь воспроизвести это. Но я не получаю никаких ошибок/предупреждений от консоли... Это становится действительно странным...   -  person Jean-Marc Zimmer    schedule 14.12.2018


Ответы (1)


У меня это работает, когда я использую скрытый селектор. Они оба работают ниже:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
<div class="row">
    <div class="col">

        <button id="get-data">Get data</button>
        <div id="container">
            <!-- everything here is added through the first ajax call -->
            <button id="update-data">Update</button>
            <button id="find-element">Find</button>
            <input type="hidden" id="elem" data-data="someData" />
        </div>
    </div>

</div>
<script type="text/javascript">
    $(document).ready(function () {

        $('#find-element').bind("click", function () {
            // your statements;

            var boo = $('#elem').data('data');
            var foo = $("#elem:hidden").data('data');
            alert(boo + "\n" + foo);
        }); 



    });
</script>
person L0uis    schedule 14.12.2018
comment
Это не работает. :-/ JQuery просто не находит div. - person Jean-Marc Zimmer; 17.12.2018