2012-11-07 195 views
5

奇怪的事情正在發生,但我似乎無法得到的JavaScript代碼document.getElementById PHP的容器內工作...JavaScript的PHP內不工作(的document.getElementById)

例如,加載以下PHP代碼(以下)到一個PHP文件並運行它,沒有JavaScript警報?但是,如果您複製PHP回顯(或打印)並將其作爲HTML文件運行的源代碼存在JavaScript警報?因此,即使JavaScript保存在PHP標籤之外,任何在PHP標籤內創建的元素都不會在JavaScript中運行?

這裏是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錯誤。

+0

_「因此,在PHP標記內創建的任何元素都不會在javascript中運行,即使javascript保存在php標記之外嗎?」_ - 瀏覽器不知道或關心響應的哪一部分在'<?php'標籤內動態生成,哪部分是靜態的。 _「但是,如果你複製php迴應的源代碼」_ - 你能告訴我們從瀏覽器的View Page Source選項中看到的回顯到底是什麼嗎? – nnnnnn

回答

12
<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>"; ?> 
+0

非常好,我不知道你爲什麼工作,我的沒有,我不明白什麼是錯的....但你的工作沒有!謝謝! –

+0

Onload事件處理程序可能附加到iframe的後期。在元素上定義它是唯一的區別。如果在定義事件之前,那些函數是* not * defined *,那麼Javascript通常不會調用事件處理程序函數,但是投票會很好;;) –

+3

在這種情況下,onload失敗,因爲它在定義處理程序時可能檢測不到函數定義 – StormByte

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

?> 
+0

那沒有PHP代碼?我無法讓它與PHP一起工作,它可以像上面提到的那樣使用HTML。 –

+0

你可以把它放到php標籤中,像我編輯 – Kotzilla

+0

這是我上面發佈的代碼不工作? (除了圍繞腳本類型的圓括號應該是代碼的撇號,甚至排序工作) –

-1

你確定它工作在一個HTML文件?你有沒有測試過它?

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

嘗試

+0

它工作在一個HTML文件,我檢查了它......你發佈的代碼只是「onload」而不是「contentWindow.onload」,這意味着它只會在加載iFrame時運行,而不是iFrame中的內容我發佈的例子,但我的整體代碼,這部分是重要的哈哈) –

+0

我不認爲這在純HTML中的作品,因爲問題應該是與請求是跨域的相同的原始策略。在控制檯中嘗試document.getElementById('my_id')。contentDocument,你應該看到錯誤。 – xelber

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的所有權做跨域請求時。 This is one of the first links當您搜索iframe跨域時,它會顯示在Google中。請參閱此部分:

表示iframe內容的窗口對象是加載到iframe中的頁面的屬性。爲了讓包含 的頁面以任何有意義的方式訪問iframe的窗口對象,包含頁面和iframe頁面的 域需要與 (詳細信息)相同。

也就是說,只有當您從同一個域加載內容時,才能訪問contentWindow。

請檢查這個SO question的答案。

+0

但是,當代碼不在PHP中時,代碼工作正常,當代碼在PHP中時,代碼無法正常工作......如果通過HTML運行此代碼,則會在內容加載時通過此警報,我已經測試並驗證過這一點(來自不同服務器的內容),你也可以測試它! –

+0

問題出在PHP中,因爲當我運行PHP代碼時,我從來沒有收到JavaScript警報,但是如果我複製並粘貼從PHP文件回顯的源代碼到HTML文檔中,然後再次運行它javascript警報被稱爲! :o這很有趣,我不知道爲什麼會發生這種事哈哈! –

+0

我測試過了。當域名是外部的時候,我沒有得到警報(無論是從PHP還是從HTML輸出)。其奇怪的 – janenz00

3
<iframe id='id' onload='display();' name='my_id' src='www.test.com'></iframe> 

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

,因爲你叫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> 

更妙的是虎視眈眈一個framwork像jQuery並使用domready事件。它非常標準的將所有的javascript代碼包裝在一個domready處理程序中。

有其他人提到的替代方案,你直接附加框架onload處理程序通過將其放在HTML中。

PHP在這裏沒有任何效果。

+0

我強烈反對這一點。你不應該爲只有1個或者2個可能需要的功能的框架來膨脹你的所有頁面。 – StormByte

+0

顯然,如果你沒有使用框架的其餘部分,那麼可能像domready(https://github.com/ded/domready)是要走的路。但是,如果你正在寫任意數量的js,一個框架是一個非常好的主意。 – mcfedr

+0

jquery不是一個框架。綁定到onload不是一個好主意。正確的DOMready處理實現只有大約10行代碼。建議的準備就緒代碼似乎也沒問題。 – naugtur

0

魯-J是正確的,使用HTML IFRAME,更容易而且據我知道能不能用PHP來完成,內嵌JavaScript或不

1

附加功能的DOM的onLoad內的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; 

?> 

這對我的作品。

+0

太棒了! –

相關問題