AJAXセッションが2回呼び出されました。2回目はアラートを表示しません

ライアン

ページの読み込み時に1回呼び出され、クリック後に再度呼び出されるAJAXセッションがあります。2回目はreadystateの変更がないので、関数にアラートボックスを入れてテストすることにしました。ページの読み込み時にアラートボックスが表示されます。しかし、クリックしても、PHP側が実行されても表示されません(これを取得してください)。さらに不可解なのは、readystateを測定しようとすると、表示されない(0、1、2、3、4ではない-アラートボックスも表示されない)ことと、返信テキストが表示されないことです。

私が最終的に達成しようとしているのは、xmlhttp.responseTextがページの読み込み時と同じように値を返すことです。何が足りないのですか?

JavaScript:

function ajaxSession()
{
alert();
xmlhttp = undefined;
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)
    {
	z = xmlhttp.responseText;
    }
  }
}

function stateCheck()
{
ajaxSession();
xmlhttp.open('POST', thisurl + '/favoritecheck.php',false);
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.send("0=" + perform + "&1=" + thisplace + ",&2=" + thisusername);
}


function firstCheck()
{
perform = 0;
stateCheck();
	if (z == 'found')
	{
	document.getElementById("favorite").src="http://www.********.com/images/favorite-on.png";
	document.getElementById("favtext").innerHTML="This is a favorite!";
	}
	if ( z == 'nouser')
	{
	perform = 1;
	stateCheck();
	}
}

function heartCheck()
{
perform = 2;
stateCheck();
	if (z == 'added')
	{
	document.getElementById("favorite").src="http://www.********.com/images/favorite-on.png";
	document.getElementById("favtext").innerHTML="This is a favorite!";
	}
	if (z == 'subtracted')
	{
	document.getElementById("favorite").src="http://www.********.com/images/favorite-off.png";
	document.getElementById("favtext").innerHTML="Add to your favorites.";
	}
}



if (loggedin == 1)
{
document.writeln('<img id="favorite" style="cursor: pointer;" onclick="heartCheck()" src="http://www.********.com/images/favorite-off.png" alt="Favorite" />'
+ '<br />'
+ '<div id="favtext" style="color: #D20425;">'
+ 'Add to your favorites.'
+ '</div>');
firstCheck();
} else if (loggedin == 0)
{
document.writeln('<img id="favorite" style="cursor: pointer;" src="http://www.********.com/images/favorite-off.png" alt="Favorite" />'
+ '<br />'
+ '<div id="favtext" style="color: #D20425;">'
+ '<a style="color: #800000; font-weight: bold;" href="' + thisurl + '/wp-login.php">Log in</a> to add favorites.'
+ '</div>');
}

PHP:

<?php

include('connect.php');

$salt = "********";

$perform = $_POST[0];
$place = $_POST[1];
$user = $_POST[2];
$usercrypt = crypt(md5($user),$salt);
$placeid = trim($place,",");

function checkNow()
{
global $usercrypt;
global $place;
global $conn;
$urow = mysqli_query($conn, "SELECT Users.User FROM Users WHERE Users.User='" . $usercrypt . "';");
	if (mysqli_num_rows($urow) > 0)
	{
	$favcheck = mysqli_query($conn, "SELECT Users.Favorites FROM Users WHERE Users.User='" . $usercrypt . "';");
	$favcheck = mysqli_fetch_array($favcheck);
	$favcheck = $favcheck[0];
		if (strpos($favcheck, $place) !== false)
		{
		$answer = 'found';
		}
		else
		{
		$answer = 'notfound';
		}
	}
	else
	{
	$answer = 'nouser';
	}
return array($answer,$favcheck);
unset($answer);
}
	
if ($perform == "0")
{
$sendback = checkNow();
echo $sendback[0];
unset($sendback);
}

if ($perform == "1")
{
global $usercrypt;
global $conn;
mysqli_query($conn, "INSERT INTO Users (User) VALUES ('" . $usercrypt . "')");
}

