Jump to content

Wikipedia:WikiProject User scripts/Guide/Ajax: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
jQuery
Line 2: Line 2:
[[Ajax (programming)|AJAX]] (''asynchronous JavaScript and XML'') is a popular name for a web programming technique that queries the server or fetches content without reloading the entire page.
[[Ajax (programming)|AJAX]] (''asynchronous JavaScript and XML'') is a popular name for a web programming technique that queries the server or fetches content without reloading the entire page.


While programming AJAX can be complex, libraries of functions can make it much easier. MediaWiki's [{{SERVER}}/skins-1.5/common/ajax.js ajax.js] provides a small set of functions by default<s>, and [[m:User:Pathoschild/Scripts/Ajax framework|Pathoschild's AJAX framework]] provides a more comprehensive library of functions</s><sup>(obsolete)</sup>. This page will document programming with and without the latter.
While programming AJAX can be complex, libraries of functions can make it much easier. MediaWiki's [{{SERVER}}/skins-1.5/common/ajax.js ajax.js] provides a small set of functions by default<s>, and [[m:User:Pathoschild/Scripts/Ajax framework|Pathoschild's AJAX framework]] provides a more comprehensive library of functions</s><sup>(obsolete)</sup>. This page will document programming with and without the latter. In addition, [[jQuery]] provides a convenient framework for easily making Ajax requests.


==Common problems==
==Common problems==
Line 156: Line 156:
:** [[Wikipedia:Tools/Navigation popups|Navigation popups]]
:** [[Wikipedia:Tools/Navigation popups|Navigation popups]]
:** [[Wikipedia:WikiProject User scripts/Scripts/Twinkle|Twinkle]] (some code in [[User:AzaToth/morebits.js]], and good examples of AJAX are in the bottom of [[User:AzaToth/twinklespeedy.js]])
:** [[Wikipedia:WikiProject User scripts/Scripts/Twinkle|Twinkle]] (some code in [[User:AzaToth/morebits.js]], and good examples of AJAX are in the bottom of [[User:AzaToth/twinklespeedy.js]])
:** [[User:Kaldari/wikilove.js]] - uses Ajax to edit user talk pages
:** [[User:Kaldari/wikilove.js]] - uses Ajax (via jQuery) to edit user talk pages


; Mediawiki
; Mediawiki

Revision as of 22:29, 31 March 2011

AJAX (asynchronous JavaScript and XML) is a popular name for a web programming technique that queries the server or fetches content without reloading the entire page.

While programming AJAX can be complex, libraries of functions can make it much easier. MediaWiki's ajax.js provides a small set of functions by default, and Pathoschild's AJAX framework provides a more comprehensive library of functions(obsolete). This page will document programming with and without the latter. In addition, jQuery provides a convenient framework for easily making Ajax requests.

Common problems

  • AJAX programmers commonly run into problems if they don't account for AJAX's asynchronicity. If you try to pop up a box with another page's content, you will almost certainly pop up a box containing null. This occurs because the script continued even though the query wasn't finished.

    To correct the problem, you need to use callback functions. Place the next portion of code after a query into a function, and call the function when the query completes. (The AJAX framework makes this very easy to do.)

  • AJAX scripts cannot reach a page on a different server (for example, google.ca or en.wikisource.org from en.wikipedia.org). Trying to do so will cause the script to halt with or without error. This can be circumvented using a proxy on the current server, but none is available for Wikimedia user scripts.

Code

Create an AJAX object

Before you can query or fetch a page, you must create a query object. Different browsers use different objects, but MediaWiki provides the sajax_init_object() to do it in one step. The AJAX framework equivalent is ajax_create().

/************
* MediaWiki ajax.js
************/
var query = sajax_init_object();

/************
* AJAX framework
************/
var query = ajax_create();

Fetch page content

Fetching a page content can be done using GET.

/************
* MediaWiki ajax.js
************/
// fetch
var api = sajax_init_object();
api.open('GET', 'http://example.com', true);
api.onreadystatechange = show_result;
api.send(null);
	
// handle response
function show_result(_api) {
	if(_api.readyState==4) {
		if(_api.status==200) {
			alert('The remote page contains:\n' + _api.responseText);
		} else {
			alert('The query returned an error.');
		}
	}
}

/************
* AJAX framework
************/
ajax_get('http://example.com', show_result);
function show_result(_api) {
	if(_api.ajax_success) {
		alert('The remote page contains:\n' + _api.responseText);
	} else {
		alert('An error occurred.');
	}
}

Edit a page and other common actions

Scripts can perform common actions (like editing, protection, blocking, deletion, etc) through the API. These actions require an edit token, which is valid for any action during the same session. (However, you should get a new token for different tasks in case this changes in the future.)

The code below shows how to edit a page, but it can easily be adapted to other actions by reading the API documentation.

/************
* MediaWiki ajax.js
************/
// fetch token
var api = sajax_init_object();
api.open('GET', wgServer + wgScriptPath + '/api.php?format=json&action=query&prop=info&indexpageids=1&intoken=edit&titles=Whatever', true);
api.onreadystatechange = extract_token;
api.send(null);
function extract_token() {
	if(api.readyState==4) {
		if(api.status==200) {
			var response = eval('(' + api.responseText + ')');
			var token = response['query']['pages'][response['query']['pageids'][0]]['edittoken'];
			edit_page(token);
		}
		else {
			alert('The token query returned an error.');
		}
	}
}

// edit page (must be done through POST)
function edit_page(_token) {
	var parameters = 'action=edit&title=User:Pathoschild/Sandbox&text=AJAX_test!&token=' + encodeURIComponent(_token);
	api.open('POST', wgServer + wgScriptPath + '/api.php', true); // just reuse the same query object
	api.onreadystatechange = alert_result;
	api.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
	api.setRequestHeader('Connection', 'keep-alive');
	api.setRequestHeader('Content-length', parameters.length);
	api.send(parameters);
	
	// process response
	function alert_result() {
		if(api.readyState==4) {
			if(api.status==200) {
				alert('Page edited!');
			}
			else {
				alert('The query returned an error.');
			}
		}
	}
}

/************
* AJAX framework
************/
ajax_edit_token('edit', edit_page);
function edit_page(_token) {
	var parameters = 'action=edit&title=User:Pathoschild/Sandbox&text=AJAX_test!&token=' + encodeURIComponent(_token);
	ajax_post(wgServer + wgScriptPath + '/api.php', parameters, alert_result);
}
function alert_result(_api) {
	if(_api.ajax_success) {
		alert('Page edited!');
	} else {
		alert('An error occurred.');
	}
}

Data sources

api.php

See mw:API. Usually used with JSON format.

HTML

You could fetch the whole article page or use &action=render URL parameter to get the content without all the menus (example). Also see Parameters to index.php.

The result you could treat as a text but it's usually convenient to parse it as HTML document, e.g. using DOMParser object (examples needed).

Wiki code

To get the wiki code you use &action=raw URL parameter (example).

The result you treat as a text.

Preview

Sometimes you might want to use preview. For example, Special:Prefixindex won't work with &action=render. To get rid of the unnecessary menus you could submit {{Special:Prefixindex/somepage}} for a preview and get a "clean" list (nevertheless, it's better to use API for prefix index)

See also

Code

User scripts
Mediawiki

Alternatives