Karsten: jquery/ajax

Hallo liebe Selfhtmler,

nach langem Suchen kann ich folgendes Problem leider trotzdem nicht lösen:

Es soll von einem Standardhandler (.ashx) Daten angeholt werden (jsonp weil Cross-Domain). Das klappt, jedoch nur verzögert weil jsonp nur asyncron arbeitet. Beispiel:

  
  
function loginCheck(suser, sSession)  
{  
	var result = 0;  
	actUser = suser;  
	$.ajax({  
		type: "POST",  
		url: lServiceUrl,  
		data: "function=logincheck&user=" + suser + "&session=" + sSession,  
		dataType: "jsonp",  
		jsonp: "jsonp_callback",  
		success: function(respData) {  
			loginCheckHandler(respData.result);  
		},  
		error: function() {  
			getContent('login',0);  
		}  
	});  
}  
  
function loginCheckHandler(result)  
{  
	switch (result)  
	{  
		case 0:  
		{  
			deleteCookies();  
			getContent("login", 0);  
			break;  
		}  
		case 1:  
		{  
			if (actContent != null)  
			{  
				getContent(actContent, 0);  
			}  
			else  
			{  
				deleteCookies();  
				getContent("login", 0);  
			}  
			break;  
		}  
		default:  
		{  
			deleteCookies();  
			getContent("login", 0);  
			break;  
		}  
	}  
  
}  
  

im "restlichem" Code muss ich nun warten bis die Antwort da ist (loginCheck(..) auf jeder weiteren "Unter"-Seite). Da habe ich die Doku nicht verstanden. Wie mache ich dass? (getContent() ruft den jeweiligen Seiteninhalt ab)

DANKE!

  1. Hi,

    Es soll von einem Standardhandler (.ashx) Daten angeholt werden (jsonp weil Cross-Domain). Das klappt, jedoch nur verzögert weil jsonp nur asyncron arbeitet. Beispiel:

    function loginCheck(suser, sSession)
    {
    var result = 0;
    actUser = suser;
    $.ajax({
    type: "POST",
    url: lServiceUrl,
    data: "function=logincheck&user=" + suser + "&session=" + sSession,
    dataType: "jsonp",
    jsonp: "jsonp_callback",
    success: function(respData) {
    loginCheckHandler(respData.result);
    },
    error: function() {
    getContent('login',0);
    }
    });
    }

    
    >   
    > im "restlichem" Code muss ich nun warten bis die Antwort da ist (loginCheck(..) auf jeder weiteren "Unter"-Seite). Da habe ich die Doku nicht verstanden. Wie mache ich dass? (getContent() ruft den jeweiligen Seiteninhalt ab)  
      
    Wie machst du was?  
    Oder anders gefragt: weißt du, was JSONP überhaupt macht? Und dass die success- und error-Handler, welche du jQuery übergibst, gar nicht aufgerufen werden?  
      
    Damit du einen Anhaltspunkt hast: JSONP bedeutet, dass in dein Document ein script-Element eingefügt wird, dessen Quelle die von dir angegebene URL ist.  
    Aus diesem Grund kannst du auch keinen POST-Request machen, da externe Ressourcen \_nur\_ per GET aufgerufen werden können (bzw: das POST wird ignoriert).  
    Der Server bettet die Daten, welche du empfangen willst, in einen Funktionsaufruf ein. Die aufzurufende Funktion definiert sich üblicherweise durch einen entsprechenden GET-Parameter, bei dir dann wohl der Parameter "function".  
      
    D.h.: der (Remote-)Server liefert eine JS-Ressource zurück, welche etwa so aussieht:  
    `logincheck(/* hier die Daten des Servers */);`{:.language-javascript}  
      
    Weil die neue Ressource angefordert werden muss, muss das ganze auch asynchron ablaufen.  
    Weil jQuery (und das ist kein spezieller Mangel an jQuery, sondern einfach nicht anders möglich mit JSONP) keine Fehler für den Request, welcher durch das Einfügen des Script-Elements entsteht, erhält, ruft es auch deine success- und error-Handler nicht auf.  
      
    Bis die Tage,  
    Matti
    
    -- 
    [Webapplikationen in C++ entwickeln](http://tntnet.org/)
    
    1. Hi,

      Es soll von einem Standardhandler (.ashx) Daten angeholt werden (jsonp weil Cross-Domain). Das klappt, jedoch nur verzögert weil jsonp nur asyncron arbeitet. Beispiel:

      function loginCheck(suser, sSession)
      {
      var result = 0;
      actUser = suser;
      $.ajax({
      type: "POST",
      url: lServiceUrl,
      data: "function=logincheck&user=" + suser + "&session=" + sSession,
      dataType: "jsonp",
      jsonp: "jsonp_callback",
      success: function(respData) {
      loginCheckHandler(respData.result);
      },
      error: function() {
      getContent('login',0);
      }
      });
      }

      
      > >   
      > > im "restlichem" Code muss ich nun warten bis die Antwort da ist (loginCheck(..) auf jeder weiteren "Unter"-Seite). Da habe ich die Doku nicht verstanden. Wie mache ich dass? (getContent() ruft den jeweiligen Seiteninhalt ab)  
      >   
      > Wie machst du was?  
      > Oder anders gefragt: weißt du, was JSONP überhaupt macht? Und dass die success- und error-Handler, welche du jQuery übergibst, gar nicht aufgerufen werden?  
      >   
      > Damit du einen Anhaltspunkt hast: JSONP bedeutet, dass in dein Document ein script-Element eingefügt wird, dessen Quelle die von dir angegebene URL ist.  
      > Aus diesem Grund kannst du auch keinen POST-Request machen, da externe Ressourcen \_nur\_ per GET aufgerufen werden können (bzw: das POST wird ignoriert).  
      > Der Server bettet die Daten, welche du empfangen willst, in einen Funktionsaufruf ein. Die aufzurufende Funktion definiert sich üblicherweise durch einen entsprechenden GET-Parameter, bei dir dann wohl der Parameter "function".  
      >   
      > D.h.: der (Remote-)Server liefert eine JS-Ressource zurück, welche etwa so aussieht:  
      > `logincheck(/* hier die Daten des Servers */);`{:.language-javascript}  
      >   
      > Weil die neue Ressource angefordert werden muss, muss das ganze auch asynchron ablaufen.  
      > Weil jQuery (und das ist kein spezieller Mangel an jQuery, sondern einfach nicht anders möglich mit JSONP) keine Fehler für den Request, welcher durch das Einfügen des Script-Elements entsteht, erhält, ruft es auch deine success- und error-Handler nicht auf.  
      >   
      > Bis die Tage,  
      > Matti  
        
      Hallo Matti,  
        
      vielen Dank für die Antwort. Mit dem "POST" hast Du recht, selbstverständlich muss es ein "GET" sein. SUCCESS wird tatsächlich aufgerufen, ich dann die Daten aus der Antwort (respData) entnehmen die, wie Du richtig gesagt hast mit einem Scriptobjekt  
        
      (Beispiel:` jQuery162019893751350310107_1315373137082({"result":"1"})));`{:.language-javascript}  
        
      bereitgestellt werden. Soweit war mir das auch klar. Leider lag mein Fehler ganz wo anders, wie immer hätte man durch hinschauen das Problem lösen können, leider sieht man manchmal den Wald vor lauter Bäumen nicht. Der Rückgabewert der Callback-Funktion ist vom Typ String, ich habe das als int behandelt. deshalb lief der loginCheckHandler im switch immer auf default:. Das habe ich nun geändert, jetzt funktioniert das ganze.  
        
      Liebe Grüße  
        
      Karsten