2012-11-07 59 views
5

Something lạ đang xảy ra nhưng tôi dường như không thể lấy mã JavaScript document.getElementById làm việc bên trong PHP ...Javascript bên trong PHP không làm việc (document.getElementById)

Ví dụ, tải mã PHP sau đây (sau đây) vào một tập tin PHP và chạy nó, không có cảnh báo JavaScript? Nhưng nếu bạn sao chép mã nguồn mà PHP đã lặp lại (hoặc được in) và chạy nó như một tệp HTML thì có một cảnh báo JavaScript? Vì vậy, bất kỳ phần tử nào được tạo bên trong các thẻ PHP không chạy trong JavaScript, ngay cả khi JavaScript được giữ bên ngoài các thẻ PHP?

Đây là mã PHP demo:

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

Nó thậm chí không hoạt động nếu chỉ đây là mã của bạn:

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

Đây là mã nguồn mà xuất hiện (theo yêu cầu) (Ngoài ra, contentWindow.onLoad đang hoạt động tốt đối với nội dung không thuộc cùng một tên miền như tôi trong 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> 

Vấn đề của tôi là trong HTML mã này hoạt động tốt và cảnh báo được gọi là .... trong PHP mã không hoạt động và cảnh báo không bao giờ được gọi là ... Có một cái gì đó sai với cách xử lý PHP document.getElementById, không có gì sai với .contentWindow.onload.

+0

_ "Vì vậy, bất kỳ phần tử nào được tạo bên trong các thẻ PHP không chạy trong javascript, ngay cả khi javascript được giữ bên ngoài các thẻ php?" _ - Trình duyệt không biết hoặc quan tâm phần nào của phản hồi được tạo động trong các thẻ ' nnnnnn

Trả lời

12
<iframe id='my_id' onload="alert('Content Loaded');" name='my_id' src='http://www.php.com/'></iframe> 

Hoặc tốt hơn

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

Hoặc nếu bạn muốn echo nó

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

Rất đẹp, tôi không biết tại sao bạn làm việc và khai thác của tôi không phải tôi không thể nhìn thấy những gì sai .... nhưng bạn đã làm việc không-ít! Cảm ơn bạn! –

+0

Trình xử lý sự kiện Onload có thể được gắn vào cuối khung nội tuyến. Xác định nó trên phần tử là sự khác biệt duy nhất. Lên trên bình chọn sẽ được tốt đẹp mặc dù ..;) –

+3

Javascript thường không gọi chức năng xử lý sự kiện nếu những chức năng được * không * xác định * trước khi * sự kiện được xác định. Trong trường hợp đó, tải không thành công vì nó có thể không phát hiện được định nghĩa hàm tại thời điểm nó xác định trình xử lý – StormByte

0

thử này

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

Điều đó không có mã PHP? Tôi không thể làm cho nó hoạt động với PHP, nó hoạt động với HTML như bạn đã đề xuất ở trên. –

+0

bạn có thể đặt nó vào thẻ php như tôi chỉnh sửa – Kotzilla

+0

Đó là mã tôi đã đăng ở trên không hoạt động? (ngoại trừ dấu ngoặc đơn của bạn xung quanh loại tập lệnh phải là dấu nháy đơn cho mã để thậm chí loại công việc) –

-1

Bạn có chắc chắn nó hoạt động trong một tập tin HTML? bạn đã thử nó chưa

document.getElementById ('my_id'). Onload = function() { cảnh báo ('tải nội dung'); }

thử mà

+0

Nó hoạt động trong một Tệp HTML, tôi đã kiểm tra nó ... và mã bạn đã đăng chỉ là "onload" chứ không phải "contentWindow.onload" có nghĩa là nó sẽ chỉ chạy khi iFrame được tải, chứ không phải nội dung bên trong iFrame (không phải là nó quan trọng đối với ví dụ tôi đăng nhưng đối với mã tổng thể của tôi là phần quan trọng haha) –

+0

Tôi không nghĩ rằng điều này hoạt động trong HTML thuần túy, vì vấn đề phải có chính sách gốc giống như yêu cầu là tên miền chéo. thử document.getElementById ('my_id'). contentDocument trong bảng điều khiển của bạn và bạn sẽ thấy lỗi. – xelber

