Jquery - загрузка страницы с помощью .load и селектор не выполняет сценарий? - PullRequest
6 голосов
/ 16 сентября 2009

Я пытаюсь загрузить одну страницу в другую, используя метод .load (). Эта загруженная страница содержит скрипт, который я хочу выполнить после завершения загрузки. Я собрал простой пример, чтобы продемонстрировать:

Index.html:

<html>
<head>
 <title>Jquery Test</title>
 <script type="text/javascript" src="script/jquery-1.3.2.min.js"></script>
 <script type="text/javascript">
  $(document).ready(function()
  {
    $('#nav a').click(function()
    {
      $('#contentHolder').load('content.html #toLoad', '', function() {});        
      return false;
    });
  });
 </script>    
</head>
<body>
 <div id="nav">
  <a href="content.html">Click me!</a>
 </div>
 <hr />
 <div id="contentHolder">
  Content loaded will go here
 </div>
</body>
</html>

content.html:

<div id="toLoad">
 This content is from content.html

 <div id="contentDiv">
    This should fade away.
 </div>

 <script type="text/javascript">
  $('#contentDiv').fadeOut('slow', function() {} );
 </script>
</div>

Когда ссылка нажата, контент должен загрузиться, а второй абзац должен исчезнуть. Однако это не выполняется. Если я вставлю простое предупреждение ("") в скрипт content.html, оно тоже не будет выполнено.

Однако, если я покончу с селектором #toLoad в вызове .load (), он будет работать нормально. Я не уверен, почему это так, поскольку блок явно находится в области действия #toLoad div. Я не хочу избегать использования селектора, так как на самом деле content.html будет полноценной HTML-страницей, и мне понадобится только выбранная часть из нее.

Есть идеи? Если скрипт из content.html находился в обратном вызове .load (), он работает нормально, однако я, очевидно, не хочу, чтобы эта логика содержалась в index.html.

Возможно, я мог бы использовать функцию обратного вызова .getScript () для загрузки потом «content.html.js» и иметь там логику, которая, кажется, работает? Я бы предпочел сохранить скрипт в файле content.html, если это возможно, чтобы он нормально работал при нормальной загрузке. На самом деле, я мог бы сделать это в любом случае, но я хотел бы знать , почему выше не работает.

Ответы [ 5 ]

4 голосов
/ 22 марта 2010

Если вы посмотрите на источник jquery, вы увидите, что метод .load () просто удаляет все скрипты из загруженного содержимого (если указан селектор).

    jQuery.ajax({
        url: url,
        type: type,
        dataType: "html",
        data: params,
        complete: function( res, status ) {
            // If successful, inject the HTML into all the matched elements
            if ( status === "success" || status === "notmodified" ) {
                // See if a selector was specified
                self.html( selector ?
                    // Create a dummy div to hold the results
                    jQuery("<div />")
                        // inject the contents of the document in, removing the scripts
                        // to avoid any 'Permission Denied' errors in IE
                        .append(res.responseText.replace(rscript, ""))

                        // Locate the specified elements
                        .find(selector) :

                    // If not, just inject the full result
                    res.responseText );
            }

            if ( callback ) {
                self.each( callback, [res.responseText, status, res] );
            }
        }
1 голос
/ 04 октября 2009

Могут быть некоторые ограничения для скриптов, выполняемых из загруженного извне контента. Некоторые из функций Ajax будут делать это, а некоторые нет. По какой-то иррациональной причине я ожидаю использовать .load() с селектором контента для , а не выполнения сценариев. Это, вероятно, какое-то недокументированное, но преднамеренное поведение.

Помните, вы всегда можете использовать функцию обратного вызова с .load(), которая вызывает .getScript().

0 голосов
/ 16 сентября 2009

Попробуйте выполнить эту функцию в готовом документе

<script type="text/javascript">
   $(document).ready(function(){
      $('#contentDiv').fadeOut('slow', function() {} );
   })  
</script>

Возможно, JS пытается выполнить функцию, все еще генерируя DOM. ИМО, такой подход не очень хорош для начала. Это похоже на доступ к публичным переменным в приватных функциях.

0 голосов
/ 04 октября 2009

Почему toLoad находится в отдельном документе? Я бы просто поместил toLoad и его дочерние элементы в index.html и установил их отображение: none в вашей таблице стилей, а затем прикрепил бы функции jQuery show () и hide () к обработчику onclick, чтобы вещи появлялись или исчезали.

0 голосов
/ 16 сентября 2009

Почему вызов JS является обратным вызовом загрузки? Это было бы чище

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...