Valider 2d192666 rédigé par esj's avatar esj
Parcourir les fichiers

Selecteurs Ajax (Suite de [7631] et [7655] pour #630). Réécriture du code du mini-navigateur:

- onkeypress='setTimeout(X); if (event.eyCode= 13) return false'
est remplacé par
	onkeypress='if (event.eyCode= 13) return false'
	onkeyup='X'
plus efficace et plus simple.

En particulier, l'expression X teste si le retour de la requete Ajax ne renvoie qu'un seul résultat qui est alors aussitot pré-sélectionné (mais il faut toujours cliquer pour valider).

Reintroduction du code qui supprime la plus vieilles de 2 requetes sur un meme noeud (finalement indispensable pour la recherche interactive car la recherche d' une chaine longue revient plus rapidement qu'une recheche sur un préfixe de cette chaine) mais sans garder le gestionnaire Ajax indéfiniment (==> try/catch pour éviter le NS_ERROR_NOT_AVAILABLE induit. Zon encore des progrès à faire dans leurs specs).

Partage de code plus important entre les 2 mini-navigateurs (rubriques / auteurs) pour mutualiser les développements futurs.
parent 7606e2e1
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+74 −18
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
var memo_obj = new Array();
var url_chargee = new Array();
var xhr_actifs = new Array();
var load_handlers = new Array();

function findObj_test_forcer(n, forcer) { 
@@ -113,20 +114,25 @@ function changerhighlight (couche) {

function aff_selection (arg, idom, url)
{

	noeud = findObj_forcer(idom);
	if (noeud) {
		noeud.style.display = "none";
		charger_node_url(url+arg, noeud);
	}
	return false;
}

// selecteur de rubrique et affichage de son titre dans le bandeau

function aff_selection_titre(titre, id, idom)
function aff_selection_titre(titre, id, idom, nid)
{
	findObj_forcer('titreparent').value=titre;
	findObj_forcer('id_parent').value=id;
	findObj_forcer(idom).style.display='none';
	t = findObj_forcer('titreparent');
	t.value= titre;
	t=findObj_forcer(nid);
	t.value=id;
	t=findObj_forcer(idom);
	t.style.display='none';
}

function aff_selection_provisoire(id, racine, url, col, sens,informer)
@@ -142,6 +148,35 @@ function aff_selection_provisoire(id, racine, url, col, sens,informer)
  return false;
}

// Lanche une requete Ajax a chaque frappe au clavier dans une balise de saisie.
// Si l'entree redevient vide, rappeler l'URL initiale si dispo.
// Sinon, controler au retour si le resultat est unique, 
// auquel cas forcer la selection.

function onkey_rechercher(valeur, rac, url, img, nid, init) {
	var Field = findObj_forcer(rac);
	if (!valeur.length) {	
		init = findObj_forcer(init);
		if (init && init.href) { charger_node_url(init.href, Field);}
	} else {	
	  charger_node_url(url+valeur,
			 Field,
			 function () {
			   	var n = Field.childNodes.length - 1;
				// Safari = 0  & Firefox  = 1 !
				// et gare aux negatifs en cas d'abort
				if (!n  || (n == 1)) {
				  noeud = Field.childNodes[n].firstChild;
				  aff_selection_titre(noeud.firstChild.nodeValue, noeud.title, rac, nid);
				}
			   },
			   img);
	}
	return false;
}

function lancer_recherche(champ, cible) {} // obsolete

//
// Cette fonction charge du contenu - dynamiquement - dans un 
// Ajax
@@ -185,6 +220,10 @@ function triggerAjaxLoad(root) {
	load_handlers[i].apply( root );
}

// Alloue un gestionnaire Ajax, et le lance sur les parametres donnes
// Retourne False si l'allocation est impossible,
// le gestionnaire lui-meme autrement (utile pour memoriser ceux alloues).

function ajah(method, url, flux, rappel)
{
	var xhr = createXmlHttp();
@@ -198,12 +237,20 @@ function ajah(method, url, flux, rappel)
		xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}
	xhr.send(flux);
	return true;
	return xhr;
}

// Avancees de la requete HTTP.
// Attention:
// 1. Opera dit toujours 0, pas 200 ou 404 etc
// 2. si la methode abort a ete invoquee, acceder au status provoque
// 	NS_ERROR_NOT_AVAILABLE 
// il faut try/catch pour rester discret (l'avortement decidement ...)

function ajahReady(xhr, f) {
	if (xhr.readyState == 4) {
		if (xhr.status > 200) // Opera dit toujours 0 !
	  try { s = xhr.status > 200} catch (e) {s = 0; }
	  if (s) // 
	    {f('Erreur HTTP :  ' +  xhr.status);}
	  else  { f(xhr.responseText); }
        }
@@ -232,9 +279,14 @@ function AjaxSqueeze(trig, id, f)
		g.innerHTML = ajax_image_searching;
		id.insertBefore(g, id.firstChild);
	}
	return  AjaxSqueezeNode(trig, id, f);
	return  !AjaxSqueezeNode(trig, id, f);
}

