2010-11-22 25 views
0

J'essaie d'emballer javascript try/catch comme on le voit sur http://pastebin.com/f579d999dProblèmes avec jQuery, fn.bind internes/fn.apply sur draggables (en essayant de faire mieux la gestion des exceptions)

Il fonctionne bien, il essentiellement envelopper le tout dans un try/catch vous permet de détecter les erreurs comme ceci:

$.handleErrors(function(e){ 
    console.log("an error occurred"); 
    console.log(e); 
}); 

(et je vais l'afficher au serveur)

Toutefois, cela ne fonctionne pas pour draggables ou resizables (mais pour tout le reste). Si vous commencez à faire glisser/redimensionner un élément, il ne s'arrête pas à la souris (en faisant glisser le curseur pour toujours)

Il semble que le fichier ofn.apply() ne fonctionne pas sur draggable/redimensionnable.

Plus précisément (raccourci):

  ofn = fn; 
      wfn = function() { 
       ofn.apply(this, arguments); 
      }; 
      fn = wfn; 

Mais pour tous les autres événements.

Bloc de code

):

 $.fn.bind = function(type, data, fn) { 
     var ofn, wfn; 
     if (!fn && data && $.isFunction(data)) { 
      fn = data; 
      data = undefined; 
     } 
     if (fn && type.indexOf("error") === -1) { 
      ofn = fn; 
      wfn = function() { 
      try { 
       ofn.apply(this, arguments); 
      } catch(e) { 
       handler(e); 
       return false; 
      } 
      }; 
      fn = wfn; 
     } 
     return jbind.call(this, type, data, fn); 

Je suis à peu près perdu ici, et je ne peux trouver aucune ressource dire pourquoi cela ne devrait pas travailler (je ne peux même pas trouver quelqu'un qui a les mêmes problèmes)

ma question est la suivante:

  1. est-ce que la méthode ci-dessus semble être un moyen OK pour attraper les erreurs avec jQuer y
  2. Quelqu'un at-il connu le même problème (et il fixe)
  3. Ai-je mal comprendre quelque chose et je devrais tout simplement pas appeler cela sur les événements draggable

Cordialement, Niklas

Mise à jour 2011-08 -28, le code complet (fonctionnement) est maintenant:

jQuery.fn.bind = function(type, data, fn) { 
    if (!fn && data && typeof data == 'function') { 
     fn = data; 
     data = null; 
    } 

    if (fn) 
    { 
     var origFn = fn; 
     var wrappedFn = jQuery.proxy(origFn, function() { 
      try { 
       origFn.apply(this, arguments); 
      }catch (ex) { 
       return trackError(ex); 
      } 
     }); 
     fn = wrappedFn; 
    } 
    return jQueryBind.call(this, type, data, fn); 
}; 

Si quelqu'un a plus de conseils sur la façon de l'améliorer (la fonction d'origine est de 012.377.) s'il vous plaît laissez-moi savoir dans un commentaire.

+0

J'ai installé une démo sur http://bivald.com/jquerydraggable.html (travail sur clic, ne fonctionne pas sur la traînée) - Je teste tout dans Chrome –

Répondre

0

Re: 1 - Nous faisons la même chose, et cela semble fonctionner plutôt bien.

Re: 2 - Oui. Qu'est-ce qui se passe, c'est l'interface utilisateur jQuery n'est pas capable de délier "mousemove.draggable" une fois que vous enveloppez la fonction d'origine. La solution est d'ajouter la ligne ci-dessous (adapté de la fonction proxy jQuery):

// Set the guid of unique handler to the same of original handler, so it can be removed 
wfn.guid = ofn.guid = ofn.guid || wfn.guid || jQuery.guid++; 
+0

Fonctionne comme un charme, a également trouvé une deuxième solution, pour utiliser jQuery.proxy 'var wrappedFn = jQuery.proxy (origFn, function() {' –

+0

Jamey, si vous êtes le commentateur sur http://blogs.cozi.com/tech/2008/04/javascript-error-tracking-why-windowonerror-is-not-enough.html (avec la même image de profil), pourriez-vous partager le code complet, y compris le correctif de retour? –

+0

Oh, c'est bon à savoir. Ensuite, j'utilise votre fonction à la place. Encore merci! –