【问题标题】:JavaScript inside PHP not working (document.getElementById)PHP 中的 JavaScript 不起作用(document.getElementById)
【发布时间】:2012-10-27 01:50:58
【问题描述】:

发生了一些奇怪的事情,但我似乎无法让 JavaScript 代码 document.getElementById 在 PHP 内部工作...

例如,将以下 PHP 代码(如下)加载到 PHP 文件中并运行它,有没有 JavaScript 警报?但是,如果您复制 PHP 回显(或打印)的源代码并将其作为 HTML 文件运行,是否会出现 JavaScript 警报?因此,在 PHP 标记内创建的任何元素都不会在 JavaScript 中运行,即使 JavaScript 保留在 PHP 标记之外?

这是 PHP 演示代码:

<?php 
print "
<iframe id='my_id' name='my_id' src='http://www.php.com/'></iframe>

<SCRIPT LANGUAGE='javascript'> 
document.getElementById('my_id').contentWindow.onload = function(){
    alert('content loaded');
}
</SCRIPT>
";
?>

如果这只是你的代码,它甚至不起作用:

<iframe id='my_id' name='my_id' src='<?php echo"http://www.php.com/"; ?>'></iframe>

<SCRIPT LANGUAGE='javascript'> 
document.getElementById('my_id').contentWindow.onload = function(){
    alert('content loaded');
}
</SCRIPT>

这是显示的源代码(根据要求)(contentWindow.onLoad 也适用于与我在 Safari 中不在同一域中的内容):

<iframe id='my_id' name='my_id' src='http://www.php.com/'></iframe>

<SCRIPT LANGUAGE='javascript'> 
document.getElementById('my_id').contentWindow.onload = function(){
    alert('content loaded');
}
</SCRIPT>

我的问题是,在 HTML 中这段代码可以正常工作并且会调用警报....在 PHP 中代码不起作用并且永远不会调用警报...PHP 处理 document.getElementById 的方式有问题,.contentWindow.onload没有错。

【问题讨论】:

  • “所以在 PHP 标记内创建的任何元素都不会在 javascript 中运行,即使 javascript 保留在 php 标记之外?” - 浏览器不会'不知道也不关心响应的哪一部分是在&lt;?php 标签中动态生成的,哪一部分是静态的。 “但是如果你复制 php 回显的源代码” - 你能告诉我们从浏览器的“查看页面源代码”选项中看到的确切回显的内容吗?

标签: php javascript iframe document getelementbyid


【解决方案1】:
<iframe id='my_id' onload="alert('Content Loaded');" name='my_id' src='http://www.php.com/'></iframe>

或者更好

<iframe id='my_id' onload='ShowAlert();' name='my_id' src='http://www.php.com/'></iframe>   

<script type='text/javascript'>
function ShowAlert(){
    alert('Content Loaded');
}
</script>

或者如果你想回应它

<?php
echo "<iframe id='my_id' onload='ShowAlert();' name='my_id' src='http://www.php.com/'></iframe>   

<script type='text/javascript'>
function ShowAlert(){
    alert('Content Loaded');
}
</script>"; ?>

【讨论】:

  • 非常好,我不知道为什么你的工作而我的没有。我看不出有什么问题....但你的工作却丝毫不差!谢谢!
  • Onload 事件处理程序可能附加到 iframe 的后期。在元素上定义它是唯一的区别。不过投票会很好..;)
  • 如果事件处理函数定义在事件定义之前,Javascript 通常无法调用事件处理函数。在这种情况下,onload 失败,因为它在定义处理程序时可能无法检测到函数定义
  • 之所以有效,是因为该函数是在 iframe onload 事件上调用的,父窗口可以访问该事件。警报将在 iframe 加载时执行,而不是在加载内部内容时执行。
【解决方案2】:
<iframe id='id' onload='display();' name='my_id' src='www.test.com'></iframe>   

<script type='text/javascript'>
function display(){
    alert('Loading');
}
</script>

