2013-03-16 47 views
5

我有一個下拉選擇列表和一個按鈕,其中我插入了一個onclick事件,以便每當有人點擊該按鈕時它將調用一個基本包含一個Ajax和執行它時將包括一個PHP文件。在我的php文件中,它將從選定的下拉列表中獲取值,然後它將顯示一個警報選項,但它不顯示任何警報。當在ajax中包含php文件時,Javascript不起作用

下面是我的代碼: -

<html> 
<head> 
<script> 
function showUser(str) 
{ 
if (str=="") 
    { 
    document.getElementById("txtHint").innerHTML=""; 
    return; 
    } 
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) 
    { 
    document.getElementById("txtHint").innerHTML=xmlhttp.responseText; 
    } 
    } 
xmlhttp.open("GET","user.php?q="+str,true); 
xmlhttp.send(); 
} 
</script> 
</head> 
<body> 

<form> 
<select name="users1" onchange="showUser(this.value)"> 
<option value="">Select a person:</option> 
<option value="1">Peter Griffin</option> 
<option value="2">Lois Griffin</option> 
<option value="3">Glenn Quagmire</option> 
<option value="4">Joseph Swanson</option> 
</select> 
</form> 
<br> 
<div id="txtHint"><b>Person info will be listed here.</b></div> 

</body> 
</html> 

user.php的

<?php 
$q=$_GET["q"]; 
if($q ==1) 
{ 
    echo '<script type="text/javascript"> 
    alert("Hello") 
    </script>'; 
} 
else { 
    echo "No"; 
} 
?> 

任何幫助將是非常讚賞,並感謝您的幫助提前:)

+0

你能看到' user.php?q = 1'在地址欄中? – Amir 2013-03-16 09:16:56

+0

不,我無法在我的地址欄中看到它bcoz user.php通過ajax加載,這就是爲什麼頁面不刷新 – 2013-03-16 09:19:07

+2

請參閱http://stackoverflow.com/questions/2067472/what-is-jsonp-all上的第二個答案 - 大概 - 它解釋了你需要做的一切。 – 2013-03-16 09:21:46

回答

0

我不認爲您動態添加到頁面的「腳本」標籤將被解析並執行。但是你可以從你的user.php中返回一個json對象,包括你的答案(是/否)。然後,您無法決定在onreadystatechanged回撥中顯示的內容。或者只是返回「是」 /「否」,這樣做:

<?php 
$q=$_GET["q"]; 
if($q ==1) 
{ 
    echo "Yes"; 
} 
else { 
    echo "No"; 
} 
?> 

,並在您的主頁:

if(xmlhttp.responseText === "yes"){ 
alert("Hello"); 
} 
else{ 
alert("No"); 
} 
+0

在用戶頁面中獲取的值是什麼? – 2013-03-16 08:49:39

+0

我編輯了問題 – Chris 2013-03-16 09:09:33

+1

現在,我所做的是包括如果(xmlhttp。responseText ===「yes」){ alert(「Hello」); } else { alert(「No」); }在我的showusr函數中,然後每當我點擊任何選項時,它顯示的警報值爲「否」。 – 2013-03-16 09:17:36

0

嘗試插入你從AJAX調用進入人體接收HTML。

document.getElementsByTagName('body')[0].appendChild(xmlhttp.responseText); 

顯然,如果這個工程,你將需要確保有數據追加,否則你可能會得到一個錯誤。

我經常在通過AJAX檢索的PHP代碼片段文件中使用腳本,並且我發現它們在我將它們追加到某個東西之前永遠不會工作。我從來沒有嘗試過一個PHP文件,該文件只返回 a script標記,但理論上它應該工作相同。

編輯:當我意識到您沒有使用jQuery時,將代碼示例更改爲Javascript。其實我沒有很久沒有jQuery這樣做,所以我不完全確定它會工作,但無論如何試一試。我想也許使用appendChild()innerHTML會給出不同的結果。

再次編輯:同樣,我沒有,因爲我目前還無法測試了這一點,但也許包裹xmlhttp.responseTextdocument.createDocumentFragment()可能的工作:

var frag = document.createDocumentFragment(); 
frag.innerHTML = xmlhttp.responseText; 
document.getElementsByTagName('body')[0].appendChild(frag); 
+1

我猜-1意味着這不起作用。爲自己提出建議而不嘗試的道歉。當我意識到jQuery沒有被使用時,我應該刪除而不是編輯。我知道SE上的匿名downvotes是好的,我認爲這是一件好事,但這並不是我第一次對這個原因感到困惑。說真的,我想要做得更好 - 如果你沒有說明你爲什麼低落,那麼我應該如何糾正問題所在? – 2013-03-18 03:10:07

+0

