Handbuch:Ajax

From mediawiki.org
This page is a translated version of the page Manual:Ajax and the translation is 87% complete.
Outdated translations are marked like this.

Ajax ist ein Begriff fĂŒr die Nutzung von JavaScript, um bei Bedarf Teile einer Seite zu laden. Daher sollte JavaScript-Code stattdessen jQuery.ajax() (oder das JavaScript-Modul mediawiki.api) nutzen. Eine MediaWiki-API-Abfrage wĂŒrde ĂŒber AJAX ausgefĂŒhrt werden (statt $ajax).

MediaWiki bietet eine veraltete Ajax-OberflÀche zur Nutzung durch Erweiterungen an. See action=ajax . MediaWiki 1.16 enthÀlt $jquery, weshalb von der Nutzung von Sajax abgeraten wird.

Details

Asynchrone Abfragen

Eine asynchrone Abfrage sendet einige Daten an den Server und fĂ€hrt mit der AusfĂŒhrung fort. Etwas spĂ€ter kann der Server eine Antwort geben (abhĂ€ngig vom Typ der Abfrage); In diesem Fall wird die Antwort zur Verarbeitung an eine JavaScript-Funktion ĂŒbergeben. Es kann eine andere Funktion bereitgestellt werden, um mit dem Fall umzugehen, dass die Abfrage aus irgendeinem Grund scheitert. Unten findet sich ein Beispiel-Anruf an die Anmelde-API mit Übergabe des Benutzernamens und des Passwortes.

mw.loader.using( 'mediawiki.api', function () {
	( new mw.Api() ).get( {
		action: 'query',
		lgname: 'foo',
		lgpassword: 'foobar'
	} ).done( function ( data ) {
		alert( data );
	} );
} );

Alternativ kannst du die Funktionen von jQuery direkt nutzen:

$.ajax({
        // request type ( GET or POST )
	type: "GET",
        
        // the URL to which the request is sent
	url: mw.util.wikiScript('api'),
        
        // data to be sent to the server
	data: { action:'query', format:'json', lgname:'foo', lgpassword:'foobar' },
        
        // The type of data that you're expecting back from the server
	dataType: 'json',
        
        // Function to be called if the request succeeds
	success: function( jsondata ){
		alert( jsondata.result );
	}
});

Die Funktion "mw.util.wikiScript" ist ab 1.18 verfĂŒgbar.

Synchrone Abfragen

Die andere Art von Abfragen sendet einige Daten an die Server und wartet auf die Antwort. Dies bedeutet, dass das JavaScript geblockt wird, bis die Server Daten zurĂŒckgeben oder die Abfrage aus irgendeinem Grund scheitert. Das folgende Beispiel ruft die Liste "Links auf diese Seite" einer Vorlage ab:

whatLinksHere = JSON.parse(
    $.ajax({
        url:mw.util.wikiScript('api'),
        data: { action: 'query', format: 'json', list: 'embeddedin', eititle: 'Template:' + templateName, eilimit: 500 },
        async: false
    })
    .responseText
);

// ... usage ...
for (i=0; i<whatLinksHere.query.embeddedin.length; i+=1) {
    alert(whatLinksHere.query.embeddedin[i]);
}

(JSON.parse() ist eine Standard-JavaScript-Funktion, die ein Objekt aus seiner Zeichenketten-Darstellung im JSON-Format ausgibt.)

BeschrÀnkungen

Aufgrund der Same-Origin-Policy ist es fĂŒr ein Skript einer externen Seite schwierig, Daten aus einem Wiki abzurufen, das sich unter einer anderen Domain befindet — zum Beispiel kann man nicht direkt Daten aus https://en.wikipedia.org/wiki/ in http://example.org/wiki/ abrufen. Neuere Browser unterstĂŒtzen eine ausdrĂŒckliche Anweisung, um diesen Zugriff ĂŒber Cross-Origin Resource Sharing zu erlauben, was jedoch nur funktioniert, wenn die Server so konfiguriert wurden, dass sie mit den entsprechenden Headern umgehen und der Nutzer einen aktuellen Browser verwendet, der diese erkennt. Entwickler, die sich Zweifel ĂŒber Vorab-Versionen haben, können sich noch nicht auf CORS verlassen.

Es ist möglich, die Same-Origin-Policy zu umgehen, indem man JSONP statt reinem JSON nutzt, was in Àlteren Browsern funktionieren wird (darunter Internet Explorer 6).

$.ajax({
    url: '//www.mediawiki.org/w/api.php?format=jsonty&action=query&meta=siteinfo&siprop=general&callback=?',
    data: {
        format: 'json'
    },
    dataType: 'jsonp'
}).done( function ( data ) {
    ...
} );

Verwandte veraltete FunktionalitÀten

Sajax ist eine alte Ajax-Bibliothek, die (Stand September 2012) noch Teil des Kern-Codes ist und die von manchen Erweiterungen genutzt wird. Nutze sie nicht, sondern verwende stattdessen jQuery.ajax(). Manche Erweiterungen, ob sie Sajax nutzen oder nicht, stellen Ajax-Anrufe ĂŒber den obsoleten AjaxDispatcher (siehe $wgAjaxExportList), indem sie index.php?action=ajax&rs=something... aufrufen. Sie sollten stattdessen MediaWiki-API -Abfragen an API-Module api.php?action=irgendetwas stellen.

Siehe auch

Weblinks

Allgemeine Informationen zu XMLHttpRequest: