2009-08-05 8 views
0

J'ai besoin de magie jQuery qui va chercher tout le texte sur une page avec une police donnée (disons Helvetica), et changer la police de seulement ce texte à autre chose (dit Arial).Faire tout le texte avec la police Helvetica avoir la police Arial dans jQuery

+2

Y a-t-il une bonne raison à cela, ou pourriez-vous utiliser CSS à la place? Se sent comme faire quelque chose comme ça avec JS est une mauvaise pratique et que cela devrait être fait avec CSS si possible. – You

+0

J'ai maintenant des visions d'une page html où tous les éléments ont un attribut de style définissant une famille de polices différente! –

+0

cela ressemble à un usercript utile pour moi. Si vous n'aimez pas la police Helvetica (avertissement: j'aime bien), installez quelque chose qui change chaque page Web qui l'utilise pour Arial. – cobbal

Répondre

4

Cela devrait fonctionner, je l'ai vérifié sur mon site et il a changé de police correctement.

 
$('body').filter(function() { 
    return ($(this).css('font-family').indexOf('Helvetica')>-1); 
}).css('font-family', 'Arial'); 
+0

Ceci est la meilleure solution des deux actuellement posté; mais je maintiens toujours que ce n'est pas quelque chose que vous devriez faire; il y a probablement un meilleur moyen que d'utiliser JS. Je veux dire, chercher et remplacer dans toutes vos feuilles de style ferait certainement la même chose. – You

+0

@You - pas que je ne suis pas d'accord, mais '... est la meilleure solution' ne fait pas grand-chose pour expliquer pourquoi c'est la meilleure solution, c'est une approbation simple - cela me serait plus utile, penseur et tout le monde d'autre pour mettre un peu de substance derrière elle. – karim79

+0

@ karim79: C'est mieux car il utilise 'filter' au lieu de' each'; ce qui rend le code plus joli et plus lisible/compréhensible. Autre que cela, les deux solutions sont exactement les mêmes. – You

0

Si tout a été défini par CSS, avez-vous déjà pensé fraie vos propres définitions @font-face, outrepassant Helvetica?

Par exemple, si tout est défini pour rendre Helvetica, comme dans cette déclaration:

* { 

    font-family: Helvetica; 

} 

Vous pouvez alors ajouter une instruction @ font-face à votre feuille de style, qui ressemble maintenant à ceci:

@font-face { 

    font-family: 'Helvetica'; 

    src: local('Anivers-Regular'), 
     local('Anivers Regular'), 
     url('typeface.Anivers.Regular.otf') format('truetype'); 

} 

Il fonctionne sur en ligne de style des éléments tels que <h4 style="font-family: Helvetica;">aw</h4> aussi. De cette façon, tout ce qui est Helvetica serait rendu automatiquement dans (par exemple,) Anivers, et cet extrait fonctionne avec ou sans guillemets. Répertorie le nom PostScript, le nom complet + le style, puis un URI pour la compatibilité entre les navigateurs. Si le repli est sur Helvetica, cette magie CSS fonctionnerait. De plus, vous bénéficiez de la gestion des performances gratuites puisque le navigateur, au lieu de votre script, effectue la substitution pour vous. Malheureusement, Internet Explorer déteste les fichiers .otf sans raison apparente et vous auriez besoin d'un utilitaire appelé ttf2eot au cas où.

-

Ceci est une bidouille horrible et il vivra dans votre code de production trop longtemps. À propos, quel est le scénario et pourquoi voudriez-vous le faire - en substituant une fonte plus belle à une fonte inférieure?

Si par la suite vous changiez d'avis et que vous souhaitiez utiliser la "vraie" Helvetica ailleurs, vous devrez la changer de nom sous un autre nom. Travail fastidieux n'est-ce pas.

2

Ce n'est pas vraiment une réponse, mais comme je ne peux pas encore commenter les réponses des autres, je place mes commentaires ici dans une réponse.

La réponse du penseur ci-dessus ne fonctionnera pas (ou du moins il y a des cas où cela ne fonctionnera pas).

code de Penseur est la suivante (je copie ici au cas où il peut modifier sa réponse):

$('body').filter(function() { 
return ($(this).css('font-family').indexOf('Helvetica')>-1); 
}).css('font-family', 'Arial'); 

Qu'est-ce que ce code va faire est de changer la police Arial pour une famille de polices qui contient Helvetica. Cela inclut les familles de polices où Helvetica est utilisée comme solution de repli, et donc très probablement n'est pas toujours affiché.

Vous pouvez également lire les réponses et commentaires dans le post suivant:

Changing Body Font-Size based on Font-Family with jQuery

qui contient un code similaire avec une discussion.

0

C'est ce que je l'utilise dans mon extension Google Chrome:

var replacement = "Helvetica"; 
var toReplace = new RegExp("[\\'\\\"\\s]*(Arial|Some|Other|Fonts)[\\'\\\"\\s]*(?=,|$)", "gi"); 

function replaceFont (toReplace, replacement) { 
    // Adjust style sheets 
    if (document.styleSheets) { 
     for (var i = 0; i < document.styleSheets.length; i++) { 
      var styleSheet = document.styleSheets[i]; 

      if (styleSheet.cssRules) { 
       for (var j = 0; j < styleSheet.cssRules.length; j++) { 
        var cssRule = styleSheet.cssRules[j]; 

        // Replace in font-family attribute 
        if (cssRule.style.fontFamily.match(toReplace)) 
         cssRule.style.fontFamily = cssRule.style.fontFamily.replace(toReplace, replacement); 

        // Replace in font attribute 
        if (cssRule.style.font.match(toReplace)) 
         cssRule.style.font = cssRule.style.font.replace(toReplace, replacement); 
       } 
      } 
     } 
    } 

    // Adjust inline styles 
    $('body').find('*').each(
     function (i) { 
      if ($(this).css('font-family').match(toReplace)) 
       $(this).css('font-family', $(this).css('font-family').replace(toReplace, replacement)); 

      if ($(this).css('font').match(toReplace)) 
       $(this).css('font', $(this).css('font').replace(toReplace, replacement)); 
     } 
    ); 

    // Adjust font tag properties 
    $('body').find('font').each(
     function (i) { 
      if ($(this).attr('face').match(toReplace)) 
       $(this).attr('face', $(this).attr('face').replace(toReplace, replacement)); 
     } 
    ); 

} 

code complet est here.

+0

Maintenant que je le regarde, cette expression régulière dans 'toReplace' devrait probablement rechercher des délimiteurs et ignorer les espaces. – Goblin

+0

Les espaces dans les définitions 'font-family' sont ignorés, donc" Arial Black "et" ArialBlack "sont équivalents. Gardez cela à l'esprit et ajustez l'expression régulière si le nom de la police que vous voulez remplacer contient des espaces. – Goblin

Questions connexes