SORU
29 AĞUSTOS 2010, Pazar


JavaScript AJAX bir olay tespit

Tamam yani Kısacası bana biraz javascript bir sayfa bir şekilde verdiği bir çeşit küresel olay dinleyicisini algılayabilir ve bir şey eğer bir ajax isteği yapılır (olmadan doğrudan bir çağrı gelen çağrı), ne olursa olsun nasıl ajax çağrısı yaptı.

Eğer ajax isteği yapılıyor eğer jquery ile bunu yapmak için nasıl düşündümtarafındanbir WordPress kullanmak. İşte bu kod bir örnek

$.post(
  // requested script
  'someScript.php', 
  // data to send
  {
    'foo' : 'bar',
    'a' : 'b'
  },
  // receive response
  function(response){
    // do something
  }
); // .post

// global event listener    
$(document).ajaxSend(
  function(event,request,settings){
    alert(settings.url); // output: "someScript.php"
    alert(settings.data); // output: "foo=bar&a=b"
  }
);

Bu kod ile, diyorum nerede olursa olsun dolar.post(..), küresel olay dinleyici tetikleyecektir. Ayrıca eğer kullanırsam çalışır $.ya $.ajax (herhangi bir jquery ajax yöntemleri), (her bir özelliği, sayfa yük olarak bağlı) diyorum ne olursa olsun.

Ancak, ne js çerçeve kullanılır, ya da hiçbir çerçeve kullanılıyorsa bile bu dinleyici ne olursa olsun tetiklemek için uzatmak mümkün olmak istiyorum. Örneğin, eğer ben bu kadarayrıcabir sayfa aşağıdaki kodu (w3schools genel ajax kodu):

function loadXMLDoc()
{
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("myDiv").innerHTML=xmlhttp.responseText;
    }
  }
xmlhttp.open("GET","test.txt",true);
xmlhttp.send();
}

Ve sonra da rasgele bir bağlantı bu işlev için bir arama özelliği var, küresel ajax olay benim dinleyici olmalıdırayrıcabu isteği olarak algılar. Peki eklediğim kod sayfamı ve bağlı bir rasgele bağlantı özelliği (Evet, kodu kendisi çalışır), ama bir WordPress kullanmak "küresel olay dinleyici" kod yukarıda başarısız algılayan arayın.

Ben biraz daha araştırma yaptı ve biliyorum ben temel olarak kaydet nesnenin geçici bir nesne ve üzerine geçerli nesne ile bir "kapsayıcı" nesnesini bir arama fonksiyonu ve arama fonksiyonu geçici, ama bu gerektirir biliyorum bana öncesinde zaman orijinal nesne oluşturulan/kullanılan. Ama her zaman önceden bilemem...

Yani...bu mümkün mü? Bir şekilde ajax get/post isteği yapıldı, ne olursa olsun xyz çerçeve ile ilgili genel bir nesne veya yapılmış olup olmadığını tespit etmek var mı? Ya da sadece yinelenen kod yapmak için her çerçeve idare etmek zorundayım ve de biliyorum vaktinden ajax nesne(ler) oluşturulan/kullanılan?

düzenleme:

Bir istek oluştuğunu tespit etmek için yeterli olmadığını söylemeyi unutmuşum. Ben de veri isteği gönderiliyor yakalamak lazım. Aşağıdaki linki yorum olarak sağlanan "bir istek yapıldı, ancak" veri gönderiliyor. eğer anlamaya yardımcı olacaktır p.s. - cevap bağlantıyı sağlanan çok açık, en azından benim için neyse.

CEVAP
30 AĞUSTOS 2010, PAZARTESİ


Peki bu şimdiye kadar gelmiş nedir:

<script type='text/javascript'>
var s_ajaxListener = new Object();
s_ajaxListener.tempOpen = XMLHttpRequest.prototype.open;
s_ajaxListener.tempSend = XMLHttpRequest.prototype.send;
s_ajaxListener.callback = function () {
  // this.method :the ajax method used
  // this.url    :the url of the requested script (including query string, if any) (urlencoded) 
  // this.data   :the data sent, if any ex: foo=bar&a=b (urlencoded)
}

