2017-01-27 7 views
0

サーバー上にカウンターがあるファイルがあります。 リンクをクリックすると、ファイル内のカウンタをインクリメントするphpファイルにajaxリクエストを送信します。問題は、ファイルが作成されたが、カウンタがインクリメントされていないことです。ファイル内のカウンターがインクリメントされません

ajaxファイルを直接実行すると、カウンタがインクリメントされます。 このエフェクトがなぜ発生するのか分かりますか?

リンク:

<p><a onclick="incCounter('TL1');" href="index.html">Dies ist Testlink1</a></p> 
<p><a onclick="incCounter('TL2');" href="index.html">Dies ist Testlink2</a></p> 

AJAXリクエスト:

function incCounter(element) 
    {  
    xhr = new XMLHttpRequest(); 
    xhr.open("GET","incCounter.php?e="+element,true); 
    xhr.send(); 
    } 

Ajaxのファイル:

$element = $_GET["e"]; 
    //$element = "testdatei"; 
    $filename = "clickcounter\\".$element.".txt"; 
    $counter = 1; 

    if(file_exists($filename)) 
    { 
    //counter holen und inkrementieren 
    $file = fopen($filename,"r"); 
    $counter = fgets($file); 
    $counter++; 
    fclose($file); 
    } 

    //datei ggfs. leeren und neuen counter schreiben 
    $file = fopen($filename,"w"); 
    fwrite($file,$counter); 
    fclose($file) 

質問編集: わかりました...これは何? ajaxリクエストにalert("test");を追加して、リンクをクリックするたびに関数が実行されるようにしました。今それは動作します。カウンターが増分されるたびにリンクをクリックします。しかし今は毎回アラートが表示されます。この行を削除すると、もう動作しません。誰もそれを理解していますか?

+2

リンクをクリックしていて、JavaScriptによるデフォルトの動作(リンクに続く)を妨げていないからです。このアラートは、時間をかけてAjaxの仕事を一時的に許可しません。ハイパーリンクにイベントハンドラを追加し、 'event.preventDefault();'をそれに置く必要があります。 – icecub

+1

たとえば、IDを「..」に追加してから、Javascriptで次のようにします: 'document.getElementById(" link1 ")。addEventListener(" click "、function(event){event.preventDefault();});' – icecub

+0

あ、そう。ありがとうございました。私はそれを知らなかった。私は、デフォルトの振る舞いを妨げることについて考えています。JavaScriptのリンクのhref属性を自分のajaxファイルに渡して、そのページにヘッダ( "Location:...")を付けて転送します。しかし、それが良い練習になるかどうかは本当に分かりません。それを達成するよりスマートな方法はありますか? –

答えて

1

ハイパーリンクをクリックすると、ブラウザのデフォルトの動作は新しいページへのハイパーリンクに続きます。そのため、あなたのAjaxはリクエストを完了できません。これを修正するには、デフォルトの動作を防止する必要があります。

<p><a class="incCounter" onclick="incCounter('TL1');" href="#">Dies ist Testlink1</a></p> 
<p><a class="incCounter" onclick="incCounter('TL2','index.html');" href="#">Dies ist Testlink2</a></p> 

JS:

/* Get the hyperlinks */ 
var counterLinks = document.getElementsByClassName('incCounter'); 

/* Add event listener to each hyperlink */ 
for (var i = 0; i < counterLinks.length; i++) { 
    counterLinks[i].addEventListener("click", function(event){ 
     event.preventDefault(); 
    }); 
} 

function incCounter(element, url = ''){  
    xhr = new XMLHttpRequest(); 
    xhr.open("GET","incCounter.php?e="+element,true); 
    xhr.send(); 

    if(url != ''){ 
     window.location.href = url; 
    } 
} 

あなたが見ることができるように、あなたはAjaxが送信された後に、別のウェブサイトやページを閲覧しますあなたの関数の2番目のパラメータを渡すことができますこれは、トリックを行います。これはオプションです。

+0

これは直接動作しませんでした。私がwindow.location.hrefを使用したとき、前と同じような効果がありました。 xhr.onreadystatechange = function() { if(xhr.readyState == 4 && xhr.status == 200) { var result = xhr.responseText; if(url!= '') { window.location.href = url; } } } '私は自分のajaxファイルから真実を返します。迅速で詳細なヘルプをありがとうございます! –

+0

@ Mr.K.O.Rollingはい、もちろんです。申し訳ありませんが、私はその日の週末を予定していました。あなたはそれを考え出してうれしいよ:) – icecub

関連する問題