Heim > Web-Frontend > js-Tutorial > Hauptteil

Lösung für das Problem, dass 7/8 keine Trim-Attribute_Javascript-Fähigkeiten unterstützt

WBOY
Freigeben: 2016-05-16 16:47:05
Original
1059 Leute haben es durchsucht

Wenn Sie in den Browsern IE 7 und 8 das trim()-Attribut zum Entfernen von Leerzeichen verwenden, wird ein Fehler gemeldet.

Daher gibt es die folgenden Lösungen, um dieses Problem zu lösen:

var aa = $("#id").val().trim() --- Die trim()-Methode kann im IE nicht analysiert werden

Lösung:

[ var aa = $.trim($("#id").val() ] Dies ist nicht einfach zu verwenden, also verwenden Sie die unten vorgestellte. Die erste wurde getestet.

Die Köpfe der W3C-Leute wurden von Eseln getreten. Erst in Javascript 1.8.1 wurde die Trim-Funktion (mit trimLeft, trimRight) unterstützt. Leider wird sie jetzt nur von Firefox 3.5 unterstützt. Da das Entfernen von Leerzeichen auf beiden Seiten einer Zeichenfolge so häufig vorkommt, ist es in allen größeren Bibliotheken zu finden. Darüber hinaus sind Ausländer sehr energisch in der Forschung und haben etliche Umsetzungen geschaffen.

Erreiche 1 OK. (Schreiben Sie dies in js und folgen Sie dann .trim() direkt nach der Zeichenfolge, aus der Sie Leerzeichen entfernen möchten)

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
gibt dieses .replace(/^ss*/, '' ).replace(/ss*$/, '' );
}
zurück

Es sieht nicht sehr gut aus. Es verwendet zwei reguläre Ersetzungen. Die tatsächliche Geschwindigkeit ist erstaunlich, hauptsächlich aufgrund der internen Optimierung des Browsers. Ein berühmtes Beispiel ist das String-Splicing, das schneller ist als StringBuffer aus Array. Die base2-Klassenbibliothek verwendet diese Implementierung.

Implementierung 2

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
return this .replace(/^s /, '' ).replace(/s $/, '' );
}

ist der Implementierung 1 sehr ähnlich, jedoch etwas langsamer, hauptsächlich weil zunächst davon ausgegangen wird, dass mindestens ein Leerzeichen vorhanden ist. Prototype.js verwendet diese Implementierung, aber ihr Name ist Strip, da die Methoden von Prototype darauf abzielen, denselben Namen wie Ruby zu haben.

Erreiche 3

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
returnthis .substring(Math.max( this .search(/S/), 0), this .search(/Ss*$/) 1);
}

Erhalten Sie den leeren Teil durch Abfangen (natürlich sind Leerzeichen in der Mitte zulässig), und es werden insgesamt 4 native Methoden aufgerufen. Die Standardeinstellung ist sehr clever, der Teilstring verwendet zwei Zahlen als Parameter. Math.max verwendet zwei Zahlen als Parameter und die Suche gibt eine Zahl zurück. Die Geschwindigkeit ist etwas langsamer als bei den beiden oben genannten, aber schneller als bei den meisten der folgenden.

Erreiche 4

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
returnthis .replace(/^s |s $/g, '' );
}

Dies kann als vereinfachte Version der Implementierung 2 bezeichnet werden, die Kandidatenoperatoren verwendet, um zwei reguläre Ausdrücke zu verbinden. Dadurch wird jedoch die Gelegenheit zur Browseroptimierung verpasst, die der Implementierung 3 unterlegen ist. Da es sehr elegant aussieht, wird es von vielen Bibliotheken verwendet, beispielsweise JQuery und Mootools

Erreiche 5

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
var str = this ;
str = str.match(/S (?:s S )*/);
return str ? str[0] : '' ;
}

match gibt ein Array zurück, sodass die Teile der ursprünglichen Zeichenfolge, die die Anforderungen erfüllen, zu ihren Elementen werden. Um zu verhindern, dass die Leerzeichen in der Mitte der Zeichenfolge entfernt werden, müssen wir eine nicht erfassende Gruppierung (?:exp) verwenden. Da das Array möglicherweise leer ist, werden wir später weitere Urteile fällen. Es scheint, dass der Browser bei der Verarbeitung von Gruppierungen relativ schwach ist und ein Wort langsam ist. Seien Sie also nicht abergläubisch, was die Regelmäßigkeit angeht, obwohl sie im Grunde allmächtig ist.

Erreiche 6

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
return this .replace(/^s*(S*(s S )*)s*$/, '$1' );
}

Stellen Sie die Teile bereit, die den Anforderungen entsprechen, und fügen Sie sie in eine leere Zeichenfolge ein. Allerdings ist die Effizienz insbesondere im IE6 sehr schlecht.

Erreiche 7

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
return this .replace(/^s*(S*(?:s S )*)s*$/, '$1' );
}

