2012-05-27 75 views
1

這段代碼有什麼問題或者是什麼原因導致了這個問題?它並沒有提醒你「hello」,但它正在填寫The Hello和Bye World表格。我希望它提醒「你好」。我也不知道jquery。謝謝通過AJAX調試執行Javascript

FILE1

var xmlhttp; 
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    }else{// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function(){ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    var reScript = /\<script.*?>(.*)<\/script>/mg; 
    response = xmlhttp.responseText.replace(reScript, function(m,m1) { 
    eval(m1); 
    return ""; 
    }); 
    document.getElementById("div").innerHTML=response; 
    } 
    } 
xmlhttp.open('GET','file2.php',true); 
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded'); 
xmlhttp.send(); 

FILE2

<table><tr><td>Hello World</td></tr></table> 
    <script type="text/javascript"> 
    alert('hello'); 
    </script> 
    <table><tr><td>Bye World</td></tr></table> 
+0

如果從'var reScript ='到'return「中刪除所有內容,該怎麼辦? });'? –

+0

如果我這樣做了,並且假設您希望它仍然加載,請用xmlhttp.responseText替換響應。它仍然不會運行JavaScript,因爲通過innerHTML添加的腳本不會執行。 –

+0

你對此有正面評價嗎?我所有的腳本都是直接通過HTML添加的,並且始終有效。嘗試一下,如果它不起作用,我會刪除我的答案。 –

回答

2

嘗試沒有 eval()

var xmlhttp; 
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    }else{// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function(){ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    /*var reScript = /\<script.*?>(.*)<\/script>/mg; 
    response = xmlhttp.responseText.replace(reScript, function(m,m1) { 
    eval(m1); 
    return ""; 
    });*/ 
    document.getElementById("div").innerHTML=xmlhttp.responseText; 
    } 
    } 
xmlhttp.open('GET','file2.php',true); 
//xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded'); //unnecessary for GET calls 
xmlhttp.send(null); 

Eval UIN g您的 <script...></script>以內的代碼是不必要的,JavaScript代碼一旦添加到DOM就會執行。

新編輯:

你必須消除你的reponseText換行符\n\r爲了使你的腳本是eval正確uated。此外,還有一個額外的\轉義字符在第一個<之前破壞了您的代碼。嘗試:

var xmlhttp; 
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari 
    xmlhttp=new XMLHttpRequest(); 
    }else{// code for IE6, IE5 
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
xmlhttp.onreadystatechange=function(){ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    var reScript = /<script.*?>(.*)<\/script>/mg; 
    response = xmlhttp.responseText.replace(/\n|\r/g, " ").replace(reScript, function(m,m1) { 
    eval(m1); 
    return ""; 
    }); 
    document.getElementById("div").innerHTML=response; 
    } 
    } 
xmlhttp.open('GET','file2.php',true); 
//xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded'); 
xmlhttp.send(null); 

我添加了一個.replace(/\n|\r/g, " ")由白色空間,在你responseText,以取代所有換行符,這將使你的JS得到適當的評價,並導致最終用戶沒有明顯的變化。如果您的所有JS都是正確的半冒號,您也可以用空字符串""替換空白區域" "

以上應該可以正常工作了簡單的腳本,現在如果你想在您的網頁的head JQuery的lib目錄下:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 

你的AJAX調用是簡單:

<script type="text/javascript"> 
$(document).ready(function(){ 
    $('#div').load('file2.php'); 
}); 
</script> 

JQuery自動解析你的responseText中的腳本,正如你的鏈接答案中所述。

+0

如果我這樣做了,並且假設您希望它仍然加載,請用xmlhttp.responseText替換響應。它仍然不會運行JavaScript,因爲通過innerHTML添加的腳本不會執行。 –

+0

我總是通過PHP直接執行JS,並通過將它添加到DOM,像我的應用程序中那樣使用Ajax調用。你試過了嗎? –

+0

現在試試這個代碼,我之前的例子缺少'response' var的定義。 :) –

0

試試這個:

xmlhttp.onreadystatechange=function(){ 
    if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
    var reScript = /<script.*?\>(.*)<\/script\>/mg.exec(xmlhttp.responseText)[1]; 
    var scriptElement = document.createElement('script'); 
    scriptElement.innerHTML = reScript; 
    document.body.appendChild(scriptElement); 
    } 
} 

配售代碼到一個腳本元素,然後追加該元素對身體應該導致它執行。

+0

剛剛嘗試過,劇本在那裏死去。我現在從阿賈克斯什麼都沒有。我還在document.body之前添加了一個警報。並沒有開火。 –