我真的很感激你的時間和幫助我的答案。它不適合我,但我不是那個已經爲你的答案做了-1的人。說實話,我從來沒有對任何答案做過-1直到現在,我認爲給別人一個意見真的很重要。至少你嘗試過一些東西是很好的。非常感謝很多兄弟:)) – 2013-03-18 05:56:03

+1

對不起,我不是故意發出sn,聲,而且我當然也不想指責。剛剛對系統感到沮喪:-) – 2013-03-20 09:31:49

0

使用showUser(this.options[this.selectedIndex].value)而不是showUser(this.value)

編輯:

因此改變$q=$_GET["q"];$q=intval($_GET["q"]);

+0

但它仍然顯示我同樣的東西 – 2013-03-16 09:50:24

1

所以,克里斯已經指出的那樣,如果你使用了AJAX叫你描述返回一些文字,你可以把你的網頁與DOM的更新,如您有:

document.getElementById("txtHint").innerHTML=xmlhttp.responseText; 

這一工程。但是,如果你的responseText包含javascript,它只會被髮布到文檔中。你的頁面已經完成加載,所以會執行而不是

但是,您顯然希望您的AJAX調用產生兩種行爲。除了將用戶數據主體發佈到txtHint div之外,您還希望彈出警報。要做到這一點,你可以將警報的代碼放入你的onreadystatechange函數,在發佈到你的txtHint div之後。

從您的問題中不清楚您想要控制警報的邏輯。如果你想提醒說「你好」,爲選擇的一些選擇和「否」的其他選擇,那麼你可以測試你的選擇輸入:

if (str=="1") alert("Hello"); 
else   alert("No"); 

相反,如果你的警報的內容應取決於關於你的AJAX調用返回的內容,那麼你應該有一些基於xmlhttp.responseText的其他邏輯。也許你甚至會將alert的正文寫入user.php發回的響應中。然後,您可以將其解析出responseText,在警報中使用它,將其除去,然後使用其餘部分設置txtHint的內容。

0

嘗試

if(xmlhttp.responseText == "yes"){ 
alert("Hello"); 
    } 
else{ 
alert("No"); 
} 

交換===與==

+0

「abc」== new String(「abc」)// true 「abc」=== new String(「abc」) // false – 2013-03-19 15:46:42

0

的問題是,與innerHTML的= ...添加腳本沒有腳本添加到DOM,但不自動評估(執行)劇本。 更改此:

if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById("txtHint").innerHTML=xmlhttp.responseText; 
    } 

這樣:

if (xmlhttp.readyState==4 && xmlhttp.status==200) 
    { 
     document.getElementById("txtHint").innerHTML=xmlhttp.responseText; 
     var myScripts = document.getElementById("txtHint").getElementsByTagName("script"); 
     if(myScripts.length > 0) 
     { 
      for(i=0; i < myScripts.length;i++) 
      { 
       eval(myScripts[i].innerHTML); 
      } 
     } 
    } 

這樣,所有的異步的添加腳本將得到評估。

0
<html> 
<head> 
<script> 
function showUser(str) 
{ 
if (str=="") 
    { 
    document.getElementById("txtHint").innerHTML="<b>Person info will be listed here.</b>"; 
    return; 
} 

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) 
    { 
    document.getElementById("txtHint").innerHTML=xmlhttp.responseText; 

    //////////// YOU CAN ADD THIS!/////////////////// 
    if (str=="1"){alert('hello');} 
    //////////////////////////////////////////////// 

    } 
    } 
xmlhttp.open("GET","user.php?q="+str,true); 
xmlhttp.send(); 

} 
</script> 
</head> 
<body> 

<form> 
<select name="users1" onchange="showUser(this.value)"> 
<option value="">Select a person:</option> 
<option value="1">Peter Griffin</option> 
<option value="2">Lois Griffin</option> 
<option value="3">Glenn Quagmire</option> 
<option value="4">Joseph Swanson</option> 
</select> 
</form> 
<br> 
<div id="txtHint"><b>Person info will be listed here.</b></div> 

</body> 
</html> 
0

試着讓Fiddler運行以查看服務器之間的流量/輸出是什麼。這將深入瞭解user.php的輸出是什麼?這可以幫助調試。

0

不幸的是,您不能簡單地使用innerHTML來追加腳本,因爲它已經被告知。 最好的辦法是使用一些DOM處理程序,如jQuery,它非常容易處理DOM API。 更好的方法做,你需要將通過編寫一些JavaScript什麼:

var jsTag = document.createElement('script'); 
var jsCode = "alert('this came from PHP or whatever you have on server side');"; 
jsCode = document.createTextNode(jsCode); 
jsTag.appendChild(jsCode); 
document.body.appendChild(jsTag); 

,或者用jQuery它會是這樣的:

$('body').append("<script>alert('this came from PHP or whatever you have on server side');</script>"); 

〜歡呼〜

相關問題