Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Internet Explorer/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
/* Framework für Remote Procedure Calls in JavaScript, Dokumentation unter [[Benutzer:Schnark/js/rpc]] <nowiki>
Beispiel:

Datei mit Definitionen

mw.libs.rpc.define('eineFunktion', function (param1, param2) {
	//...
	return mw.libs.rpc.ret(rueckgabe); //oder direkt ein $.Deferred().promise()
});

Aufrufendes Skript

mw.libs.rpc.register('eineFunktion', 'URL oder Seitenname jener Datei von oben');

var eineFunktion = mw.libs.rpc.stub('eineFunktion');

eineFunktion(1, 2).then(function (ergebnis) {
	//...
}, function () {
	//da ging etwas schief
});

//oder direkt

mw.libs.rpc.call('eineFunktion', 1, 2).then(function (ergebnis) {
});

mw.libs.rpc.exists('eineFunktion') //hoffentlich true

mw.libs.rpc.preload('eineFunktion'); //falls wir sicher sind, dass wir sie brauchen und die Datei gleich laden wollen

*/
/*global mediaWiki*/

(function ($, mw, libs) {
"use strict";
var queue = {}, functions = {}, loadedFiles = {}, slice = Array.prototype.slice;

function register (f, url) {
	if (f in functions) {
		return false;
	}
	functions[f] = url;
	return true;
}

function load (url) {
	if (!(/(https?:)?\/\//).test(url)) {
		url = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' +
			encodeURIComponent(url.replace(/ /g, '_')).replace(/%2F/ig, '/').replace(/%3A/ig, ':') +
			'&action=raw&ctype=text/javascript';
	}
	if (loadedFiles[url]) {
		return;
	}
	mw.loader.load(url);
	loadedFiles[url] = true;
}

function preload (f) {
	if (!(f in functions)) {
		return false;
	}
	if (typeof functions[f] === 'string') {
		load(functions[f]);
	}
	return true;
}

function define (f, ff) {
	if (typeof functions[f] === 'function') {
		return false;
	}
	functions[f] = ff;
	runQueue(f);
	return true;
}

function exists (f) {
	return f in functions;
}

function ret (r) {
	return $.Deferred().resolve(r).promise();
}

function stub (f) {
	return function () {
		var args = slice.call(arguments, 0);
		args.unshift(f);
		return call.apply(null, args);
	};
}

function call (f) {
	var args = slice.call(arguments, 1);
	if (!(f in functions)) {
		return $.Deferred().reject('missing').promise();
	}
	if (typeof functions[f] === 'function') {
		return functions[f].apply(null, args);
	}
	return pushQueue(f, args);
}

function pushQueue (f, args) {
	var d = $.Deferred();
	if (!(f in queue)) {
		preload(f);
		queue[f] = [];
	}
	queue[f].push([args, d]);
	timeout(d);
	return d.promise();
}

function runQueue (f) {
	var i, d;
	if (!(f in queue)) {
		return;
	}
	for (i = 0; i < queue[f].length; i++) {
		d = queue[f][i][1];
		if (d.state() === 'rejected') {
			continue;
		}
		functions[f].apply(null, queue[f][i][0]).then(d.resolve, d.reject);
	}
	delete queue[f];
}

function timeout (d) {
	var id = setTimeout(function () {
		d.reject('timeout');
	}, libs.rpc.timeout);
	d.always(function () {
		clearTimeout(id);
	});
}

libs.rpc = {
	version: 1.2,
	register: register,
	define: define,
	preload: preload,
	exists: exists,
	call: call,
	stub: stub,
	ret: ret,
	timeout: 5000
};

})(jQuery, mediaWiki, mediaWiki.libs);
//</nowiki>