Qu'est-ce qui provoque l'erreur "jqGrid n'est pas une fonction"?

J'ai eu des problèmes après la mise à niveau:

  • JqGrid de 3.5.3 à 3.8.2
  • Jquery de 1.3.2 à 1.4.4
  • Jquery-ui de 1.7.2 à 1.8.8

Ma demande comporte des onglets jqueryui. Le troisième onglet comporte un contrôle jqGrid. Si je recharge lorsque je suis sur le troisième onglet, la grille fonctionne correctement. Toutefois, si vous rechargez le premier onglet, puis cliquez sur le troisième onglet, puis la grille ne s'affiche pas.

Firebug me montre que l'erreur "jqGrid n'est pas une fonction".

La recherche dans les forums suggère que le problème est un chemin d'accès incorrect des fichiers dans grid.loader.js

Je préfixe le mien avec document.URL comme ceci:

function jqGridInclude() { var pathtojsfiles = document.URL + "script/jqGrid/src/"; // need to be ajusted ... } 

Si vous définissez pathtojsfiles dans la mauvaise valeur, vous verrez les erreurs 'fichier introuvable' dans Firebug. Tout est bien chargé.

Http://forum.jquery.com/topic/jqgrid-is-not-a-function

Ce fil a une impasse: @milenaa: "Je pensais qu'il s'agissait d'un problème de chemin au début, comme je l'avais déjà fait auparavant, mais ça fonctionne comme ça: j'ai un menu qui appelle certains contrôleurs côté serveur qui renvoient des données Ou j'envoie des données pour eux. Lorsque je clique sur le lien qui appelle le contrôleur qui appelle plus tard la fonction jqgrid, il fonctionne. Mais, si d'abord j'appelle l'autre fonction, jqgrid ne fonctionne pas. Et la page inclut tous les js Nécessaire pour les deux cas. Tout comme l'autre fonction ne permet pas à jqgrid de fonctionner … Mais je ne sais pas pourquoi … "

En lisant ceci, je pense que j'ai un problème similaire. Je dois admettre que je ne connais pas le modèle d'exécution de Javascript. Des idées sur la façon de résoudre ou de supprimer ce problème?

Je suppose que vous avez le problème décrit dans Internet Explorer. Regardez l'ancienne réponse suivante . Le problème est que la méthode actuellement utilisée dans grid.loader.js ne garantit pas que les fichiers inclus seront exécutés exactement dans le même ordre dans lequel sont inclus et, d'ailleurs, tous sont exécutés avant que jQuery(document).ready . Tous les fichiers chargés sont déjà dans le cache du navigateur Web (exactement comme vous décrivez avec "rechargement" de la page) alors tous fonctionnent correctement, sinon votre code utilisé jqGrid peut être exécuté avant que jqGrid JavaScript ne soit prêt.

Je vous recommande de ne pas inclure grid.loader.js du tout. Au lieu de cela, vous pouvez inclure manuellement tous les fichiers dont vous pourriez avoir besoin à partir de grid.loader.js dans le même ordre que vous pouvez voir dans grid.loader.js . Une autre façon que vous pouvez essayer d'utiliser la solution de contournement que j'ai décrite dans ma réponse dans le forum de trirand . La seule restriction que je connais avec la solution de contournement est: vous ne pouvez pas utiliser le code XHTML qui possède un en-tête XML au début.