5

发生了一些奇怪的事情,但我似乎无法让 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.

4

8 回答 8

11
<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>"; ?>
于 2012-11-09T06:11:29.580 回答
3
<iframe id='id' onload='display();' name='my_id' src='www.test.com'></iframe>   

<script type='text/javascript'>
function display(){
    alert('Loading');
}
</script>
于 2012-11-09T07:07:51.040 回答
1

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

就像是:

<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 在这里没有任何作用。

于 2012-11-09T12:36:35.287 回答
1

将该函数附加到 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;

?>

这对我有用。

于 2012-11-15T20:56:14.337 回答
0

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

于 2012-11-15T19:04:00.213 回答
0

尝试这个

<?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>";

?>
于 2012-11-07T02:47:14.353 回答
0

您的问题与代码的 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 的所有权。这是您搜索 iframe 跨域时在 Google 中显示的首批链接之一。请参阅此部分:

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

这意味着,只有从同一个域加载内容时,才能访问 contentWindow。

也检查这个SO question的答案。

于 2012-11-07T04:33:08.240 回答
-1

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

document.getElementById('my_id').onload = function(){ alert('content loaded'); }

试试看

于 2012-11-07T02:50:51.140 回答