abr 2 2009

Corrigindo o bug do jQuery e Java Applets

Vou compartilhar com vocês uma solução para um problema que estava tendo com o a triade firefox 2, jQuery e Java applet.

O problema

Toda vez que é carregado na página um java applet visivel (ou seja, que apareça na tela de alguma maneira), o  jQuery lança a exception:

Java class **** has no public field or method named "jQuery1207164172390"

Após a exception, o browser simplesmente para de responder aos eventos/comandos javascript. Isso ocorre a partir da segunda vez que é carregado o applet, dai em diante é aleatório (famosa roleta russa).

Para simular o erro, acesse http://www.pengoworks.com/workshop/jquery/bug_applet/jquery_applet_bug.htm

A solução

Pesquisando, consegui achar uma solução para o problema proposta por Dan G. Switzer, II na lista de discussão jquery-dev

Procure pela segunte função no source do jQuery:

// Prevent memory leaks in IE
// And prevent errors on refresh with events like mouseover in other browsers
// Window isn't included so as not to unbind existing unload events
jQuery(window).bind("unload", function() {
    jQuery("*").add(document).unbind();
});

E substitua pela seguinte função:

// Window isn't included so as not to unbind existing unload events
jQuery(window).bind("unload", function() {
    jQuery("*:not('applet, object')").add(document).unbind();
});

Essa correção evita que o jQuery tente remover os expandos dos elementos applet e object, não disparando a exception.

Feito isso, a exception não ocorrerá novamente, evitando que o javascript pare de funcionar.