Использование jQuery .load разрывает ссылки на другие ресурсы библиотеки?

StackOverflow https://stackoverflow.com/questions/303026

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть простая HTML-страница с div.Я использую jQuery для загрузки содержимого приложения aspx в div «content».Код выглядит следующим образом:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js">
    </script>
    <script type="text/javascript">
        jQuery.noConflict();
    </script>
</head>
<body>
    <div id="content">
        <div id="loading"> 
            <div class="loading-indicator">Loading...</div>
        </div>
    </div>
</body>
<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery("#content").load("default.aspx");
    });
</script>
</html>

Проблема в том, что default.aspx использует Shadowbox и другие библиотеки JavaScript.Когда этот код пытается выполнить default.aspx, он действует так, как будто исходные файлы js не были загружены.Я проверяю firebug и вижу, что файлы js там (нет 404 или чего-то еще).Кто-нибудь знает, чего мне не хватает?Как вы можете видеть, я использовал функцию jQuery noConflict, потому что думал, что использование $ может конфликтовать с другими библиотеками, но это не помогло...

Это было полезно?

Решение

Является ли код, который не выполняется, визуализированным как блоки скриптов, я понимаю, что библиотеки загружены, но любые блоки скриптов или встроенный javascript не будут выполняться при такой динамической загрузке.Вам необходимо найти решение, которое будет оценивать возвращаемые блоки сценария, чтобы любой из них был действительным.Посмотрим, смогу ли я выкопать пример из прототипа, я помню, что он у них был.

ОБНОВЛЯТЬ:

Это прямо из прототипа...

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>'

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  }

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  }

Конечно, вы можете упростить это для своих нужд, но когда страница возвращается динамически, вам придется вручную оценивать все скрипты, поскольку браузер не будет оценивать скрипты, автоматически внедренные в элемент.

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

У меня есть код, который делает это, он может быть более подробным, чем необходимо, но вложенные js-файлы не должны быть проблемой.

jQuery.get('default.aspx', null, function(data) {
    $('#default').append(data);
}, 'html');

Похоже на общую проблему:

scroll top