Несколько экземпляров jQuery-плагинов в hjml, загруженном ajax

Я использую несколько плагинов для загрузки файлов Blueimp в HTML, загруженном ajax:

$('.edit').click(function(){
    $( "#details" ).show();
    $('#details div').html(ajax_spinner).load(script.php, "parameters");
});

Поэтому, когда вы щелкаете что-то class = "edit", отображается новый div id = "details" (но это было в DOM, когда document.ready), и script.php возвращает форму id = "upload" (которая никогда не отображается в "просмотреть источник", хотя он есть на странице..?

Какое правило / хорошая практика для работы с html добавлено после document.ready?

Теперь в этом "виртуальном DOM" появился новый элемент:

<form id="upload" method="post" action="other_script.php" enctype="multipart/form-data">

  <div id="drop">
    DROP HERE <small>Image .png or .jpg</small>
    <a class="btn mr_button">Browse</a>
    <input type="file" name="upl" />
  </div>
  <ul id="mr_uploaded_files_ul">
    <!-- The global progress bar -->
    <div id="progress" class="progress">
      <div class="progress-bar progress-bar-success"></div>
    </div>
    <!-- The file uploads will be shown here -->
  </ul>
</form>

И когда я пытаюсь воздействовать на эту "невидимую" часть DOM:

$('#drop a').click(function(){
    alert('Nope. Nothing');
});

Только когда я

$(document).on('click', '#drop a', function() {
    alert('Ah, this works');
});

Но мне нужно больше, чем предупреждение. Целый $('#upload').fileupload({ ... }) пакет обратного вызова не выполняется, возможно, из-за этой проблемы существования DOM. Кстати, я использую эту самую реализацию на других страницах, на простой существующей DOM, и она работает.

Как я могу воздействовать на эти недавно созданные элементы DOM?

1 ответ

Решение

Добавьте функцию обратного вызова к вашему load позвоните, а затем инициализируйте вашу форму.

$('#details div').html(ajax_spinner).load(script.php, "parameters", function() {
    $('#upload').fileupload({ ... });
});

Когда вы используете селектор jQuery, такой как $('#upload'), эти элементы уже должны существовать. Форма загрузки не существует до тех пор, пока она не будет загружена, поэтому селектор возвращается пустым, пока не закончится загрузка.

Причина срабатывания оповещения

$(document).on('click', '#drop a', function() {
    alert('Ah, this works');
});

связано с делегированием мероприятия. Узнайте больше здесь: http://learn.jquery.com/events/event-delegation/

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