if ($perform == "2")
{
$sendback = checkNow();
global $place;
global $placeid;
global $usercrypt;
global $conn;
$currentnum = mysqli_query($conn, "SELECT Places.Favorites FROM Places WHERE Places.PlaceID=" . $placeid);
$currentnum = mysqli_fetch_array($currentnum);
$currentnum = $currentnum[0];
	if ($sendback[0] == 'found')
	{
	$currentnum--;
	$change = str_replace($place,'',$sendback[1]);
	mysqli_query($conn, "UPDATE Users SET Favorites='" . $change . "' WHERE User = '" . $usercrypt . "'");
	mysqli_query($conn, "UPDATE Places SET Places.Favorites=" . $currentnum . " WHERE Places.PlaceID =" . $placeid);
	$answer = 'subtracted';
	}
	if ($sendback[0] == 'notfound')
	{
	$currentnum++;
	$change = $sendback[1] . $place;
	mysqli_query($conn, "UPDATE Users SET Favorites='" . $change . "' WHERE User = '" . $usercrypt . "'");
	mysqli_query($conn, "UPDATE Places SET Places.Favorites=" . $currentnum . " WHERE Places.PlaceID =" . $placeid);
	$answer = 'added';
	}
return $answer;
unset($answer);
}

unset($_POST);

?>

クリス・ブレンデル

の値は、xmlhttpオブジェクトがreadystateの変更を受け取るzに評価されます。戻り値を処理するすべてのコードを関数自体に入れる必要があります。これは、非同期応答を受信した後に呼び出されることが保証されている唯一の関数だからです。onreadystatechange

あなたはこのようなことをすることができます:

var xmlhttp = false;
// The rest of your code, but remove the `onreadystatechange` assignment from ajaxSession()
// ...
// ...
function heartCheck() {
    perform = 2;
    stateCheck();
    xmlhttp.onreadystatechange = function() {
        z = xmlhttp.responseText;
        if (z == 'added')
        {
        document.getElementById("favorite").src="http://www.********.com/images/favorite-on.png";
        document.getElementById("favtext").innerHTML="This is a favorite!";
        }
        if (z == 'subtracted')
        {
        document.getElementById("favorite").src="http://www.********.com/images/favorite-off.png";
        document.getElementById("favtext").innerHTML="Add to your favorites.";
        }
    }
}

また、AJAX応答を評価するたびに、そのようなハンドラーを実行する必要があります。

また、上記のようにスクリプトの最初でグローバル変数を宣言するのが最も明確です。@ jeroenが述べているように、明示的に必須ではありませんが、これは良い習慣であり、スコープを追跡するのに役立ちます。関数z内でのみ定義されているの紛らわしいですxmlhttp.onreadystatechange、スクリプト全体でグローバルに使用しています。したがって、簡単なヒントはvar z = ''、JavaScriptの先頭に配置して、意図を明確にすることです(自分自身と、コードを表示している可能性のある他の人の両方に:))

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アプリケーションは、2回目の起動時に空白の画面を表示します(onDestroyが呼び出された後)

分類Dev

エラー/成功メッセージアラートは、jqueryでページを再度更新しないと2回目のajax呼び出しに表示されません

分類Dev

自分自身を呼び出すオプションの完了ハンドラーを使用して反復し、2回目は完了しません

分類Dev

ListSelectionListenerにアクションが起動されますが、JDialogのは2回目をクリックした後に表示されます

分類Dev

値レシーバーを持つ関数への関数ポインターであるGolangは、2回目に呼び出されたときに、変更されたレシーバーでその関数を呼び出しません

分類Dev

ajax 2回目の呼び出し:関数は関数エラーではありません

分類Dev

TextViewが2回クリックされたときにフラグメントを折りたたむ。フラグメントonClickを表示しますが、2回目のクリックでは非表示にしません

分類Dev

DatePickerのsetMinDate(...)は、2回目に呼び出されたときに機能しません

分類Dev

ネストされたリストは、コンテキストクラスへの2回目の呼び出しでクリアされます

分類Dev

なぜclickListenerがアプリをクラッシュさせるのは、2回目に呼び出したときだけなのですか?

分類Dev

LoggingFactoryは2回目の呼び出しで破棄されました

分類Dev

ASIO io_serviceは、2回目のrun()呼び出しでポストハンドラーを処理しません

分類Dev

関数の2回目の呼び出しでセグメンテーション違反が発生しましたか?

分類Dev

Ajax.BeginFormは最初は機能しますが、2回目の呼び出しからメソッドを2回呼び出します

分類Dev

Xcode:シミュレーションを最初に実行したときはユーザーの場所が表示されませんが、2回目は表示されます

分類Dev

iOSUISwitchアクションが2回呼び出されました

分類Dev

TYPO3Extbaseアクションが2回呼び出されました

