2010-11-22 3 views
0

Ich bin versucht, Javascript try/catch zu wickeln, wie auf gesehen http://pastebin.com/f579d999dProbleme mit jQuery Interna, fn.bind/fn.apply auf draggables (versuchen, eine bessere Fehlerbehandlung zu tun)

Es funktioniert gut, es ist im Grunde wickeln alles in einem try/catch lassen Sie Fehler wie diese fangen: (ich werde es auf Server bereitstellen und dann)

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

Allerdings funktioniert das nicht für draggables oder resizables (aber für alles andere). Wenn Sie beginnen, ein Element zu ziehen/zu vergrößern, stoppt es nicht beim Mouse Up (macht den Drag für immer)

Es scheint, als ob die ofn.apply() nicht auf ziehbare/veränderbare funktioniert.

Insbesondere (verkürzt):

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

Aber für alle anderen Veranstaltungen.

-Code-Block):

 $.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); 

Ich bin ziemlich viel hier verloren, und ich kann nicht jede Ressource finden zu sagen, warum das nicht funktionieren sollte (ich nicht einmal jemand finden wer hat die gleichen Probleme)

Also meine Frage ist:

  1. die obige Methode funktioniert wie ein OK Weg scheinen Fehler mit jQuer zu fangen
  2. y
  3. Hat jemand das gleiche Problem erlebt (und es fest)
  4. Habe ich falsch verstehen etwas, und ich sollte einfach nicht rufen ziehbar Ereignisse

Grüße, Niklas

-Update 2011-08 -28, der vollständige Code (in Betrieb) ist jetzt:

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); 
}; 

Wenn jemand mehr Tipps hat, wie es zu verbessern (die ursprüngliche Funktion von 012.377.) Bitte lassen Sie mich in einem Kommentar wissen.

+0

Ich habe Setup eine Demo auf http://bivald.com/jquerydraggable.html (arbeiten klicken, funktioniert nicht auf drag) - Ich teste alles in Chrome –

Antwort

0

Re: 1 - Wir machen das gleiche, und es scheint ziemlich gut zu funktionieren.

Re: 2 - Ja. Was passiert, ist, dass jQuery UI "mousemove.draggable" nicht trennen kann, nachdem Sie die ursprüngliche Funktion umbrochen haben. Die Lösung ist die folgende Zeile (angepasst von jQuery-Proxy-Funktion) hinzuzufügen:

// 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

Funktioniert wie ein Charme, fand eine zweite Lösung auch, um jQuery.proxy 'var wrappedFn = jQuery.proxy (origFn, function() {' –

+0

Jamey, wenn Sie der Kommentator sind http://blogs.cozi.com/tech/2008/04/javascript-error-tracking-why-windowonerror-is-not-enough.html (mit dem gleichen Profilbild), könnten Sie den kompletten Code teilen, einschließlich der Rückgabefix? –

+0

Oh, gut zu wissen. Dann benutze ich stattdessen deine Funktion. Nochmals vielen Dank! –

Verwandte Themen