Es ist der Implementierung 6 sehr ähnlich, nutzt jedoch eine nicht erfassende Gruppierung, um davon zu profitieren, und die Leistungseffizienz ist leicht verbessert.

Erreiche 8

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
return this .replace(/^s*((?:[Ss]*S)?)s*$/, '$1' );
}

Verbesserung entlang der beiden oben genannten Ideen, Verwendung nicht erfassender Gruppen und Zeichensätze und Verwendung von ? anstelle von *. Der Effekt ist erstaunlich. Insbesondere im IE6 kann diese Leistungsverbesserung als verrückt bezeichnet werden, was Firefox direkt zum Erliegen bringt.

Implementierung 9

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
return this .replace(/^s*([Ss]*?)s*$/, '$1' );
}

Dieses Mal wird Lazy Matching verwendet, um nicht erfassende Gruppen zu ersetzen, was in Firefox IE verbessert wurde und nicht so verrückt ist wie beim letzten Mal.

Erreiche 10

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
var str = this ,
whitespace = ' nrtfx0bxa0u2000u2001u2002u2003u2004u20 05u2006u2007u2008u2009u200au200bu2028u2029 u3000' ;
for ( var i. = 0,len = str.length; i = 0; i--) {
if ( whitespace.indexOf (str.charAt(i)) === -1) {
str = str.substring(0, i 1);
break ;
}
}
return whitespace.indexOf (str.charAt(0)) === -1 ? str : '' ;
}

Ich möchte nur sagen, dass die Person, die das geschaffen hat, nicht mehr als Kuh beschrieben wird, sondern sich bereits auf der Ebene eines Gottes befindet. Es listet zunächst alle möglichen Leerzeichen auf, schneidet beim ersten Durchlauf das führende Leerzeichen und im zweiten Durchgang das folgende Leerzeichen ab. Der gesamte Prozess verwendet nur indexOf und substring, bei denen es sich um native Methoden handelt, die speziell für die Verarbeitung von Zeichenfolgen entwickelt wurden, und es werden keine regulären Regeln verwendet. Die Geschwindigkeit ist erstaunlich hoch und soll der internen Binärimplementierung nahekommen und eine hervorragende Leistung in IE und Firefox (und natürlich auch in anderen Browsern) bieten. Die Geschwindigkeit beträgt null Millisekunden.

Erreiche 11

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
var str = this ,
str = str.replace(/^s /, '' );
for ( var i = str.length - 1; i >= 0; i-- ) {
if (/S/.test(str.charAt(i))) {
str = str.substring(0, i 1);
break ;
}
}
return str;
}

Implementierung 10 hat uns gezeigt, dass die gewöhnliche Methode zum Abfangen unbekannter Zeichenfolgen weitaus besser ist als die reguläre Ersetzung, obwohl sie etwas komplizierter ist. Solange der reguläre Ausdruck jedoch nicht zu kompliziert ist, können wir die Optimierung des regulären Ausdrucks durch den Browser verwenden, um die Effizienz der Programmausführung zu verbessern und 8-Leistung im IE zu erzielen. Ich denke, normalerweise wird niemand die Implementierung 10 in seinen Projekten verwenden, da die Leerzeichenimplementierung zu lang und schwer zu merken ist (natürlich ist es definitiv die erste, wenn Sie eine Klassenbibliothek erstellen). Man kann sagen, dass es sich bei Implementierung 11 um eine verbesserte Version handelt. Der Leerraum im vorderen Teil wird durch regelmäßiges Ersetzen abgeschnitten, und der letzte Teil wird mit nativen Methoden verarbeitet. Der Effekt ist der Originalversion nicht unterlegen, aber die Geschwindigkeit ist sehr hoch unglaublich.

Erreiche 12

Code kopieren Der Code lautet wie folgt:

String.prototype.trim = function () {
var str = this ,
str = str.replace(/^ss*/, '' ),
ws = /s/,
i = str.length;
while (ws. test(str.charAt(--i)));
return str.slice(0, i 1);
}

实现10与实现11在写法上更好的改进版,注意说的不是性能速度,而是易记与施用上。和它的两个先辈都是零毫秒级另外,以后就用这个来工作与吓人。

下面是老外给出的比力结果,执行背景是对Magna Carta 这文章(超过27,600字符)进行trim操作。

实现 Firefox 2 IE 6

trim1 15ms trim2 31ms trim3 46ms 31ms
trim4 47ms 46ms
trim5 156ms 1656ms
trim6 172ms 2406ms
trim7 172ms 1640ms
trim8 281ms trim9 125ms 78ms

trim10 trim11 trim12 trim函数实现揭晓自己的想法,想懂得原作者说什么请看原文。



JS去除空格的方法目前共有12种:

