点击数据库中的网站后,在单击时在 iframe 中加载所选 ID 的网站

3

当前网站: 在此输入图像描述

我有一个由使用php和mysql调用我的数据库的for循环生成的网站。我有一个id、名称、公司网站、地址和图片。它目前显示了名称、描述和图像,全部显示在堆叠的正方形框中。

当点击框时,我试图加载公司网站的iframe,然后覆盖框。我已经能够在加载网站时加载所有的网站iframes,但如果有5-6行以上的数据,网站加载非常慢,因为它正在加载大约7个网站。

我花了大部分时间查看jquery和iframe问题,但仍然无法使我的iframes在单击框时单独加载。我的意图是让用户点击描述/公司框而不是iframe。然后,这将加载iframe并使其出现在公司框上,其中它完全覆盖框内容。

如何在不加载动态生成页面内所有iframes的情况下,在单击时加载打开在iframe内的网站。

    <?php require_once('include/header.php')?>
    <? require('include/navigation.php')    ?>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Coworking Spaces</title>
    <link rel="stylesheet" type="text/css" href="<?php echo base_url('assets/css/mystyles'); ?>">

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
    <script>
    jQuery(function(){
        $("iframe").each(function(){
            this.tmp = this.src;
            this.src = "";
        })
        .parent(".website")
        .click(function(){
            var frame = $(this).children("iframe")[0];
            console.log(frame);        frame.src = frame.tmp;
        });
    });
        </script>
    </script>
    </script>
    </head>
    <body>

    <div id="container">
        <div id='city_header'>
            <div id='city_search'>
                <h1>
                    Kansas City
                </h1>
            </div>
        </div>
        <div id="body">
                    <?php for($i = 0; $i < count($cospaces); ++$i){?>
                    <div class="company_box" style ="background-image: url(<?php echo($cospaces[$i]['image'])?>);">

                    <div class="name_box">
                        <h3 class="space_name"><?php echo($cospaces[$i]['name'])?></h3>
                    </div>

                    <div class="description">
                        <p><?php echo($cospaces[$i]['description']) ?></p>
                    </div>
                    <!-- iframe wanting to load -->
                    <iframe id = "website" data-src="<?php echo($cospaces[$i]['website'])?>" width="200" height="200" style="background:#ffffff"></iframe>

            </div>
            <?php } ?>
        </div>
        <p class="footer">Page rendered in <strong>{elapsed_time}</strong> seconds</p>
    </div>
    </div>
    </body>
    </html>

已测试的建议实现:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
    <script type="text/javascript">
    jQuery(function($) {
        $('iframe').bind('load', function() {
           var childFrame = $(this).contents().find('iframe');
           var childElement = childFrame.contents().find('body');
           var src =  $(this).attr('data-src');
           childElement.on('click', function() {
              childFrame.attr('src', src);
           });
        });
    });
    </script>

  </head>
  <body>
    <iframe data-src="https://jsfiddle.net" srcdoc="<iframe id='hi' srcdoc='<body>Click me</body>'></iframe>">
    </iframe>
  </body>
</html>

实际问题是什么? - user557846
如何在不加载动态生成页面中的所有iframe的情况下,在iframe内打开一个网站。 (我也更新了问题。) - Justin Christian
1个回答

1
我发现在你的PHP生成的iframe中,初始的each函数调用中没有定义this.src。
另外,我不确定你为什么要调用.parent('.website'),因为这会向上遍历查找具有class="website"的包装元素,而PHP生成的iframes除了带有id="body"的div之外没有父元素。例如,你的代码正在寻找:
<div class="website">
    <iframe></iframe>
</div>

在处理iFrames时需要记住的一件事是,它们的内容在DOMReady时不可用,因此您必须为要修改其内容的每个iFrame附加一个加载侦听器。

如果我理解正确,您只希望在用户单击iframe时加载src。您尝试过类似以下代码吗?

jQuery(function($) {
   $('iframe').on('click', function(e) {
      var frame = $(this);
      frame.attr('src', frame.attr('data-src'));
      frame.off('click'); //remove on-click event to prevent reloading on click
   });
});
目标非常小,只有在单击的外边框而不是其内容主体时才会触发单击事件。与DOM事件相关的不像<div>元素或其他块级元素一样运作,因此在每个浏览器和版本上所能做的事情都有所不同。

除非您试图查找并更改其中的源代码,但如果子位于不同的域中,则使用JavaScript无法实现。请参见:Same Origin Policy

否则,您可以执行类似于

jQuery(function($) {
    $('iframe').bind('load', function() {
       var childFrame = $(this).contents().find('iframe');
       var childElement = childFrame.contents().find('body');
       var src =  $(this).attr('data-src');
       childElement.on('click', function() {
          childFrame.attr('src', src);
       });
    });
});

这将告诉您的脚本等待每个主iframe加载,找到其子iframe,将点击事件附加到子iframe body上,将源设置为主iframe的"data-src"。示例:https://jsfiddle.net/Laomfx7g/ 我使用"srcdoc"属性将静态HTML加载到iFrame中,以演示绑定到相同来源内容,因为我无法从jsfiddle编辑外部网站的源内容。最后,元素id(特别是在for循环中的"

感谢您详细的回复,它帮助我更好地理解了DOM。使用parent的原因是因为这基本上是我在20个不同的堆栈溢出帖子中的最后一次尝试。当我尝试实现您的解决方案时,我无法使其正常工作。我甚至创建了一个只有您的代码的全新测试文件,但仍然无法正常工作。 - Justin Christian
另外需要澄清的是,我的意图是让用户点击描述/公司框而不是 iframe。然后,这将加载 iframe 并使其出现在公司框上方,覆盖网站示例中框内的内容,完全覆盖框内容。 - Justin Christian
公司框是具有描述、名称和网站 iframe 的背景图像 div。 - Justin Christian
@JustinChristian 更新了答案。这应该给你一个关于如何使用jQuery选择所需点击元素和选择任何前面元素的想法。请务必查看jQuery参考文档,了解使用 nextnextAllprevprevAllfindparentparents(是的,不同,因为它会一直向上打破,直到找到选择器)等进行Dom遍历的内容。https://api.jquery.com/category/traversing/ - Will B.
感谢您的所有帮助!看起来我不能使用data-src,只能使用src并一次加载所有页面并使用show/hide切换。这不是问题,只是用户体验不太好,但是在经过将近两天的努力后,我很高兴终于找到了解决方法。如果可以的话,我会把互联网送给您,因为您在这方面帮助了我这么多。谢谢! - Justin Christian
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接