Триггерный $document.ready (таким образом, код Ajax, который я не могу изменить, выполнен),

Мои требования следующие:

  • У меня есть богатая веб-страница, которая в определенный момент загружает набор HTML в a div, через Ajax.
  • HTML, который я получаю, действительно имеет JavaScript ()
  • Полученный JavaScript содержит $('document').ready( ... ) части
  • Я не могу изменить полученный JavaScript; это прибывает из внешнего lib
  • У меня есть функция JavaScript, которая вызвана, когда Ajax загружается. Я пытаюсь "обмануть его" в выполнение путем выполнения:

    function AjaxLoaded() {
      $('document').trigger('ready');
    }
    

Это не сокращает его, я боюсь.

Я видел несколько ответы на Переполнении стека, которые "уклоняются" от этого вопроса путем изменения кода, который возвращается на Ajax (сделайте это функцией и назовите его после загрузки или просто удалите $(document).ready()). Я должен подчеркнуть, что не могу изменить полученный код этого случая.

34
задан Community 23 May 2017 в 11:44
поделиться

3 ответа

Если вы хотите, чтобы я создал способ заставить его работать.

Вот мой тест, который показывает, что он работает: http://www.antiyes.com/test/test2.php

вот соответствующий код:

<script>
    // easy copy of an array
    Array.prototype.copy = function() {
        return [].concat(this);
    };

    // this function is added to jQuery, it allows access to the readylist
    // it works for jQuery 1.3.2, it might break on future versions
    $.getReadyList = function() {
        if(this.readyList != null)
            this.myreadylist =  this.readyList.copy();      
        return this.myreadylist;
    };

    $(document).ready(function() {
        alert("blah");
    });

</script>

<script>

    // this should be added last so it gets all the ready event
    $(document).ready(function() {
        readylist = $.getReadyList();
    });

</script>

тогда в теле у меня:

<input type="button" onclick="$(readylist).each(function(){this();});" value="trigger ready" />

в основном я добавил в jQuery функцию, которая копирует readyList до того, как он будет очищен, затем он будет доступен для использования вами.

похоже, что код, приведенный ниже, не работает:

function AjaxLoaded() {
    $(document).trigger('ready');
}

опустите кавычки вокруг документа.

21
ответ дан 27 November 2019 в 16:59
поделиться

На всякий случай, если это кому-нибудь понадобится, я немного доработал решение Джона, чтобы его можно было использовать непосредственно как включенный файл javascript.

// jquery_trigger_ready.js
// this function is added to jQuery, it allows access to the readylist
// it works for jQuery 1.3.2, it might break on future versions
$.getReadyList = function() {
  if(this.readyList != null) { this.myreadylist = [].concat(this.readyList); }
  return this.myreadylist;
};

$(document).ready(function() {
  readylist = $.getReadyList();
});

$.triggerReady = function() {
  $(readylist).each(function(){this();});
}

Включение этого файла после включения jquery позволяет запускать ready, вызывая $.triggerReady(). Пример:

<html>
  <head>
    <title>trigger ready event</title>
    <script src="test2_files/jquery-1.js" type="text/javascript"></script>
    <script src="jquery_trigger_ready.js" type="text/javascript"></script>
  </head>
  <body>
    <input onclick="$.triggerReady();" value="trigger ready" type="button">
    <script type="text/javascript">
      $(document).ready(function(){
          alert("blah");
      });
    </script>
  </body>
</html>

Кстати, я хотел сделать его $(document).triggerReady(). Если кто-то готов поделиться советом по этому поводу, буду признателен.

9
ответ дан 27 November 2019 в 16:59
поделиться

У нас была та же проблема, и мы решили ее другим способом.

Вместо

$(document).ready(function () {
  $('.specialClass').click(....

Мы использовали:

$(document).bind('ready', function(event) {
  $('.specialClass', event.target).click(..

jQuery, как обычно, инициирует событие «готово» к документу. Когда мы загружаем содержимое нового div через ajax, мы можем написать:

loadedDiv.trigger('ready')

И выполнить всю инициализацию только на div, получив то, что ожидалось.

6
ответ дан 27 November 2019 в 16:59
поделиться
Другие вопросы по тегам:

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