XMLHttpRequest.prototype.open = function(a,b) {
  if (!a) var a='';
  if (!b) var b='';
  s_ajaxListener.tempOpen.apply(this, arguments);
  s_ajaxListener.method = a;  
  s_ajaxListener.url = b;
  if (a.toLowerCase() == 'get') {
    s_ajaxListener.data = b.split('?');
    s_ajaxListener.data = s_ajaxListener.data[1];
  }
}

XMLHttpRequest.prototype.send = function(a,b) {
  if (!a) var a='';
  if (!b) var b='';
  s_ajaxListener.tempSend.apply(this, arguments);
  if(s_ajaxListener.method.toLowerCase() == 'post')s_ajaxListener.data = a;
  s_ajaxListener.callback();
}
</script>

TARİFİ:

Sadece c/sayfanıza bu p ya da dahil .js dosya ya da her neyse. Bu bir nesne s_ajaxListener oluşturun. AJAX GET veya POST isteği, s_ajaxListener.yapıldığında() geri çağırma denir, ve aşağıdaki özellikler kullanılabilir:

s_ajaxListener.yöntemAjax yöntemi. Bu da ya SONRASI olmalıdır. Değeri her zaman büyük olmayabilir, özel istek nasıl kodlandığını bağlıdır. NOT: Otomatik olarak üst gövde bilgelik bunu tartışıyor falan toLowerCase başka ayrılıyorum() bir küçük harf duyarlı karşılaştırma için.

s_ajaxListener.url: Url script (sorgu dizesi, varsa da dahil olmak üzere) (urlencoded) istedi. Verilerin nasıl gönderileceğini bağlı olarak fark var ve hangi tarayıcı/çerçeve, örneğin bu değer olarak ... ""veya ""veya" ". Burada kod çözme bilgeliği tartışmaya duyuyorum ya da başka bir şey için bırakın.

s_ajaxListener.veri: veri herhangi bir eski halinde gönderdi: foo=bar&a=b (aynı "sorun" olarak .bu url, url olarak kodlanmış)

NOTLAR:

Haliylebu IE6 uyumlu değil. bu çözüm IE6 uyumlu olmak istediğim gibi olmadı benim için yeterli. Ama diğer bir çok insan umursamıyor beri IE6, eğer IE6 umurunda olsaydı zaten sizin için çalışmak gerektiği gibi, benim çözüm sonrası için geçerli durumunda karar verdim.

Bu test ettik(ilan tarihi itibariyle): Cari Safari, Chrome, Geçerli, Geçerli FireFox, IE8, IE8 () IE 7 Uyumlu. Şu anda IE6 hemen hemen her şeyi başka XMLHttpRequest kullanırken bir ActiveX nesnesi kullanır, çünkü IE6 ile çalışmıyor.

Şu an için nasıl hiçbir fikrim yok, Peki temelde prototip/uzatmak/aşırı (?) ("Microsoft.ActiveXObject") VİSTA'DA. Bu şu anda araştırma yapıyorum...kimseyi düşünmeden biliyor mu?

Yukarıda test edilen tarayıcılardan biri altında, bu AJAX ile jquery ve prototype çerçevelerinden genel bir nesne, ve ayrıca istekleri çalışıyor. Orada diğer çerçeveler vardır biliyorum, ama IMO bu 2 önemli olanlardır. Muhtemelen MooTools, ama bunun dışında, sadece o test için sorun yok QA olabilirim.

Eğer Herkes ve diğer tarayıcılar ve/veya çerçeveler hakkında sonuçlar test yayınlayarak katkıda bulunmak istiyorsa, takdir :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • atKristaBradford

    atKristaBrad

    4 Aralık 2010
  • Bennythecoder

    Bennythecode

    25 Mart 2008
  • thegeniuses.tv

    thegeniuses.

    11 Aralık 2006