質問
php経由でテーブルに表示されたmysqlからレコードを削除し、その後ページからテーブルの行を削除するコードがあります。レコードは削除されますが、ページまたはDOMで変更はなく、即座に変更されるはずです。
DOMから削除するJavaScriptコードは次のとおりです
function deleteItem(layer, url) {
var xmlHttp=GetXmlHttpObject();
if(xmlHttp==null) {
alert("Your browser is not supported?");
}
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
if(xmlHttp.responseText == 'result=true') {
var row = document.getElementById(layer);
row.parentNode.removeChild(row);
}
} else if (xmlHttp.readyState==1 || xmlHttp.readyState=="loading") {
document.getElementById(layer).innerHTML="loading";
}
}
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
function deleteRec(layer, pk) {
url = "get_records.php?cmd=deleterec&pk="+pk+"&sid="+Math.random();
if (confirm("Confirm Delete?")) {
deleteItem(layer, url);
}
}
次のようにphpから呼び出されます:
echo '<tr id=\"article_' . $pk . '\">' . "\n";
echo '<td><a href="#" onclick="deleteRec(\'article_' . $pk .'\', \'' . $pk . '\')">DELETE</a></td>' . "\n";
$ pkはレコードの主キーです。
結果のhtmlは問題ありません(レコードが削除されているので明らかに)
<a href="#" onclick="deleteRec('article_260343387801', '260343387801')">DELETE</a>
ただし、ページは更新されません。
なぜ?
解決
私はあなたのコードをテストページに投げただけで、次のものを削除しても機能します。
document.getElementById(layer).innerHTML=xmlHttp.responseText;
行の直前の行:
} else if (xmlHttp.readyState==1 || xmlHttp.readyState=="loading") {
document.getElementById(layer).innerHTML=xmlHttp.responseText;
がエラーの原因です。
編集:
get_records.php
の「バージョン」は単なるPHPページであり、テストの目的で「result = true」をエコーするだけなので、まだ問題が発生する場合は、PHPスクリプトを使用することをお勧めします。正しいデータを削除しているときに正しい文字列が返されない-実際にxmlHttp.responseText
編集2: responseTextが認識する方法で、PHPコードが実際に 'result = true'を返すことはありません。次のものがあります:
if($cmd=="deleterec") {
mysql_query('DELETE FROM AUCTIONS WHERE ARTICLE_NO = ' . $pk);
}
正しいアイテムを削除しますが、echo 'result=true';
がないため、responseTextをチェックするifステートメントは呼び出されません。
編集3: 現在のテストコード(Firefoxでは正常に動作します[他のブラウザではテストされていません])。
<script type="text/javascript">
var xmlHttp;
function GetXmlHttpObject(){
var objXMLHttp = null;
if (window.XMLHttpRequest){
try{
objXMLHttp = new XMLHttpRequest();
}catch (e){
objXMLHttp = false;
}
}else if (window.createRequest){
try{
objXMLHttp = new window.createRequest();
}catch (e){
objXMLHttp = false;
}
}else if (window.ActiveXObject){
try {
objXMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try {
objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch (e){
objXMLHttp = false;
}
}
}
return objXMLHttp;
}
function deleteItem(layer, url) {
var xmlHttp=GetXmlHttpObject();
if(xmlHttp==null) {
alert("Your browser is not supported?");
}
xmlHttp.onreadystatechange = function() {
if(xmlHttp.readyState==4 || xmlHttp.readyState=="complete") {
console.log(xmlHttp.responseText);
if(xmlHttp.responseText == 'result=true') {
var row = document.getElementById(layer);
row.parentNode.removeChild(row);
}
//document.getElementById(layer).innerHTML=xmlHttp.responseText;
} else if (xmlHttp.readyState==1 || xmlHttp.readyState=="loading") {
//document.getElementById(layer).innerHTML="loading";
}
}
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}
function deleteRec(layer, pk) {
url = "get_records.php?cmd=deleterec&pk="+pk+"&sid="+Math.random();
if (confirm("Confirm Delete?")) {
deleteItem(layer, url);
}
}
</script>
<table>
<tr id="article_260343387801">
<td><a href="#" onclick="updateByPk()">Name</a></td>
<td><a href="#" onclick="deleteRec('article_260343387801', '260343387801')">DELETE</a>
</td>
</tr>
</table>
これは、PHPコードと組み合わせて正常に機能します(個人的なテストのためにデータベース接続/クエリをコメントアウトします)。
他のヒント
すぐには理由がわかりません:
row.parentNode.removeChild(row);
機能しません...実際にそこに着いていますか?エラー報告に問題があります:
document.getElementById(layer).innerHTML=xmlHttp.responseText;
<!>#8216; layer <!>#8217; <!> lt; tr <!> gt;であり、<!> lt; tr <!> gt;にinnerHTMLを割り当てることはできません。 IEで。代わりに、<!>#8216; Unknown runtime error <!>#8217;が表示されます。例外およびスクリプトは停止します。
(さらに、周囲に<!> lt; td <!> gt;なしで<!> lt; tr <!> gt;内にテキストを直接配置しようとした場合の動作は未定義です。