// La fonction qui fait vraiment le travail decrit ci-dessus.
// Son premier argument est deja le noeud du DOM
// et son resultat booleen est inverse ce qui lui permet de retourner 
// le gestionnaire Ajax comme valeur non fausse

function AjaxSqueezeNode(trig, noeud, f)
{
	var i, s, g, callback;
@@ -247,7 +299,7 @@ function AjaxSqueezeNode(trig, noeud, f)
	if (typeof(trig) == 'string') {
		i = trig.split('?');
		trig = i[0] +'?var_ajaxcharset=utf-8&' + i[1];
		return !ajah('GET', trig, null, callback);
		return ajah('GET', trig, null, callback);
	}

	for (i=0;i < trig.elements.length;i++) {
@@ -262,7 +314,7 @@ function AjaxSqueezeNode(trig, noeud, f)
	s = trig.getAttribute('action');
	if (typeof(s)!='string') // pour IE qui a foire la ligne precedente
		s = trig.attributes.action.value;
	return !ajah('POST', // ou 'GET'
	return ajah('POST', // ou 'GET'
		     s ,     // s + '?'+ u,
		     u,      // null,
		     callback);
@@ -271,6 +323,8 @@ function AjaxSqueezeNode(trig, noeud, f)

// Comme AjaxSqueeze, 
// mais avec un cache sur le noeud et un cache sur la reponse
// et une memorisation des greffes en attente afin de les abandonner
// (utile surtout a la frappe interactive au clavier)
// De plus, la fonction optionnelle n'a pas besoin de greffer la reponse.

function charger_id_url(myUrl, myField, jjscript) 
@@ -290,21 +344,23 @@ function charger_id_url(myUrl, myField, jjscript)

function charger_node_url(myUrl, Field, jjscript, img) 
{
	  var r = url_chargee[myUrl];
	// disponible en cache ?
	  if (r) {
			retour_id_url(r, Field, jjscript);
	if (url_chargee[myUrl]) {
			retour_id_url(url_chargee[myUrl], Field, jjscript);
			triggerAjaxLoad(Field);
			return false; 
	  } else {
		if (img) img.style.visibility = "visible";
			return AjaxSqueezeNode(myUrl,
		if (xhr_actifs[Field]) { xhr_actifs[Field].abort(); }
		xhr_actifs[Field] = AjaxSqueezeNode(myUrl,
				'',
				function (r) {
					xhr_actifs[Field] = undefined;
					if (img) img.style.visibility = "hidden";
					url_chargee[myUrl] = r;
					retour_id_url(r, Field, jjscript);
				})
								   });
		return !xhr_actifs[Field];
	}
}

+0 −17
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -159,23 +159,6 @@ function changeVisible(input, id, select, nonselect) {
// livesearchlike...


function lancer_recherche(champ, cible) {
	// Desactive pour l'instant (bouffe trop de ressources)
	/* et a reprendre suite au cght d'interface Ajax du 7/8/06
	valeur = findObj(champ).value;
	if (valeur.length > 3) {
		charger_id_url('./?exec=recherche_sugg='+valeur,'sugg_recherche');
		charger_id_url('./?exec=recherche='+valeur,'resultats_recherche');
	}
	*/
}

function onkeypress_rechercher(champ, rac, url) {
	valeur = findObj(champ).value;
	if (valeur.length > 0) {
		charger_id_url(url+valeur, rac);
	}
}

// effacement titre quand new=oui
var antifocus=false;
+99 −76
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -12,8 +12,6 @@

if (!defined("_ECRIRE_INC_VERSION")) return;

# gerer un charset minimaliste en convertissant tout en unicode &#xxx;

// http://doc.spip.org/@exec_rechercher_dist
function exec_rechercher_dist()
{
@@ -44,6 +42,9 @@ function exec_rechercher_dist()
		$where_exclus = '';

	$res = spip_query("SELECT id_rubrique, id_parent, titre FROM spip_rubriques WHERE $where_id$where_exclus");

	$points = $rub = array();

	while ($row = spip_fetch_array($res)) {
		$id_rubrique = $row["id_rubrique"];
		$rub[$id_rubrique]["titre"] = typo ($row["titre"]);
@@ -65,34 +66,56 @@ function exec_rechercher_dist()
		$points[$id_rubrique] = $points[$id_rubrique] + 1;
	}
		

	if ($points) {
		arsort($points);
			while (list($id,$pts) = each($points)) {
		$style = " style='background-image: url(" . _DIR_IMG_PACK . "secteur-12.gif)'";
		foreach($rub as $k => $v) {
			$rub[$k]['atts'] = ($v["id_parent"] ? $style : '')
			. " class='arial11 petite-rubrique'";
		}
	}

				$id_rubrique = $id;
				$titre = $rub[$id]["titre"];
				$id_parent = $rub[$id]["id_parent"];
	ajax_retour(proposer_item($points, $rub, $rac));

				// Eviter une premiere fois d'afficher la rubrique exclue
					if ($id_parent == 0) $style = "style='background-image: url(" . _DIR_IMG_PACK . "secteur-12.gif)'";
					else $style = "";
					$info = generer_url_ecrire('informer', "type=rubrique&rac=$rac&id=");
					$onClick = " aff_selection($id_rubrique, '$rac" ."_selection', '$info');";
}

					$btitre = strtr(str_replace("'", "&#8217;",
								    str_replace('"', "&#34;", textebrut($titre))),
							"\n\r", "  ");
// Resultat de la recherche interactive demandee par la fonction JS
// onkey_rechercher qui testera s'il comporte une seule balise au premier niveau
// car cela qui indique qu'un seul resultat a ete trouve.
// ==> attention a composer le message d'erreur avec au moins 2 balises

					$ondbClick = "aff_selection_titre('$btitre',$id_rubrique,'selection_rubrique');";
					$ret .= "<div class='pashighlight' onClick=\"changerhighlight(this); $onClick\" ondblclick=\"$ondbClick$onClick\"><div class='arial11 petite-rubrique'$style>";
					$ret .= "&nbsp; $titre";
					$ret .= "</div></div>";
			}
		}
		if (!$ret)
			$ret =  "<div style='padding: 5px; color: red;'><b>"
function proposer_item ($ids, $titles, $rac)
{

	if (!$ids)
		return "<br /><br /><div style='padding: 5px; color: red;'><b>"
		.htmlentities($type)
		."</b> :  "._T('avis_aucun_resultat')."</div>";
		ajax_retour($ret);

	$ret = '';
	$info = generer_url_ecrire('informer', "type=rubrique&rac=$rac&id=");

	$onClick = "aff_selection(this.firstChild.title,'$rac". "_selection','$info')";

	$ondbClick = "aff_selection_titre(this.firstChild.firstChild.nodeValue,this.firstChild.title,'selection_rubrique', 'id_parent');";

	foreach($ids as $id => $bof) {
				
		$titre = strtr(str_replace("'", "&#8217;", str_replace('"', "&#34;", textebrut($titles[$id]["titre"]))), "\n\r", "  ");

		$ret .= "<div class='pashighlight'\nonClick=\"changerhighlight(this); "
		. $onClick
		. "\"\nondblclick=\""
		. $ondbClick
		. $onClick
		. " \"><div"
		. $titles[$id]["atts"]
		. " title='$id'>&nbsp; "
		. $titre
		. "</div></div>";
	}
	return $ret;
}

?>
+6 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -204,11 +204,11 @@ function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem=0) {
		$titre = _T('info_racine_site');

	$titre = str_replace('&amp;', '&', entites_html(textebrut(typo($titre))));
	$titre = "<input type='text' id='titreparent' name='titreparent' disabled='disabled' class='forml' value=\"" . $titre . "\" />";
	$init = " disabled='disabled' type='text' value=\"" . $titre . '"';

	$url = generer_url_ecrire('selectionner',"id=$id_rubrique&type=$type" . (!$idem ? '' : ("&exclus=$idem&racine=" . ($restreint ? 'non' : 'oui'))));

	return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $titre, $id_rubrique);
	return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $init, $id_rubrique);
}

