Problemas com componentes internos do jQuery, fn.bind/fn.apply em draggables (tentando fazer melhor tratamento de exceções)

StackOverflow https://stackoverflow.com/questions/4245279

Pergunta

Estou tentando agrupar o javascript try/catch como visto em http://pastebin.com/f579d999d

Funciona bem, basicamente envolve tudo em um try/catch permitindo que você detecte erros como este:

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

(e então vou postar no servidor)

No entanto, isso não funciona para arrastáveis ​​ou redimensionáveis ​​(mas para todo o resto).Se você começar a arrastar/redimensionar um elemento, ele não para ao passar o mouse (tornando o arrasto para sempre)

Parece que ofn.apply() não funciona em arrastável/redimensionável.

Especificamente (abreviado):

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

Mas para todos os outros eventos.

Bloco de código):

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

Estou praticamente perdido aqui e não consigo encontrar nenhum recurso dizendo por que isso não deveria funcionar (não consigo encontrar ninguém que tenha os mesmos problemas)

Então minha pergunta é:

  1. O método acima parece uma boa maneira de detectar erros com jQuery
  2. Alguém já passou pelo mesmo problema (e resolveu)
  3. Eu entendi algo errado e simplesmente não deveria chamar isso de eventos arrastáveis

Atenciosamente, Niklas

Atualização 28/08/2011, o código completo (funcionando) agora é:

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

Se alguém tiver mais dicas de como melhorar (a função original é do http://blogs.cozi.com/tech/2008/04/javascript-error-tracking-why-windowonerror-is-not-enough.html) por favor me avise em um comentário.

Foi útil?

Solução

Ré:1 - Fazemos a mesma coisa e parece funcionar muito bem.

Ré:2 - Sim.O que está acontecendo é que o jQuery UI não consegue desvincular "mousemove.draggable" depois de agrupar a função original.A correção é adicionar a linha abaixo (adaptada da função proxy do 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++;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top