ホームページ  >  記事  >  ウェブフロントエンド  >  IE 7/8 がトリム属性_JavaScript スキルをサポートしていない場合の解決策

IE 7/8 がトリム属性_JavaScript スキルをサポートしていない場合の解決策

WBOY
WBOYオリジナル
2016-05-16 16:47:051059ブラウズ

IE 7 および 8 ブラウザでは、trim() 属性を使用してスペースを削除すると、エラーが報告されます。

したがって、この問題を解決するには次の解決策があります:

var aa = $("#id").val().trim() --- Trim() メソッドは IE

では解析できません

解決策:

[ var aa = $.trim($("#id").val()); これは使いにくいので、以下で紹介するものを使用してください。

W3C の人々の頭はロバに蹴られました。トリム関数 (trimLeft、trimRight) がサポートされたのは JavaScript 1.8.1 まででした。残念ながら、現在は Firefox 3.5 のみがサポートしています。文字列の両側の空白を削除することは非常に一般的であるため、すべての主要なライブラリに含まれています。また、外国人の研究は非常に精力的で、かなりの数の実装を行っています。

1 OK を達成します。 (これを js で記述し、スペースを削除したい文字列の直後に .trim() を続けます)

コードをコピー コードは次のとおりです。

String.prototype.trim = function () {
これを返す .replace(/^ss*/, '' ).replace(/ss*$/, '' );
}

見た目はあまり良くありませんが、通常の置換を 2 つ使用しています。主にブラウザの内部最適化により、実際の速度は驚くべきものになります。有名な例は文字列の結合です。Array で作成した StringBuffer よりも直接加算した方が高速です。 Base2 クラス ライブラリはこの実装を使用します。

実装 2

コードをコピー コードは次のとおりです。

String.prototype.trim = function () {
これを返す .replace(/^s /, '' ).replace(/s $/, '' );
}

は実装 1 と非常に似ていますが、主に少なくとも 1 つの空白文字があることを最初に前提としているため、わずかに遅くなります。 Prototype.js はこの実装を使用しますが、Prototype のメソッドは Ruby と同じ名前を持つように努めているため、その名前はstrip です。

3 を達成する

コードをコピー コードは次のとおりです。

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

空白部分をインターセプトで取得し(もちろん途中の空白文字も可)、合計4つのネイティブメソッドが呼び出されます。デフォルトは非常に賢明で、substring はパラメータとして 2 つの数値を取ります。 Math.max はパラメータとして 2 つの数値を受け取り、検索では 1 つの数値が返されます。速度は上の 2 つよりも少し遅くなりますが、以下のほとんどのものよりは高速です。

4 を達成

コードをコピー コードは次のとおりです。

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

これは実装 2 の簡易バージョンと呼ぶことができ、候補演算子を使用して 2 つの正規表現を接続します。ただし、そうするとブラウザの最適化の機会が失われるため、実装 3 よりも劣ります。非常にエレガントに見えるため、JQuery や mootools

など、多くのライブラリで使用されています。

5 を達成する

コードをコピー コードは次のとおりです。

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

match は配列を返すため、要件を満たす元の文字列の部分がその要素になります。文字列の途中にある空白文字が削除されないようにするには、非キャプチャ グループ化 (?:exp) を使用する必要があります。配列が空の場合もあるので、後でさらに判断します。ブラウザはグループ分けの処理が比較的弱いようで、1単語が遅いです。したがって、規則性は基本的に全能ですが、規則性について迷信を持たないでください。

6 を達成する

コードをコピー コードは次のとおりです。

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

要件を満たす部分を提供し、空の文字列に入れます。ただし、特に IE6 では効率が非常に悪くなります。

7 を達成する

コードをコピー コードは次のとおりです。

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

実装 6 と非常に似ていますが、非キャプチャ グループ化を使用してそれを利用し、パフォーマンス効率がわずかに向上しています。

8 を達成する

コードをコピー コードは次のとおりです。

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

上記の 2 つのアイデアに従って、非キャプチャ グループと文字セットを使用し、* の代わりに ? を使用することで改善されました。特に IE6 におけるこのパフォーマンス向上は、Firefox を直接破壊する狂気の沙汰と言えるでしょう。

実装 9

コードをコピー コードは次のとおりです。

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

今回は、非キャプチャ グループを置き換えるために遅延マッチングが使用されます。これは Firefox で改善されており、前回ほどクレイジーではありません。

10 を達成

コードをコピー コードは次のとおりです。

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 : '' ;
}