// construit un bloc comportant une icone clicable avec image animee a cote
@@ -217,7 +217,7 @@ function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem=0) {
// (la fonction JS charger_node ignore l'attribut id qui ne sert en fait pas;
// getElement en mode Ajax est trop couteux).

function construire_selecteur($url, $js, $idom, $name, $titre='', $id=0)
function construire_selecteur($url, $js, $idom, $name, $init='', $id=0)
{
	$icone = ($idom == 'selection_auteur') ? 'message.gif' : 'loupe.png';
	return 	"<table width='100%'><tr width='100%'><td width='45'><a	href='#'\nonclick=\""
@@ -232,7 +232,9 @@ function construire_selecteur($url, $js, $idom, $name, $titre='', $id=0)
	. "searching.gif' id='img_"
	.  $idom
	. "' style='visibility: hidden;' /></td><td>"
	. $titre
	. "<input id='titreparent' name='titreparent'"
	. $init
	. " />" 
	. "<input type='hidden' id='$name' name='$name' value='"
	. $id
	. "' /></td></tr></table><div id='"
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -277,6 +277,6 @@ function selecteur_auteur_ajax($id_article, $js, $text)
	include_spip('inc/chercher_rubrique');
	$url = generer_url_ecrire('selectionner_auteur',"id_article=$id_article");

	return construire_selecteur($url, $js, 'selection_auteur', 'nouv_auteur', $text);
	return $text . construire_selecteur($url, $js, 'selection_auteur', 'nouv_auteur', ' type="hidden"');
}
?>
Chargement en cours