分類Dev

クリックイベントリスナーによって呼び出された関数は、クリックせずに呼び出されますが、2回目の実行時にのみ呼び出されます

分類Dev

MySQLはエラーメッセージで2回目にログインできません:ユーザー 'root' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)

分類Dev

gridlayoutオプションでのデータの設定は、2回目の呼び出し後に機能しません

分類Dev

ghciの `trace`関数は2回目の呼び出しで出力されません

分類Dev

2回目の検証でMoqの呼び出しは実行されません

分類Dev

NSNotificationCenterスレッドは、削除された後でも2回目の呼び出しで中断します

分類Dev

メソッドが最初に呼び出されたか、2回目に呼び出されたかを判別しますか?

分類Dev

GetGeopositionAsync()は終了せず、2回目に呼び出されたときに完全に機能します

分類Dev

setIntervalは2回目の呼び出し後に停止しません

分類Dev

first()オペランドは、関数内での2回目の呼び出し後に公開されません

分類Dev

ReactフックuseEffect呼び出しAPIを2回目、1回目はAPI応答も返します

分類Dev

私のAPIは、2回目に呼び出されたときに応答を返します

Related 関連記事

  1. 1

    アプリケーションは、2回目の起動時に空白の画面を表示します(onDestroyが呼び出された後)

  2. 2

    エラー/成功メッセージアラートは、jqueryでページを再度更新しないと2回目のajax呼び出しに表示されません

  3. 3

    自分自身を呼び出すオプションの完了ハンドラーを使用して反復し、2回目は完了しません

  4. 4

    ListSelectionListenerにアクションが起動されますが、JDialogのは2回目をクリックした後に表示されます

  5. 5

    値レシーバーを持つ関数への関数ポインターであるGolangは、2回目に呼び出されたときに、変更されたレシーバーでその関数を呼び出しません

  6. 6

    ajax 2回目の呼び出し:関数は関数エラーではありません

  7. 7

    TextViewが2回クリックされたときにフラグメントを折りたたむ。フラグメントonClickを表示しますが、2回目のクリックでは非表示にしません

  8. 8

    DatePickerのsetMinDate(...)は、2回目に呼び出されたときに機能しません

  9. 9

    ネストされたリストは、コンテキストクラスへの2回目の呼び出しでクリアされます

  10. 10

    なぜclickListenerがアプリをクラッシュさせるのは、2回目に呼び出したときだけなのですか?

  11. 11

    LoggingFactoryは2回目の呼び出しで破棄されました

  12. 12

    ASIO io_serviceは、2回目のrun()呼び出しでポストハンドラーを処理しません

  13. 13

    関数の2回目の呼び出しでセグメンテーション違反が発生しましたか?

  14. 14

    Ajax.BeginFormは最初は機能しますが、2回目の呼び出しからメソッドを2回呼び出します

  15. 15

    Xcode:シミュレーションを最初に実行したときはユーザーの場所が表示されませんが、2回目は表示されます

  16. 16

    iOSUISwitchアクションが2回呼び出されました

  17. 17

    TYPO3Extbaseアクションが2回呼び出されました

  18. 18

    クリックイベントリスナーによって呼び出された関数は、クリックせずに呼び出されますが、2回目の実行時にのみ呼び出されます

  19. 19

    MySQLはエラーメッセージで2回目にログインできません:ユーザー 'root' @ 'localhost'のアクセスが拒否されました(パスワードを使用:YES)

  20. 20

    gridlayoutオプションでのデータの設定は、2回目の呼び出し後に機能しません

  21. 21

    ghciの `trace`関数は2回目の呼び出しで出力されません

  22. 22

    2回目の検証でMoqの呼び出しは実行されません

  23. 23

    NSNotificationCenterスレッドは、削除された後でも2回目の呼び出しで中断します

  24. 24

    メソッドが最初に呼び出されたか、2回目に呼び出されたかを判別しますか?

  25. 25

    GetGeopositionAsync()は終了せず、2回目に呼び出されたときに完全に機能します

  26. 26

    setIntervalは2回目の呼び出し後に停止しません

  27. 27

    first()オペランドは、関数内での2回目の呼び出し後に公開されません

  28. 28

    ReactフックuseEffect呼び出しAPIを2回目、1回目はAPI応答も返します

  29. 29

    私のAPIは、2回目に呼び出されたときに応答を返します

ホットタグ

アーカイブ