2012-01-24 1 views
2

J'utilise la jquery suivante pour hijaxing. C'est assez soigné car il suppose que la majorité des liens "veulent" hijaxer mais laisse ceux qui ne "optent" pas en ayant la classe "nohijax". Pourquoi fait-il parfois défaut?Nice hijax échoue parfois

$("#content a:not(.nohijax), #footer a:not(.nohijax)").live("click", function() { 
    $.get($(this).attr("href"), function (response) { 
     $("#content").replaceWith($("#content", response));    
    }); 
    return false; 
}); 

Il fonctionne 100% en chrome, 100% en IE9 sur ma machine, mais échoue rarement dans IE sur d'autres machines. Les échecs ne sont pas cohérents. Même sur une machine «défaillante», le hijaxing fonctionne la plupart du temps, mais soudainement, un lien cliqué apparaît pour «ne rien faire» parce que l'ancien contenu n'est pas remplacé par le nouveau. "Ouvrir dans un nouvel onglet" fonctionne toujours, montrant que le nouveau contenu est bien envoyé.

J'ai essayé de rechercher le problème ici. Il faut être prudent en utilisant .not() avec .live() mais je crois que j'ai raison. Aussi l'élément remplacé (ici, un div avec id = "content") ne doit pas être un enfant direct de l'élément body. Ce n'est pas (il y a une autre div entre).

S'il n'y a pas de hurleur évident, comment puis-je savoir ce qui se passe? (Je suis nouveau au javascript et au développement de navigateur). Je vous remercie.

Répondre

1

Son bon à utiliser console.log(); pour savoir quelles données vous retournez. Par exemple, console.log (response) affichera les données dans la console des outils de développement de votre navigateur.

ex. Comme la fonction .live ne fonctionne pas, je pense qu'il y a peut-être des problèmes avec IE 8 et ci-dessous avec cette fonction. Il vaut peut-être mieux utiliser .click(), sauf si les ancres html à utiliser sont renseignées après le chargement de la page.

Si vous utilisez la dernière version de jquery 1.7, la méthode .live() est déconseillée, mais si vous n'utilisez pas 1.7, il est recommandé d'utiliser .delegate() à la place. http://api.jquery.com/live/

+1

Merci pour votre réponse rapide André, il m'a mis sur la bonne voie et je l'ai fait un petit test utilisant .on() au lieu de .live(), qu'il remplace à partir de jquery 1.7. Fonctionne bien, mais je n'ai pas eu le temps de le vérifier dans le contexte d'origine; Je rapporterai si cela résout le problème. Merci aussi pour l'astuce console.log. Désolé, je ne peux pas voter pour votre réponse, car je suis nouveau. – EyeNine

0

Cela semble avoir été un problème de cache que j'ai résolu avec l'un des these techniques. J'ai utilisé console.log et j'ai trouvé que le nouveau contenu était identique à l'ancien. Après avoir effacé le cache du navigateur, le hijaxing a fonctionné. Cela dit, cela ne s'est jamais mal passé dans Chrome et je ne vois pas comment IE pensait que le contenu mis en cache correspondait à l'URL demandée. Cela fonctionne maintenant de toute façon.

Dans le cas où il est utile, voici mon script mis à jour à utiliser jquery 1.7 et .on():

$(document).on("click", "#content a:not(.nohijax), #footer a:not(.nohijax)", function() { 
    $.get($(this).attr("href"), function (response) { 
     $("#content").replaceWith($("#content", response)); }); 
    return false; }); 
+0

excellente apparence –