0

vấn đề của bạn không liên quan đến phần php của mã này. mã của bạn hoạt động tốt khi tôi cố gắng để tải một tập tin từ cùng một tên miền, như hình dưới đây:

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

Vấn đề ở đây là quyền sở hữu của iframe.contentWindow khi thực hiện một yêu cầu miền chéo. This is one of the first links hiển thị trong Google khi bạn tìm kiếm các tên miền chéo iframe. Xem phần này:

Đối tượng cửa sổ đại diện cho nội dung iframe là tài sản của trang được tải vào khung nội tuyến. Để chứa trang để truy cập đối tượng cửa sổ khung nội tuyến theo bất kỳ cách nào có ý nghĩa, tên miền của trang có chứa và trang khung nội tuyến cần phải giống nhau (chi tiết).

Điều đó có nghĩa là bạn có thể truy cập nội dungChỉ khi bạn tải nội dung từ cùng một tên miền.

Kiểm tra câu trả lời cho số SO question này.

+0

Nhưng mã hoạt động tốt khi nó không có trong PHP, mã không hoạt động khi nó là trong PHP ... Nếu bạn chạy mã này thông qua HTML cảnh báo đi qua khi nội dung được tải, tôi đã kiểm tra và xác minh điều này (với nội dung từ các máy chủ khác nhau), bạn cũng có thể kiểm tra nó! –

+0

Vấn đề là trong PHP bởi vì khi tôi chạy mã PHP tôi không bao giờ nhận được cảnh báo javascript nhưng sau đó nếu tôi sao chép và dán mã nguồn được lặp lại từ tệp PHP vào tài liệu HTML và sau đó chạy lại tất cả cảnh báo javascript được gọi! : o Thật thú vị, tôi không biết tại sao điều này lại xảy ra haha! –

+0

Tôi đã kiểm tra. Tôi không nhận được cảnh báo (không phải từ PHP cũng như từ đầu ra HTML) khi miền bên ngoài. Lạ lùng của nó – 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

Nó không thành công vì bạn gọi document.getElementById trước khi tài liệu được nạp, nếu bạn muốn gắn các khung xử lý onload như thế này, bạn cần phải thực hiện cuộc gọi đến document.getElementById trong nội dung onload.

Cái gì như:

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

Thậm chí tốt hơn grap một framwork như jQuery và sử dụng các sự kiện domready. Nó khá chuẩn để bọc tất cả mã javascript trong một trình xử lý domready.

Có sự thay thế được đề cập bởi những người khác rằng bạn trực tiếp đính kèm bộ xử lý tải khung lên bằng cách đặt nó vào html.

PHP không có bất kỳ ảnh hưởng nào tại đây.

+0

Tôi mạnh mẽ không đồng ý với điều đó. Bạn không nên bloat tất cả các trang của bạn với một khuôn khổ chỉ cho 1 hoặc có thể 2 chức năng bạn có thể cần. – StormByte

+0

Rõ ràng nếu bạn không sử dụng phần còn lại của khuôn khổ thì có thể một cái gì đó như domready (https://github.com/ded/domready) là con đường để đi. Nhưng nếu bạn đang viết bất kỳ số lượng js, một khung là một ý tưởng rất tốt. – mcfedr

+0

jquery không phải là một khuôn khổ. ràng buộc để tải trọng không phải là một ý tưởng tốt. Việc triển khai xử lý DOMready đúng chỉ là khoảng 10 dòng mã. Mã domready được đề xuất có vẻ ok. – naugtur

0

Ruben-J là đúng, sử dụng onload trong iframe html, nó là dễ dàng hơn và như xa như tôi biết không thể được thực hiện với php, embeded javascript hay không

1

Gắn chức năng để các onLoad của DOM chính nó và không cho contentWindow của phần tử DOM.

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

<script> 
    document.getElementById('my_id').onload = function(){ 
    alert('content loaded'); 
    } 
</script>​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ 

Do đó trong 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; 

?> 

nào làm việc cho tôi.

+0

Hoạt động tuyệt vời! –

Các vấn đề liên quan