实现1
String.prototype.trim = function() { return this.replace(/^ss*/, '' ).replace(/ss*$/, ''); }
实现2
String.prototype.trim = function() { return this.replace(/^s /, '').replace(/s $/, ''); }
实现3
String.prototype.trim = function() { return this.s string(Math.max(this.search(/S/), 0),this.search(/Ss*$/ ) 1); }
实现4
String.prototype.trim = function() { return this.replace(/^s |s $/g, ''); }
String.prototype.trim = function() { var str = this; str = str.match(/S (?:s S )*/); str zurückgeben? str[0] : ''; }
String.prototype.trim = function() { return this.replace(/^s*(S*(s S )*)s*$/, '$1'); }
实现7
String.prototype.trim = function() { return this.replace(/^s*(S*(?:s S )*)s*$/, '$1'); }
String.prototype.trim = function() { return this.replace(/^s*((?:[Ss]*S)?)s*$/, '$1'); }
String.prototype.trim = function() { return this.replace(/^s*([Ss]*?)s*$/, '$1'); }
String.prototype.trim = function() { var str = this, whitespace = ' nrtfx0bxa0?????????????? '; for (var i = 0,len = str.length; i < len; i ) { if (whitespace.indexOf(str.charAt(i)) === -1) { str = str.s string(i) ; brechen; } } for (i = str.length - 1; i >= 0; i--) { if (whitespace.indexOf(str.charAt(i)) === -1) { str = str.s string( 0, ich 1); brechen; } } return whitespace.indexOf(str.charAt(0)) === -1 ? str: ''; }
实现11
String.prototype.trim = function() { var str = this, str = str.replace(/^s /, ''); for (var i = str.length - 1; i >= 0; i--) { if (/S/.test(str.charAt(i))) { str = str.s string(0, i 1 ); brechen; } } return str; }
实现12
String.prototype.trim = function() { var str = this, str = str.replace(/^ss*/, ''), ws = /s/, i = str. Länge; while (ws.test(str.charAt(--i))); return str.slice(0, i 1); }

看起来不怎么样, 动用了两次正则替换, 实际速度非常惊人, 主要得益于浏览器的内部优化.一个著名的例子字符串拼接, 直接相加比用Array做成的StringB?r 还快.base2类库使用这种实现。

和实现1 Prototyp.js-Datei这种实现,不过其名字为strip,因为 Prototype的方法都是力求与R y同名。

以截取方式取得空白部分(当然允许中间存在空白符),总共 调用了四个原生方法s string.Math.max两个慢一点,但比下面大多数都快。

这个可以称得上实现2的简化版,就是.但这样做就失去了浏览器优化的机会,比不上实现3.由于看来很优雅,许多类库都使用它,如JQ ry与mootools

实现5

match 是返回一个数组,因此原字符串符合要求的部分就成为它的元素.为了防止字符串中间的空白符被排除,我们需要动用到非捕获性分组(?:exp)).要做进一步的判定.好像浏览器在处理分组上比较无力,一个字慢。所以不要迷信正则,虽然它基本上是万能的。

实现6

把符合要求的部分提供出来,放到一个空字符串中.不过效率很差,尤其是在IE6中🎜>
实现8

沿着上面两个的思路进行改进,动用了非捕获分组与字符集合,用?顶替了*,效果非常惊人.尤其IE6中, 以用疯狂来形容这次性能的提升, 直接秒杀火狐.

实现9

这次是用懒惰匹配疯狂。

实现10

我 只想说,搞出这个的人已经不是用牛来形容,已是神一样的级别.它先是把可能的空白符全部列出来, 在第一次遍历中砍掉前面的空白, 第二次砍掉后面的空白.全 过程只用了indexOf与s string这个专门为处理字符串而生的原生方法,没有使用到正则.速度快得惊人,估计直逼上内部的二进制实现,并且在IE与火狐(其他浏览器当然也毫无疑问)都有良好的表现。速度都是零毫秒级别的。

实现10已经告诉我们普通的原生字符串截取方法是远胜于正则替换, 虽然是复杂一点序执行效率,如实现8在IE的表现.我想通常不会有人在项目中应用实现10 ,因为那个 Leerzeichen 实现太长太难记了(当然如果你在打造一个类库,它绝对是首先)。Man kann sagen, dass es sich bei Implementierung 11 um eine verbesserte Version handelt. Die Rohlinge im vorderen Teil werden durch regelmäßiges Ersetzen abgeschnitten, und der letzte Teil wird mit nativen Methoden verarbeitet. Der Effekt ist der Originalversion nicht unterlegen, aber die Geschwindigkeit ist sehr unglaublich .

Implementierung 10 und Implementierung 11 sind bessere und verbesserte Versionen in Bezug auf das Schreiben. Beachten Sie, dass es nicht um Leistung und Geschwindigkeit geht, sondern um Benutzerfreundlichkeit und Speicherfreundlichkeit. Beide Vorgänger sind auf dem Null-Millisekunden-Niveau. Ich werde dies in Zukunft zum Arbeiten und Einschüchtern verwenden.
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!