2010-01-29 11 views
1

Je suis presque terminé un contrat en ce moment, et il semble à la dernière minute que la plupart de mes javascript/jQuery ne fonctionne pas dans Safari sur PC ou Mac. L'ensemble du site est conçu avec une amélioration progressive et un javascript discret pour transformer les liens en des liens de hachage, des pages de fondu enchaîné et des passages en douceur, qui ont tous cessé de fonctionner pour ONLY Safari. J'ai lu que Safari peut être incapable de gérer de gros fichiers .js, mais ma page jquery est inférieure à 10k, et j'utilise une bibliothèque jquery compressée à environ 55k.jQuery/JavaScript questions dans Safari PC/Mac

Voici ce que j'ai maintenant, travaille dans les dernières versions de IE, FF et Chrome - test.cultureconquest.com

Répondre

4

De nombreuses erreurs sont exposées lorsque je lance un jslint du corps principal de votre code. Beaucoup de petites choses, comme des points-virgules manquants. D'autres choses, comme nommer une variable "class", qui est un mot réservé dans JavaScript pourrait être un problème.

Vous avez une logique qui peut être mieux gérée à l'aide de vrais idiomes jQuery. Par exemple, vous faire:

var class = $(this).attr("class"); 
class = class.substr(5); 

var ext 
if (class == "ccm") { 
    ext = "cultureconquest.com"; 
} 
if (class == "gmail") { 
    ext = "gmail.com"; 
} 

jQuery a une méthode pour tester si un élément contient une classe, hasClass()

var ext; 
if ($(this).hasClass("ccm")) { 
    ext = "cultureconquest.com"; 
} 
if ($(this).hasClass("gmail")) { 
    ext = "gmail.com"; 
} 

Je remarque aussi que vous utilisez livequery() extension jQuery. Une méthode équivalente, live() a été ajoutée dans jQuery 1.3. Voir live() pour plus de détails.

Voilà quelques points à considérer. Si vous pouvez obtenir votre code pour passer un test jslint, je parie que vous aurez beaucoup de chemin pour le faire fonctionner dans Safari.

+0

+ de bons points, et un bon exemple. –

+0

ceci l'a fixé, merci! aussi, je ne pense pas que live() couvre toutes les fonctions, telles que les ancres chargées après que le DOM soit prêt. – abysslogic

0

Le principal problème que je vois est que vous lancez une erreur d'analyse en raison de l'utilisation du nom de variable class dans vos deux instructions .MAIL.livequery. Il suffit de changer ce nom de variable (il apparaît 10 fois dans ces deux fonctions) comme ceci:

// SAFE EMAIL // 
$(".MAIL").livequery(function() { 
    var email = $(this).attr("id"); 
    var className = $(this).attr("class"); 
    className = className.substr(5); 

    var ext 
    if (className == "ccm") { 
     ext = "cultureconquest.com"; 
    } 
    if (className == "gmail") { 
     ext = "gmail.com"; 
    } 

    document.getElementById(email).innerHTML = email+"@"+ext; 
    $(this).attr("title",""); 
}); 

$(".MAIL").livequery("click", function() { 
    var className = $(this).attr("class"); 
    className = className.substr(5); 

    var ext 
    if (className == "ccm") { 
     ext = "cultureconquest.com"; 
    } 
    if (className == "gmail") { 
     ext = "gmail.com"; 
    } 
    var email = $(this).attr("id")+"@"+ext; 
    var mailto = "mailto:"+email; 
    window.location = mailto; 
});