【问题标题】:jQuery AJAX with remote HTML containing JS带有包含 JS 的远程 HTML 的 jQuery AJAX
【发布时间】:2010-12-16 03:50:55
【问题描述】:

我有一个使用 jQuery + AJAX 将内容加载到手风琴框架的页面设置。它可以很好地加载直接文本/HTML,但我现在需要加载 Javascript 和 HTML。

为了详细说明,我正在使用 GalleryView 在手风琴的照片库部分显示图像。然而,当我加载 HTML 文件时,脚本并没有被执行,我只是看到了直接的图像。没有画廊。

有没有一种更简洁的方法来 .load()'ing HTML 文件然后 eval()'ing 它?我尝试在 load() 函数回调中将 GalleryView 代码(使用手风琴)放入主页面,希望它可以初始化 GalleryView 插件,但不行。

【问题讨论】:

  • 包含代码,否则没人能帮忙
  • 代码有点无关紧要。我只是使用 load() 来提取包含带有一些 javascript 的静态 HTML 的 HTML 文件。所有代码都有效。我只想要一种方法来加载() html 文件并评估其中的 javascript,以便画廊能够正常工作。我真的很喜欢其他人的方法。本身不是对我的代码的更改。

标签: jquery ajax upload scripting load


【解决方案1】:

您可以使用 LiveQuery 插件。在加载其他内容的原始文件或“主”文件中,将代码绑定到正在加载的元素。插件将检测内容何时加载并执行代码。

jQuery:

$(document).ready(function(){
    $('#gallery').livequery(function(){
        $(this).galleryView();
    });
});

插件可用:http://plugins.jquery.com/project/livequery/

【讨论】:

    【解决方案2】:

    我的新答案...

    无需实时查询。您的浏览器出现了延迟,因为由于某种原因,galleryView 插件和 livequery 导致了无限循环。可能只是那里的一些不兼容(一旦我意识到它会导致无限循环,我并没有深入研究)。

    使用这个:

    $(document).ready(function(){
    
        $('#content').load('theOtherFile.html', function(){
    
            $(this).find('#gallery').galleryView(); 
    
        });
    
    });
    

    这利用了 .load() 函数允许您实现的回调方法。当ajax调用完成,内容加载完毕后,会调用回调函数。然后,您可以搜索“this”,即#content div,查找您现在加载的#gallery UL。我还注意到你有两个 $(document).ready(function(){});用途。你真的应该只使用其中之一。

    【讨论】:

      【解决方案3】:

      Load 将自动过滤掉文档中除正文标签之外的所有内容。如果您的 javascript 在文档的头部,它将不会与文档一起加载。尝试将您的 javascript 移动到 body 标记中,看看是否可行。

      在 jQuery 1.2 中,您现在可以指定一个 URL 中的 jQuery 选择器。这样做 将过滤传入的 HTML 文档,只注入元素 匹配选择器。语法 看起来像“url #some > 选择器”。默认选择器“body>*” 始终适用。如果 URL 包含一个 空间它应该是escape()d。见 更多信息的示例。

      根据 cmets 更新

      您需要在基本页面中加载 CSS。由于链接标签必须在头元素中,因此没有任何(简单的)方法可以通过 AJAX 加载它。您可以将链接添加到文档的头部,但获取链接的 href 可能需要单独调用或更改以返回链接和包装为 json 对象的 html。最好只在主文档中包含 CSS。

      我认为,如果您从 AJAX 调用中仅返回以下内容,它应该可以工作。

      <ul id="gallery">
         <li><span class="panel-overlay">This is an overlay</span><img src="img1.jpg" alt="test1" title="test1" /></li>
         <li><span class="panel-overlay">This is an overlay</span><img src="img2.jpg" alt="test2" title="test2" /></li>
         <li><span class="panel-overlay">This is an overlay</span><img src="img3.jpg" alt="test3" title="test3" /></li>
         <li><span class="panel-overlay">This is an overlay</span><img src="img4.jpg" alt="test4" title="test4" /></li>
      </ul>
      
      <script type="text/javascript">
      $(function() {
          $('#gallery').galleryView(
          {
              panel_width: 474,
              panel_height: 353,
              frame_width: 50,
              frame_height: 50,
              transition_speed: 350,
              easing: 'easeInOutQuad',
              transition_interval: 0
          });
      });
      </script>
      

      【讨论】:

      • 两件事......你应该在你的画廊 js 文件之前包含 livequery js 文件。此外,您没有绑定到您的 #gallery 元素,并且您的文件中不应有一个 或 标记被加载,因为它正在被加载到已经具有该标记的页面中。
      • 您只需要
          // 列出正在加载的文件中的元素
      • 我从包含的文件中删除了除
          之外的所有内容。将 livequery 初始化程序更改为 $(document).ready(function() { $('#gallery').livequery(function() { $(this).galleryView( {。图像被包括在内(UL),但 CSS 文件似乎没有对其生效,也没有画廊。所以 livequery 调用似乎不起作用
      • 你添加了 $(this).load(function() { } ); ?我不小心把它从我的编辑中删除了......如果这不起作用我的想法。不能说我没有尝试过。就像我之前说的......我在整个地方都使用了livequery......它从未失败过。这里肯定有其他事情发生
      • 如果要查看livequery事件内部的函数是否被调用,添加console.log("test");在 $(this).load(function() {});确保您使用的是 firefox/firebug 并打开控制台
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多