【讨论】:

    【解决方案3】:

    失败是因为您在加载文档之前调用document.getElementById,如果您想像这样附加框架onload 处理程序,您需要将调用document.getElementById 放在主体onload 中。

    类似:

    <script>
        function loaded() {
            document.getElementById('my_id').contentWindow.onload = function(){
                alert('content loaded');
            }
        }
    </script>
    <body onload="loaded()">
    <iframe id='my_id' name='my_id' src='http://www.php.com/'></iframe>
    </body>
    

    更好地抓住像jQuery 这样的框架并使用domready 事件。将所有 javascript 代码包装在 domready 处理程序中是非常标准的。

    还有其他人提到的替代方法,您可以通过将其放入 html 中直接附加框架 onload 处理程序。

    PHP 在这里没有任何作用。

    【讨论】:

    • 我强烈反对这一点。您不应该使用仅针对您可能需要的 1 个或 2 个功能的框架来膨胀所有页面。
    • 很明显,如果你不使用框架的其余部分,那么也许像 domready (github.com/ded/domready) 之类的东西是要走的路。但是如果你正在编写任意数量的 js,那么一个框架是一个非常好的主意。
    • jquery 不是一个框架。绑定到 onload 不是一个好主意。正确的 DOMready 处理实现只有大约 10 行代码。提议的 domready 代码似乎也不错。
    【解决方案4】:

    将函数附加到 DOM 本身的 onLoad 上,而不是附加到 DOM 元素的 contentWindow 上。

    <iframe id='my_id' name='my_id' src='http://www.php.com/'></iframe>
    
    <script> 
        document.getElementById('my_id').onload = function(){
         alert('content loaded');
        }
    </script>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​
    

    因此在 PHP 中

    <?php
    echo <<< xyz
    <iframe id='my_id' name='my_id' src='http://www.php.com/'></iframe>
    
        <script> 
            document.getElementById('my_id').onload = function(){
             alert('content loaded');
            }
        </script>
    xyz;
    
    ?>
    

    这对我有用。

    【讨论】:

      【解决方案5】:

      试试这个

      <?php
      
      echo "<iframe id='my_id' name='my_id' src='http://www.php.com/'></iframe>
      
      <script type='text/javascript'>
      document.getElementById('my_id').onload = function(){     
        alert('content loaded'); 
      }
      </script>";
      
      ?>
      

      【讨论】:

      • 那没有PHP代码?我无法让它与 PHP 一起使用,它可以与您上面建议的 HTML 一起使用。
      • 那是我在上面发布的代码不起作用? (除了你的脚本类型的括号应该是代码的撇号,甚至可以工作)
      • 你的代码不工作,jsfiddle.net/eQzLx 所以你把这个 html 放在 php 标签中
      【解决方案6】:

      您的问题与代码的 php 部分无关。当我尝试从同一个域加载文件时,您的代码工作正常,如下所示:

         <?php
             print "<iframe id='my_id' name='my_id' src='test.php'></iframe>
      
             <SCRIPT LANGUAGE='javascript'> 
      
               document.getElementById('my_id').contentWindow.onload = function(){
                   alert('content loaded');
               }
             </SCRIPT>
            ";
        ?>
      

      这里的问题是执行跨域请求时 iframe.contentWindow 的所有权。 This is one of the first links 在您搜索 iframe 跨域时显示在 Google 中。请参阅此部分:

      代表 iframe 内容的 window 对象是 加载到 iframe 中的页面。为了包含 页面以任何有意义的方式访问 iframe 的窗口对象, 包含页面和 iframe 页面的域需要相同 (详情)。

      也就是说,只有从同一个域加载内容时,才能访问 contentWindow。

      也检查这个SO question的答案。

      【讨论】:

      • 但是代码不在 PHP 中时工作正常,在 PHP 中时代码不起作用...如果您通过 HTML 运行此代码,则在加载内容时会发出警报,我已经测试并验证了这一点(来自不同服务器的内容)你也可以测试它!
      • 问题出在 PHP 中,因为当我运行 PHP 代码时,我从未收到 javascript 警报,但是如果我将从 PHP 文件回显的源代码复制并粘贴到 HTML 文档中,然后突然再次运行它会调用javascript警报! :o 这很有趣,我不知道为什么会这样哈哈!
      • 我测试过。当域在外部时,我没有收到警报(既不是来自 PHP,也不是来自 HTML 输出)。很奇怪
      • 哼,疯了!我收到关于 HTML 的警报,您使用的是 Safari 吗?另外,您是使用 HTML 文件的源代码还是只是修改了 PHP 代码?
      【解决方案7】:

      Ruben-J 是对的,在 html iframe 中使用 onload,它更容易,据我所知不能用 php 完成,是否嵌入 javascript

      【讨论】:

        【解决方案8】:

        您确定它可以在 HTML 文件中使用吗?你测试了吗?

        document.getElementById('my_id').onload = function(){ alert('内容已加载'); }

        试试看

        【讨论】:

        • 它在 HTML 文件中工作,我检查了它......您发布的代码只是“onload”而不是“contentWindow.onload”,这意味着它只会在 iFrame 本身加载时运行,不是 iFrame 中的内容(这对于我发布的示例并不重要,但对于我的整体代码而言,这部分很重要哈哈)
        • 我认为这在纯 HTML 中也不起作用,因为问题应该是同源策略,因为请求是跨域的。在控制台中尝试 document.getElementById('my_id').contentDocument ,您应该会看到错误。
        猜你喜欢
        • 2021-09-05
        • 2014-01-31
        • 2021-08-29
        • 1970-01-01
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多