5

私はドロップダウン選択リストとonclickイベントを挿入したボタンを持っているので、誰かがそのボタンをクリックすると、基本的にajaxを含む関数が呼び出され、実行時にphpファイルが含まれます。私のphpファイルでは、選択したドロップダウンリストから値を取得しています。その後、アラートオプションが表示されますが、アラートは表示されません。

以下は私のコードです: -

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

どんな助けでも大歓迎です。事前にあなたの助けに感謝します:)

4

9 に答える 9

1

したがって、クリスがすでに指摘したように、説明した AJAX 呼び出しを使用してテキストを返す場合、次のように DOM 更新を使用してページにそれを配置できます。

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

それはうまくいきます。ただし、responseText に JavaScript が含まれている場合は、ドキュメントに投稿されるだけです。ページの読み込みは既に完了しているため、実行されません。

ただし、AJAX 呼び出しの結果として 2 つの動作が必要になるようです。ユーザー データの本体を txtHint div に投稿するだけでなく、アラート ポップアップも表示する必要があります。これを行うには、アラートのコードを onreadystatechange 関数の txtHint div にポストするポイントの後に配置します。

あなたの質問からは、アラートを制御するロジックが明確ではありません。選択のいくつかの選択肢に対して「Hello」、他の選択肢に対して「いいえ」とアラートに伝えたい場合は、選択入力をテストするだけです。

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

代わりに、アラートの内容が AJAX 呼び出しが返す内容に依存する必要がある場合は、代わりに xmlhttp.responseText に基づく他のロジックを使用します。おそらく、user.php が送り返す応答にアラートの本文を書き込むことさえあるでしょう。次に、responseText からそれを解析し、それをアラートで使用し、それを取り除き、残りを使用して txtHint のコンテンツを設定できます。

于 2013-03-18T04:35:23.047 に答える
0

ページに動的に追加する「script」タグが解析されて実行されるとは思いません。ただし、user.phpから答え(yes / no)を含むjsonオブジェクトを返すこともできます。そして、コールバックに何を表示するかを決めることはできませんonreadystatechanged。または、「yes」/「no」を返し、次のようにします。

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

そしてあなたのメインページで:

if(xmlhttp.responseText === "yes"){
 alert("Hello");
}
else{
 alert("No");
}
于 2013-03-16T08:48:11.100 に答える
0

試す

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

=== と == を入れ替える

于 2013-03-19T15:44:57.967 に答える
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);
            }
        }
    }

このようにして、非同期に追加されたすべてのスクリプトが評価されます。

于 2013-03-20T15:08:11.533 に答える
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>
于 2013-03-21T11:10:58.980 に答える
0

Fiddler を実行して、サーバー間で行われているトラフィック/出力を確認してください。それは、user.php の出力が何であるかについての洞察を与えるでしょうか? これはデバッグに役立ちます。

于 2013-03-27T18:02:41.047 に答える
0

showUser(this.options[this.selectedIndex].value)の代わりに使用showUser(this.value)

編集:

だから$q=$_GET["q"];に変更$q=intval($_GET["q"]);

于 2013-03-16T09:44:54.363 に答える
0

AJAX 呼び出しから受け取った HTML を本文に挿入してみてください。

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

明らかにこれが機能する場合は、追加するデータがあることを確認する必要があります。そうしないと、エラーが発生する可能性があります。

AJAX 経由で取得する PHP スニペット ファイルでスクリプトをよく使用しますが、スクリプトを何かに追加するまで機能しないことがわかりました。タグのみを返す PHP ファイルを試したことはありませんが、理論的には同じように動作するはずです。script

編集: jQuery を使用していないことに気付いたときに、コード例を Javascript に変更しました。実際、長い間jQueryなしでこれを行っていないので、うまくいくかどうかは完全にはわかりませんが、とにかく試してみてください. appendChild()を使用するとinnerHTML、異なる結果が得られると思います。

もう一度編集: 繰り返しますが、現在はできないため、これをテストしていませんが、おそらくxmlhttp.responseTexta でラップするとうまくいくdocument.createDocumentFragment()かもしれません:

var frag = document.createDocumentFragment();
frag.innerHTML = xmlhttp.responseText;
document.getElementsByTagName('body')[0].appendChild(frag);
于 2013-03-16T09:04:58.153 に答える
0

残念ながら、既に説明したように、単に innerHTML を使用してスクリプトを追加することはできません。最善の策は、DOM API を非常に簡単に処理する jQuery などの DOM ハンドラーを使用することです。必要なことを行うためのより良い方法は、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>");

〜乾杯〜

于 2013-04-01T21:56:20.450 に答える