言いたいのは、これを作った人はもはや牛とは言えず、すでに神のレベルに達しているということです。まず、考えられるすべての空白文字をリストし、最初の走査で先頭の空白を切り取り、2 番目のパスで後続の空白を切り取ります。プロセス全体では、文字列を処理するために特別に設計されたネイティブ メソッドである、indexOf と substring のみを使用し、通常のルールは使用しません。速度は驚くほど速く、内部バイナリ実装に近い速度であることが期待されており、IE と Firefox (もちろん他のブラウザでも) で優れたパフォーマンスを発揮します。速度はゼロミリ秒です。

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.substring(0, i 1);
break ;
}
}
return str;
}

実装 10 は、少し複雑ではありますが、通常の未知の文字列インターセプト方法が通常の置換よりもはるかに優れていることを示しています。ただし、正規表現が複雑すぎない限り、ブラウザの正規表現の最適化を使用してプログラムの実行効率を向上させ、IE で 8 のパフォーマンスを達成できます。空白の実装は長すぎて覚えるのが難しいため、通常は誰も実装 10 をプロジェクトで使用しないと思います (もちろん、クラス ライブラリを構築している場合は、間違いなく最初の実装です)。 Implementation 11 は改良版と言えます。前部のブランクは定期的な置き換えによってカットされ、後部はネイティブな方法で処理されます。効果はオリジナル バージョンに劣りませんが、速度は非常に驚異的です。 。

12 を達成

コードをコピー コードは次のとおりです。

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[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 = 0; i--) { if (whitespace.indexOf(str.charAt(i)) === -1) { str = str.s string( 0、i 1);壊す; } } 戻り値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) );壊す;文字列を返します。 }
实现12
String.prototype.trim = function() { var str = this, str = str.replace(/^ss*/, ''), ws = /s/, i = str.長さ; while (ws.test(str.charAt(--i))); str.slice(0, i 1) を返します。 }

は、2 回の正しい置換を使用して実行され、非常に高速で、主にデバイスの内部拡張から利益を得ています。

と、実際の 1 はほぼ似ていますが、最も遅いのは、最初に少なくとも 1 つの空白文字が存在するように設計されていることが主な原因です。

は、プロトタイプの方法がすべて R y と同じ名前であるため、空白部分を取得し (当然、途中に空白が存在することは許可されます)、4 つの生成方法を共通に使用します。設定は非常にうまく、文字列は 2 つの数字をパラメータとして使用します。Math.max は 2 つの数字をパラメータとして使用し、検索すると 1 つの数字が返されます。 >
これは、上実現 2 のバージョンと呼ばれるもので、適切な操作子を使用して 2 つの正規のものを接続するものです。 JQ ry と mootools

が一致すると、

の一致は 1 つの数値グループを返します。そのため、文字列結合要求の部分がその要素になります。中間の空白文字は除外され、非捕捉性のコンポーネント (?:exp) に使用する必要があります。数値グループは空の可能性があるため、後続の判定が行われます。

は、6 つの

によって要求された符号化部分が提供され、空文字列に配置されます。

と実現 6 は似ていますが、非キャプチャ ブロックが使用されるため、パフォーマンスが若干向上しています。上の 2 つの思考回路に沿って変更が加えられ、非キャプチャー パケットと文字セットが動作し、? が * に置き換えられ、非常に優れた効果が得られます。

は 9

を実行します。これは、捕捉されないコンポーネントの代わりに不使用のマッチングを使用して、火狐で改善が得られ、IE には次のような狂気はありません。

は 10

私がただ思うのは、この人はすでに牛の形をしているわけではなく、神のような階級でした。プロセス全体で、この文字列を処理する文字列である IndexOf を使用するだけで、内部で直接実行される 2 番目の方法が使用されません。

10 件の報告を達成するのは、私にとってごく一般的な原文の取得方法です。しかし、それが単純でない場合に限り、IE の表 8 に示すように、ブラウザーを使用してプログラムの実行効率を改善することもできます。空白があると非常に長くなりますので、当然のことながら(ある種類のグループを作成する場合は、そのペアが最初になります)。Implementation 11 は改良版と言えます。前部の空白は定期的な置き換えによってカットされ、後部はネイティブな方法で処理されます。効果は元のバージョンに劣りませんが、速度は非常に高速です。 。

実装 10 と実装 11 は、記述の点で優れており、改良されたバージョンです。これはパフォーマンスや速度に関するものではなく、記憶しやすさや使いやすさに関するものであることに注意してください。その 2 つの前任者はどちらもゼロミリ秒レベルであり、今後はこれを仕事や脅迫に使用します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。