JeuWeb - Crée ton jeu par navigateur
[jQuery] Comportement - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [jQuery] Comportement (/showthread.php?tid=4117)



[jQuery] Comportement - phenix - 20-06-2009

Bonjour à tous,

Je me trouve face a un dilem d'optimisation:

Tout mon site utilise Ajax pour fonctionner, et comme le veux les bonnes pratiques, je place le javascript dans un fichier a part qui est inclut sur toutes les pages.

Seulement voila, si la div qui doit reçoit n'est pas présente, que ce passe t'il ? jQuery charge t il la page quand même (et donc fait travailler le serveur) ou bien ignore t'il la requête ?

J'utilise load(), pour info.

Merci de votre aide (h)


RE: [jQuery] Comportement - Sephi-Chan - 20-06-2009

Je ne comprends pas… Peux-tu préciser s'il te plaît ? Avec éventuellement du code en guise d'exemple.


Sephi-Chan


RE: [jQuery] Comportement - phenix - 20-06-2009

Bha imaginons:

ce code, placer sur toutes les pages:

<script type="text/javascript">
$(div.inventaire).load("inventaire.php");
</script>

Avec bien sur, le réceptacle :glace:

<div class="inventaire"></div>

Mais seulement sur la page "fiche.php".

Que va t'il ce passer sur les autres page sachant que la div n'y figure pas ? jQuery va charger la page mais ne l'affichera pas ? ou va t'il ignorer la requête (et donc ne pas surcharger le serveur) ?


RE: [jQuery] Comportement - Sephi-Chan - 20-06-2009

Je pense qu'il appelle quand même la page, mais qu'il n'en fait rien puisqu'il ne sait pas où le mettre.

Dans le doute, essaye : incrémente une variable de session dans le script inventaire.php, ainsi tu sauras bien si la page a été appelée. Smile

Dans tous les cas, tu peux faire :

var inventaire = $("div.inventaire");
if(inventaire.lenght == 1){
inventaire.load("inventaire.php");
}


Sephi-Chan


RE: [jQuery] Comportement - phenix - 20-06-2009

Merci de ton aide Wink.

J'ai finalement opté pour une autre solution, plus simple au final.

Il faudra un jour que je vérifie ce que fait jQuery dans un cas comme sa, on pourrait supposé qu'il cherche d'abord si le réceptacle existe avant de faire les actions qui lui sont associé.

Je ferais le teste quand j'aurais le temps Smile


RE: [jQuery] Comportement - Thedeejay - 21-06-2009

Oui mais -sans vouloir partir sur le débat- Mootools à malheureusement une librarie de scripts tres minime par rapport à celle de JQuery sur le net...
Mais je préfere Moo car mes 3 scripts préférés sont codés avec :p


RE: [jQuery] Comportement - phenix - 21-06-2009

J'ai fait tout mon site avec jQuery, j'ai chier pour comprendre son fonctionnement. Pas vraiment envie de tout reprendre a 0...

Citation :Il a moins de scripts à dispositions, mais finalement ça ne me dérange pas, je programme ce dont j'ai besoin.

J'ai codé tout mes scripts jQuery, même ceux qui existait déjà sur le net. Pour apprendre et comprendre ce que je fais. (h)


RE: [jQuery] Comportement - arcanis - 26-06-2009

jQuery fait la liste de tous les éléments correspondant au sélecteur donné, puis applique a chacun d'entre eux la fonction load(). Donc si l'élément n'existe pas, la fonction load() n'est pas déclenchée.
Vérifie tout de même (avec firebug, par exemple, pour voir si la requête xhr est déclenchée), mais normalement c'est ça.

[edit] Après vérification du code, Sephi-chan a raison: pour des raisons de performance, jQuery lance d'abord la requête puis applique ensuite le résultats aux objets sélectionnés. Ca ne génerera donc pas d'erreur, mais la requête sera quand même lancée. Code source complet de la fonction:
	load: function( url, params, callback ) {
if ( typeof url !== "string" )
return this._load( url );

var off = url.indexOf(" ");
if ( off >= 0 ) {
var selector = url.slice(off, url.length);
url = url.slice(0, off);
}

// Default to a GET request
var type = "GET";

// If the second parameter was provided
if ( params )
// If it's a function
if ( jQuery.isFunction( params ) ) {
// We assume that it's the callback
callback = params;
params = null;

// Otherwise, build a param string
} else if( typeof params === "object" ) {
params = jQuery.param( params );
type = "POST";
}

var self = this;

// Request the remote document
jQuery.ajax({
url: url,
type: type,
dataType: "html",
data: params,
complete: function(res, status){
// If successful, inject the HTML into all the matched elements
if ( status == "success" || status == "notmodified" )
// See if a selector was specified
self.html( selector ?
// Create a dummy div to hold the results
jQuery("<div/>")
// inject the contents of the document in, removing the scripts
// to avoid any 'Permission Denied' errors in IE
.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))

// Locate the specified elements
.find(selector) :

// If not, just inject the full result
res.responseText );

if( callback )
self.each( callback, [res.responseText, status, res] );
}
});
return this;
}



RE: [jQuery] Comportement - barst - 26-06-2009

Ta commande n'aurait pas bloqué ta page.

En fait quand tu utilises un sélecteur dans jQuery, il retourne un tableau d'élement correspondant au sélecteur et il exécute ensuite les commandes sur ce tableau en bouclant sur chaque élément retourné.

Si le sélecteur ne retourne rien, tu auras comme même un tableau en retour mais vide.
C'est ce qui évite de planter sur un sélection ne ramenant rien et ça évite de tester l'existence des éléments avant.


RE: [jQuery] Comportement - arcanis - 27-06-2009

Mais vu que la requête est tout de même exécutée, si la page en question a une action spéciale (du style insérer une valeur en db), alors il faut tester.