2014-01-27 73 views
1

使用Ajax,我打電話給一個包含javascript的php文件,但這樣,javaScript不起作用。當使用Ajax調用php文件時,php文件中的JavaScript不起作用

main.html文件在這裏給出。它只是使用Ajax調用一個名爲test1.php的php文件來更新客戶端的所有頁面。

<!DOCTYPE html> 
<html> 
<body> 
     <!-- run php file to fill the page --> 
     <script> 
      var xmlhttp = new XMLHttpRequest(); 

      xmlhttp.onreadystatechange=function() 
      { 
       if (xmlhttp.readyState==4 && xmlhttp.status==200) 
       { 
        document.body.innerHTML = xmlhttp.responseText;   
       } 
      } 

      xmlhttp.open("GET","test1.php",true); 
      xmlhttp.send(); 
     </script> 
</body> 
</html> 

而且test1.php文件是非常簡單的測試如下:

<p id="demo">Hi there</p> 
<script> 
     document.write("Yes! Hi there");  
     alert('Welcome!'); 
</script> 

現在,只是爲了檢查test1.php是好的,我把瀏覽器的URL行:

localhost/test1.php

和一切工作正常,html和js文本顯示和一個警告窗口與歡迎詞!被展示。

但如果我所說的主網頁

本地主機/ main.html中

那麼只有HTML文本 '您好' 顯示。 JS被忽略。

有人知道這是爲什麼嗎? 感謝

+0

它應該與append一起使用,而不是將它賦予innerHTML。追加將追加作爲HTML和js應該執行。昆汀是正確的,該線程有解決方案。 – fray88

回答

0

這裏是您可以使用Ajax &,你應該怎麼做怎麼做3點基本的例子:

主HTML

JS

function ajax(a,b,c){ // Url, Callback, just a placeholder 
c=new XMLHttpRequest; 
c.open('GET',a); 
c.onload=b; 
c.send() 
} 

function changeHTML(){ 
document.getElementById('mytext1').innerHTML=this.response; 
} 

function executeJS(){ 
(new Function(this.response))() 
} 

var array=[]; 
function loadJSON(){ 
array=JSON.parse(this.response); 
updateFields(); 
} 

function updateFields(){ 
for(var a=0,b;b=array[a];++a){ 
    document.getElementById(b.id).textContent=b.data; 
} 
} 

window.onload=function(){ 
ajax('getHTML.php',changeHTML); 
ajax('getJS.php',executeJS); 
ajax('getJSON.php',loadJSON); 
// even if this works you should execute ajax sequentially 
} 

HTML

<div id="mytext1"></div> 
<div id="mytext2"></div> 

getHTML.php

<?php 
echo "<div>i'm html</div>"; 
?> 

getJS.php

<?php 
echo "var a='hello';alert(a);"; 
?> 

getJSON.php

<?php 
$arr=array(array('id'=>'mytext2','data'=>'data')); 
echo json_encode($arr);//json_decode 
?> 
如果你想執行一個JavaScript函數中使用 executeJS功能,並通過有效的

javascript字符串。

EVAL沒有必要!


提示:使用JSON可以傳遞一個功能數據,但作爲解析不喜歡在一開始的字符串函數一個很好的技巧就是對JavaScript爲Base64轉換並返回到一個正常的字符串用JavaScript與atob(base64)和有這樣的事情:

function updateFields(){ 
for(var a=0,b;b=array[a];++a){ 
    if(b.func){ 
    (new Function(atob(b.func)))() 
    }else{ 
    document.getElementById(b.id).textContent=b.data; 
    } 
} 
} 

PHP

<?php 
$arr=array(
array('id'=>'mytext2','data'=>'data'), 
array('func'=>base64_encode("alert('jsonfunc')")) 
); 
echo json_encode($arr);//json_decode 
?> 

也許有一些小錯誤...我現在寫了。並不能檢查阿賈克斯atm。

如果您有任何問題,只要問!

+0

感謝您的非常詳細的教學答案。無論如何,我可以從中學到很多東西。但是對於我出現的具體問題,請根據Krasimir Tsonev的看法回答我的答案。 – user3198805

+0

你讀過TIP的部分嗎?這解釋瞭如何在同一時間發送HTML和JavaScript。 – cocco

+0

是的。感謝這一點。您提供了幾種可用於其他問題的技術,這是一套很好的工具。 – user3198805

0

我想給你insted的使用,你可以使用JavaScript的jQuery阿賈克斯這將是容易和最新的東西阿賈克斯一個建議。

您可以使用$ .ajax函數。你可以當你做一個AJAX調用您聯繫到服務器的URL使用此功能

+0

如果你正確地讀出這個問題,他已經使用ajax –

+0

謝謝,這是正確的,但我想深入純粹的代碼(沒有jquery,以瞭解機制),之後,當然,爲什麼不。 – user3198805

+0

好的。我只是給你一些關於Ajax新東西的想法。因爲這種類型的Ajax是在瀏覽器不支持jQuery時使用的。 :) –

0

輕鬆使用JSON。如果你的url在本例中是一個php頁面,它將在服務器上執行,並返回到你的AJAX調用它生成的HTML ...現在你可以使用該HTML並使用它進行管理或發佈到當前頁面DOM。

-AJAX是一個服務器調用執行服務器代碼。

內嵌一個PHP頁面上

-A script標籤是HTML解析,並通過瀏覽器執行時將執行客戶端所包含的代碼。

所以......你的代碼沒有執行,因爲它從來沒有被稱爲......你的AJAX調用的響應將完全

<p id="demo">Hi there</p> 
<script> 
    document.write("Yes! Hi there");  
    alert('Welcome!'); 
</script> 

PHP頁面執行,並返回到當前的頁面text/html的。

如果你想從你的javascript執行客戶端代碼,你應該在同一個.js文件或其他包含的文件中包含它,但是如果你將它包含在服務器頁面上,你需要將瀏覽器重定向到該頁面,如果你用AJAX調用它,代碼將不會執行,因爲客戶端瀏覽器不會解析它。

0

克拉西米爾Tsonev有克服所有問題的最佳解決方案。他的方法不需要使用eval,所以不存在性能和安全問題。它允許你設置innerHTML字符串包含html和js,並立即將其轉換爲DOM元素,同時還執行沿代碼存在的js部分。簡短,簡單,並且完全按照您的要求工作。 因此,在這種情況下,來自ajax的響應是根據Krasimir Tsonev轉換爲DOM對象的src字符串,然後您可以使用它執行的js部分。

var el = str2DomElement(xmlhttp.responseText); 
document.body.innerHTML = el.innerHTML; 

享受他的解決方案:

http://krasimirtsonev.com/blog/article/Convert-HTML-string-to-DOM-element

重要提示:

  1. 你需要用div標籤
  2. 你需要用的SRC字符串包裝目標元素div標記。
  3. 如果您直接編寫src字符串並且它包含js部分,請注意正確編寫關閉腳本標記(使用\ before /),因爲這是一個字符串。