Problemas com componentes internos do jQuery, fn.bind/fn.apply em draggables (tentando fazer melhor tratamento de exceções)
-
27-09-2019 - |
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 é:
- O método acima parece uma boa maneira de detectar erros com jQuery
- Alguém já passou pelo mesmo problema (e resolveu)
- 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.
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++;