JavaScript sorunu?

3 Cevap php

Şimdi bir kullanıcının komut benim veritabanını günceller bir oy ama onun oy herşey benim AJAX kodu hariç düzgün çalışır hariç olmuştur kullanıcıya anlatmak için aşağıdaki aşağıdaki kodu göstermez olduğunda.

Ben kullanıcı kendi oy girdiğinde yeni bir değerlendirme görüntülemek için aşağıdaki kodu almak için bu sorunu nasıl çözebilirsiniz?

Ben PHP kullanarak ediyorum

İşte JavaScript kodudur.

	function vote(id, rating) {
		if (window.XMLHttpRequest) {
			http = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			http = new ActiveXObject("Microsoft.XMLHTTP");
		}
		var url = 'ajax.php?';
		var fullurl = url + 'id=' + id + '&rating=' + rating;
		//This will create the request to our file, with the information about the vote.
		http.open("GET", fullurl, true);
		http.send(null);
		http.onreadystatechange = statechange_rate;
	}

	function statechange_rate() {
		if (http.readyState == 4) {
			var xmlObj = http.responseXML;
			var html = xmlObj.getElementsByTagName('result').item(0).firstChild.data;
			var id = xmlObj.getElementsByTagName('result').item(0).getAttribute("id");
			var votes = xmlObj.getElementsByTagName('result').item(0).getAttribute("votes");
			var rating = xmlObj.getElementsByTagName('result').item(0).getAttribute("rating");
			//Before, you may have noticed we set votes="-1" if they had already voted, this was just to provide an easy way to check the return of our ajax.php script.
			if(votes != -1) {
				//This will inform the user about the vote they have cast.
				document.getElementsByName('output_' + id).item(0).innerHTML = "<br />" + html;
				//This will set a delay to make that message go away in 5000 miliseconds (5 seconds).
				window.setTimeout("document.getElementsByName('output_" + id + "').item(0).innerHTML = '';", 5000);
				//This will update the rating on the page to the new one.
				document.getElementsByName('rating_' + id).item(0).innerHTML = rating;
				document.getElementsByName('votes_' + id).item(0).innerHTML = votes;
			}else{
				document.getElementsByName('output_' + id).item(0).innerHTML = "<br />" + html;
				window.setTimeout("document.getElementsByName('output_" + id + "').item(0).innerHTML = '';", 5000);
			}
		}
	}

3 Cevap

Seni gösteriyor ne hiç görmedim, bu nedenle bu sorunun olup olmadığını bilmiyorum, ama <result>...</result> adında bir etiket var?

Sen benim soruya neden bu çizgi var:

xmlObj.getElementsByTagName('result')...

Eğer bu suretle sizin statechange_rate değiştirebilir eğer yararlı olacaktır:

alert("votes result: " + votes);
if(votes != -1) {
  //This will inform the user about the vote they have cast.
  var elem = document.getElementsByName('output_' + id);
  elem.item(0).innerHTML = "<br />" + html;
  //This will set a delay to make that message go away in 5000 miliseconds (5 seconds).
  window.setTimeout("document.getElementsByName('output_" + id + "').item(0).innerHTML = '';", 5000);
  //This will update the rating on the page to the new one.
  elem = document.getElementsByName('rating_' + id);
  elem.item(0).innerHTML = rating;
  elem = document.getElementsByName('votes_' + id);
  elem.item(0).innerHTML = votes;

IE8 kullanıyorsanız o zaman (ben basın F12 almak için) javascript hata ayıklayıcı getirmek ve Firefox kullanıyorsanız o zaman benim tercih yaklaşımı olan Firebug eklentisi kullanmak.

Her sonra elem = ..., bir kesme noktası koymak ve istediğiniz öğeleri alıyorsanız emin olun.

Ben ilk alert sizin sonucunda ajax çağrısından önbelleğe alma olabilir, ama sorun olabilir bekliyoruz. Tarayıcınızın yanıtı önbelleğe olmaz emin olmak gerekir, ama, ben no-cache için yanıt başlığı ayarlamak için en iyi bulduk, ama aynı zamanda benim isteği mevcut saniye + milisaniye geçmek Ben bu değeri kontrol asla, ama, orada koyarak o tekrarlanır ve böylece tarayıcı önbelleği çekti olmaz olası olsa.

Eğer herhangi bir iade öğeleri olması için kontrol edilmez olarak kullanmakta olduğunuz gerçeği getElementsByTagName, yanlış ise ilk öğesi almak çalıştığınızda, bir hata elde edilebilir. Bir listede en az birine sahip ve liste boş değil emin olmak gerekir ne zaman bir sağlamlık denetimi yapmalıdır. Eğer bir istisna atma eğer Kundakçı Güncelleştirme görünmüyor neden açıklıyor, konsolda bir hata gösterecektir.

Eğer elemanlarının kimlikleri ayarlayabilirsiniz eğer kullanmak daha iyi olurdu, jQuery kullanmak istemiyorsanız document.getElementById.

Ben ne alıyorsanız hata bilmiyorum çünkü emin olamaz ama belki siz bağlantıyı açmak ama before Gönderdiğiniz çağırdıktan sonra http.onreadystatechange = statechange_rate; ayarlamak istiyorum.

Öncelikle ben böyle PHP gelen yanıt ile "text / xml" gibi bir XML İçerik türü başlığını göndererek mı, sormak gerekir? Değilse responseXML özellik, herhangi bir içerik bulunmaz.

İşte bu kod gibi bakmak gerektiğini düşünüyorum budur: -

function vote(id, rating) { var http = getXHR() var fullurl = 'ajax.php?id=' + id + '&rating=' + rating;

if (http) { http.open("GET", fullurl, true); http.onreadystatechange = statechange_rate; http.send(null); }

function statechange_rate() { if (http.readyState == 4) { var xmlObj = http.responseXML; var result = http.responseXML.documentElement; var html = result.firstChild.data; var id = result.getAttribute("id"); var votes = result.getAttribute("votes"); var rating = result.getAttribute("rating");

elem = document.getElementById('output_' + id);

elem.innerHTML = "<br />" + html;
window.setTimeout(function() {elem.innerHTML = '';}, 5000);
if (votes != -1)
{
 document.getElementById('rating_' + id).innerHTML = rating;
 document.getElementById('votes_' + id).innerHTML = votes;
}

} } }

function getXHR() { if (window.XMLHttpRequest) { http = new XMLHttpRequest(); } else if (window.ActiveXObject) { http = new ActiveXObject("Microsoft.XMLHTTP"); } }

Notlar: -

  • Göndermek çağırmadan önce geri onreadystatechanged için çağrı Atanan
  • Ben "sonuçlar" eleman XML kök öğesi olduğunu sanıyorum.
  • Kullanım id onları bulmak için HTML elemanları ve GetElementById üzerinde bağlıyor.
  • Eğer Çıkarılan yinelenen kod