1
votes

Comment remplacer jQuery $ .trim ()?

J'utilise jQuery dans un site Web a un polyfill pour le String.trim () intégré. Le site fonctionnait beaucoup dans IE 8 et avait besoin du polyfill, mais ce n'est plus le cas. Malheureusement, je ne peux pas supprimer le polyfill de la page - je n'ai pas l'autorisation de le toucher et je n'ai aucun moyen de le supprimer - donc ce bout de code s'exécute avant tout Je peux contrôler:

String.prototype.trim = function(){
   if(typeof this.valueOf(this) === 'string'){
       return this.replace(/^\s\s*/, "").replace(/\s\s*$/, "");
   } else {
       return this.valueOf(this);
   }
} 

Ensuite, jQuery arrive et fait ceci, sans se rendre compte que le String.trim natif a déjà joué avec:

// Use native String.trim function wherever possible
trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
    function( text ) {
        return text == null ?
            "" :
            core_trim.call( text );
    } :

    // Otherwise use our own trimming functionality
    function( text ) {
        return text == null ?
            "" :
            ( text + "" ).replace( rtrim, "" );
    },

Jusqu'à présent, cela n'a pas vraiment posé de problème, mais j'utilise le plugin Datatables pour jQuery et il a de nombreux endroits où il appelle $ .trim () sur des données qui ne sont pas une chaîne, comme un nombre ou des tableaux. Le code natif dans IE 11 et Chrome (les navigateurs que nous ciblons) sait renvoyer simplement la valeur de $ .trim (6) , mais pas le polyfill.

I essayé de redéfinir le prototype avec une fonction qui devrait fonctionner:

String.prototype.trim = function() {
    return this.replace(/^\s\s*/, "").replace(/\s\s*$/, "")
}

Mais cela n'a pas fonctionné car jQuery a déjà été étendu en utilisant le polyfill et d'autres modifications du prototype ne le seront pas changer ce que jQuery utilise.

J'ai essayé de suivre ce fil pour redéfinir $ .trim (), mais cela n'a pas fonctionné.

Existe-t-il un moyen de renvoyer String.prototype.trim () à son code natif?

Y a-t-il un moyen de redéfinir $ .trim ()?

Une autre idée à laquelle je n'ai pas pensé?


0 commentaires

3 Réponses :


1
votes

Vous pouvez remplacer les méthodes principales de jQuery

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
(function(){
    var string = "       TRIM ME      ";
    console.log(jQuery.trim(string));
    // Define overriding method.
    jQuery.trim = function(string){
        return string;
    }
    console.log(jQuery.trim(string));
})();


0 commentaires

1
votes

Remplacez simplement $ .trim () de jQuery en utilisant String.prototype.trim () , puis remplacez String.prototype.trim () avec votre fonction:

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
var trimText = "       Some text       ";

String.prototype.trim = function() {
  return this.replace(/^\s\s*/, "").replace(/\s\s*$/, "")
}

$.trim = function(string) {
  return String.prototype.trim(string);
}

trimText = trimText.trim();

console.log(trimText);


1 commentaires

Cela m'a donné une erreur de dépassement de la pile d'appels maximale, mais cela m'a aidé à trouver la réponse. Je vais vous donner le crédit.



0
votes

Sur la base de la réponse de Jack Bashford, j'ai trouvé ceci.

String.prototype.trim = function(){
  if(typeof this.valueOf(this) === 'string'){
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  } else {
    return this.valueOf(this);
  }
};

$.trim = function(e){
    return String.prototype.trim.call(e);
};

Une partie du problème original était que je devais le réparer de sorte que si $ .trim (nombre) ou $ .trim (array) a été appelé, il ne lancerait pas et l'erreur.


0 commentaires