في متصفح IE 7 8 ، إذا كنت تستخدم سمة TRIM () لإزالة المسافات ، فسيتم الإبلاغ عن خطأ.
لذلك ، هناك الحلول التالية لهذه المشكلة:
var aa = $ ("#id"). val (). trim () --- لا يمكن تحليل طريقة trim () في أي
حل:
[var aa = $ .trim ($ ("#id"). val ()) ؛ ] هذا ليس بالأمر السهل في الاستخدام ، لذا استخدم الشخص الذي تم تقديمه أدناه. تم اختبار أول واحد.
تم ركل مجموعة W3C من الأشخاص في الرؤوس بواسطة الحمير ، ولم يدعموا وظائف القطع (و Trimleft ، trimright) حتى Java Script 1.8.1. لسوء الحظ ، يدعمها Firefox3.5 فقط الآن. نظرًا لأن إزالة الفراغات على جانبي السلاسل أمر شائع للغاية ، فإن جميع المكتبات الرئيسية لها ظلالها الخاصة. بالإضافة إلى ذلك ، يتمتع الأجانب بالكثير من الطاقة البحثيين وقد حققوا الكثير من الإنجازات.
تنفيذ 1 موافق. (اكتب هذا في JS ، ثم اتبع السلسلة التي تريد إزالة المساحة مباشرة. trim ())
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .replace (/^/s/s*/، '') .replace (// s/s*$/، '') ؛
}
لا تبدو جيدة جدًا ، وقد استخدمت استبدالتين منتظمتين. السرعة الفعلية مذهلة ، ويرجع ذلك أساسا إلى التحسين الداخلي للمتصفح. مثال مشهور على الربط السلسلة ، الإضافة المباشرة أسرع من سلسلة StringBuffer المصنوعة من صفيف. تقوم مكتبة فئة BASE2 بتطبيق هذا التنفيذ.
تنفيذ 2
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .replace (/^/s/، '') .replace (// s $/، '') ؛
}
إنه مشابه تمامًا للتنفيذ 1 ، ولكنه أبطأ قليلاً ، والسبب الرئيسي هو أنه يفترض أولاً أن هناك مساحة بيضاء واحدة على الأقل. يستخدم النموذج الأولي هذا التنفيذ ، لكن اسمه عبارة عن شريط ، لأن طرق النموذج الأولي تحاول إعادة تسميته باستخدام Ruby.
التنفيذ 3
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .substring (Math.Max (هذا .search (// s/) ، 0) ، هذا .search (// s/s*$/) 1) ؛
}
يتم الحصول على الجزء الفارغ عن طريق الاعتراض (بالطبع ، يُسمح بأحرف المسافة البيضاء في الوسط) ، ويتم استدعاء ما مجموعه 4 طرق أصلية. الإعداد المسبق ذكي للغاية ، ويأخذ السلسلة الفرعية رقمين كمعلمات. يستخدم Math.Max رقمين كمعلمات ، ويعود البحث إلى رقم واحد. السرعة أبطأ قليلاً من أعلى اثنين ، لكنها أسرع بكثير من القاع.
تنفيذ 4
نسخة الكود كما يلي:
string.prototype.trim = function () {
returnThis .replace (/^/s |/s $/g ، '') ؛
}
يمكن أن يطلق على ذلك نسخة مبسطة من التنفيذ 2 ، والتي تتمثل في استخدام مشغلي المرشحين لربط اثنين من النظامين. لكن القيام بذلك سيفشل في تحقيق فرص تحسين المتصفح ، والتي ليست جيدة مثل الإدراك 3. لأنه يبدو أنيقة ، العديد من تطبيقات المكتبات مثل jQuery و Mootools
تنفيذ 5
نسخة الكود كما يلي:
string.prototype.trim = function () {
var str = هذا ؛
str = str.match (// s (؟:/s/s)*/) ؛
إرجاع شارع؟ str [0]: '' ؛
}
تتمثل المطابقة في العودة إلى صفيف ، والجزء الذي يلبي متطلبات السلسلة الأصلية يصبح عنصره. من أجل منع المساحة الفارغة في منتصف السلسلة من فصلها ، نحتاج إلى استخدام التجميع غير المكتسب (؟: exp). نظرًا لأن الصفيف قد يكون فارغًا ، نحتاج إلى إصدار المزيد من الأحكام لاحقًا. يبدو أن المتصفح أقل قوة في المعالجة ، وكلمة واحدة أبطأ. لذلك لا تكن خرافيًا بشأن القواعد ، على الرغم من أنها في الأساس كليًا.
التنفيذ 6
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .replace (/^/s*(/s*(/s/s)*)/s*$/، '$ 1') ؛
}
قدم الجزء المطلوب ووضعه في سلسلة فارغة. لكن الكفاءة سيئة للغاية ، خاصة في IE6.
التنفيذ 7
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .replace (/^/s*(/s*(؟:/s/s)*)/s*$/، '$ 1') ؛
}
إنه يشبه إلى حد كبير التنفيذ 6 ، لكنه يستخدم حزم غير ملتوية لتوفير المزايا ، وتحسن كفاءة الأداء قليلاً.
التنفيذ 8
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .replace (/^/s*((؟: [/s/s]*/s)؟)/s*$/، '$ 1') ؛
}
لقد قمت بتحسين الأفكار أعلاه ، واستخدمت مجموعات التجميع والشخصيات غير المشتركة ، واستبدلت * ، والتي كانت مذهلة. لا سيما في IE6 ، يمكن استخدام الجنون لوصف تحسين الأداء هذا ، وقتل Firefox مباشرة في ثوان.
تنفيذ 9
نسخة الكود كما يلي:
string.prototype.trim = function () {
إرجاع هذا .replace (/^/s*([/s/s]*؟)/s*$/، '$ 1') ؛
}
هذه المرة ، استخدمت مطابقة كسول لاستبدال التجمعات غير المشتركة ، والتي تم تحسينها في Firefox ، ولم تكن أي مجنونة مثل المرة الأخيرة.
إدراك 10
نسخة الكود كما يلي:
string.prototype.trim = function () {
var str = هذا ،
Whitespace = '/n/r/t/x0b/xa0/u2000/u2001/u2002/u2003/u2004/u2020 05/u2006/u2007/u2008/u2009/u200a/u200b/u2028/u2029/u3000' ؛
لـ (var i = 0 ، len = str.length ؛ i = 0 ؛ i--) {
if (whitespace.indexof (str.charat (i)) === -1) {
str = str.substring (0 ، i 1) ؛
استراحة؛
}
}
إرجاع whitespace.indexof (str.charat (0)) === -1؟ Str: '' ؛
}
أريد فقط أن أقول إن الشخص الذي أنشأ هذا لم يعد يوصف بأنه بقرة ، ولكن في نفس مستوى الله. يسرد أولاً جميع الأحرف الفارغة الممكنة ، ويقطع الفراغ الأمامي في أول اجتياز ، ويقطع الظهر فارغًا للمرة الثانية. تستخدم العملية بأكملها فقط IndexOF و Sundring ، وهي طريقة أصلية مصممة خصيصًا للسلاسل المعالجة ، ولا تطبق الانتظام. السرعة سريعة بشكل مثير للدهشة ، ومن المتوقع أن تكون قريبة من التنفيذ الثنائي الداخلي ، ولها أداء رائع في IE و Firefox (بالطبع المتصفحات الأخرى بلا شك). السرعات كلها صفر مللي ثانية بالإضافة إلى ذلك.
تنفيذ 11
نسخة الكود كما يلي:
string.prototype.trim = function () {
var str = هذا ،
str = str.replace (/^/s/، '') ؛
لـ (var i = str.length-1 ؛ i> = 0 ؛ i--) {
if (//s/.test(str.charat(i))) {
str = str.substring (0 ، i 1) ؛
استراحة؛
}
}
إرجاع شارع
}
أخبرنا التنفيذ 10 أن طريقة اعتراض السلسلة العادية غير المعروفة في الأصل أفضل بكثير من الاستبدال العادي ، على الرغم من أنها أكثر تعقيدًا بقليل. ولكن طالما أن الانتظام ليس معقدًا للغاية ، يمكننا استخدام المتصفح لتحسين الانتظام لتحسين كفاءة تنفيذ البرنامج ، وتحقيق 8 أداء في IE. لا أعتقد أن أي شخص يقوم عادة بتطبيق التطبيق 10 في مشروع ما ، لأن تطبيق المسافة البيضاء طويلة جدًا ويصعب تذكره (بالطبع ، إذا كنت تقوم ببناء مكتبة الفصل ، فستبدأ بالتأكيد). يمكن أن يقال إن تطبيق 11 هو نسخته المحسنة. يتم قطع الفراغات في المقدمة عن طريق استبدال منتظم. يتم التعامل معها بالطرق الأصلية لاحقًا. التأثير ليس أدنى من الإصدار الأصلي ، ولكن السرعة مذهلة.
تنفيذ 12
نسخة الكود كما يلي:
string.prototype.trim = function () {
var str = هذا ،
str = str.replace (/^/s/s*/، '') ،
ws = // s/،
i = str.length ؛
بينما (Ws.Test (str.charat (-i))) ؛
إرجاع str.slice (0 ، i 1) ؛
}
نسخة تحسين أفضل من التنفيذ 10 والتنفيذ 11 مكتوب. لاحظ أنه لا يتعلق سرعة الأداء ، ولكن حول سهولة الذاكرة والتطبيق. بالإضافة إلى أن سابقياها صفر مللي ثانية بالإضافة إلى ذلك ، سيستخدمان هذا للعمل ويخيفون الناس في المستقبل.
فيما يلي نتيجة المقارنة التي قدمها الأجانب. تتمثل خلفية التنفيذ في إجراء عمليات تقليم في هذه المقالة (أكثر من 27600 حرفًا).
تنفيذ Firefox 2 أي 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 TRIM10 TRIM12 عن أفكارك الخاصة. إذا كنت تريد أن تفهم ما قاله المؤلف الأصلي ، فيرجى قراءة النص الأصلي.
يوجد حاليًا 12 طريقة لإزالة المساحات في JS:
تنفيذ 1
string.prototype.trim = function () {return this.replace (/^/s/s*/، '') .replace (// s/s*$/، '') ؛ }
تنفيذ 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 (// s/s*$/) + 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*((؟: [/s/s]*/s)؟)/s*$/، '$ 1') ؛ }
string.prototype.trim = function () {return this.replace (/^/s*([/s/s]*؟)/s*$/، '$ 1') ؛ }
string.prototype.trim = function () {var str = this ، whitespace = ' /n/r/t/f/x0b/xa0/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟/؟ لـ (var i = 0 ، len = str.length ؛ i <len ؛ i ++) {if (whitespace.indexof (str.charat (i)) === -1) {str.s str.s (i) ؛ استراحة؛ }} لـ (i = str.length -1 ؛ i> = 0 ؛ i--) {if (whitespace.indexof (str.charat (i)) === -1) {str.s string (0 ، i + 1) ؛ استراحة؛ }} return whitespace.indexof (str.charat (0)) === -1؟ Str: '' ؛ }
تنفيذ 11
string.prototype.trim = function () {var str = this ، str = str.replace (/^/s+/، '') ؛ لـ (var i = str.length-1 ؛ i> = 0 ؛ i--) {if (//s/ استراحة؛ }} return str ؛ }
تنفيذ 12
string.prototype.trim = function () {var str = this ، str = str.replace (/^/s/s*/، '') ، ws = // s/، i = str.length ؛ بينما (Ws.Test (str.charat (-i))) ؛ إرجاع str.slice (0 ، i + 1) ؛ }
لا تبدو جيدة جدًا ، وقد استخدمت استبدالتين منتظمتين ، والسرعة الفعلية مذهلة ، ويرجع ذلك أساسًا إلى التحسين الداخلي للمتصفح. مثال مشهور على الربط السلسلة ، وهو أسرع من StringB المصنوع من صفيف. تستخدم مكتبة فئة BASE2 هذا التنفيذ.
إنه مشابه جدًا للتنفيذ 1 ، ولكنه أبطأ قليلاً ، لأنه يفترض أولاً أن هناك مساحة بيضاء واحدة على الأقل. يستخدم النموذج الأولي هذا التنفيذ ، لكن اسمه هو الشريط ، لأن طريقة النموذج الأولي تسعى جاهدة للحصول على نفس اسم R y.
يتم الحصول على الجزء الفارغ عن طريق الاعتراض (بالطبع ، يُسمح بحرف المسافة البيضاء في الوسط) ، ويتم استدعاء ما مجموعه أربع طرق أصلية. تم تصميمه بذكاء للغاية ، وتأخذ سلسلة S رقمين كمعلمات. يأخذ Math.Max رقمين كمعلمات ، ويقوم البحث بإرجاع رقم. السرعة أبطأ قليلاً من الاثنين أعلاه ، ولكن أسرع من معظم أدناه.
يمكن أن يطلق على ذلك نسخة مبسطة من التنفيذ 2 ، والتي تتمثل في استخدام مشغلي المرشحين لتوصيل قاعدتين. لكن القيام بذلك سيفقد الفرصة لتحسين المتصفح ، وهو ليس جيدًا مثل الإدراك 3. لأنه يبدو أنيقة ، تستخدم العديد من المكتبات الفصول الدراسية ، مثل JQ RY و Mootools
تنفيذ 5
إرجاع Match Retray ، وبالتالي يصبح جزء السلسلة الأصلية التي تلبي المتطلبات عنصرها. من أجل منع المسافة البيضاء في منتصف السلسلة من استبعادها ، نحتاج إلى استخدام التجميع غير المشترك (؟: exp). نظرًا لأن الصفيف قد يكون فارغًا ، نحتاج إلى إصدار المزيد من الأحكام لاحقًا. يبدو أن المتصفح ضعيف في المعالجة ، وكلمة واحدة بطيئة. لذلك لا تكن خرافيًا بشأن القواعد ، على الرغم من أنها في الأساس كليًا.
التنفيذ 6
قدم الجزء المطلوب ووضعه في سلسلة فارغة. لكن الكفاءة سيئة للغاية ، خاصة في IE6.
إنه يشبه إلى حد كبير التنفيذ 6 ، لكنه يستخدم حزم غير ملتوية لتوفير المزايا ، وتحسن كفاءة الأداء قليلاً.
التنفيذ 8
لقد قمت بتحسين الأفكار أعلاه ، واستخدمت مجموعات التجميع والشخصيات غير المشتركة ، واستبدلت * ، والتي كانت مذهلة للغاية. لا سيما في IE6 ، يمكن استخدام الجنون لوصف تحسين الأداء هذا ، وقتل Firefox مباشرة في ثوان.
تنفيذ 9
هذه المرة ، استخدمت مطابقة كسول لاستبدال التجمعات غير المشتركة ، والتي تم تحسينها في Firefox ، ولم تكن أي مجنونة مثل المرة الأخيرة.
إدراك 10
أريد فقط أن أقول إن الشخص الذي أنشأ هذا لم يعد يوصف بأنه بقرة ، ولكن في نفس مستوى الله. يسرد أولاً جميع الفراغات الممكنة ، ويقطع الفراغات الأمامية في أول اجتياز ، ويقطع الفراغات الخلفية للمرة الثانية. تستخدم العملية بأكملها فقط سلسلة IndexOF و S ، وهي طريقة أصلية مصممة خصيصًا للسلاسل المعالجة ، ولا تستخدم الانتظام. السرعة سريعة بشكل مثير للدهشة ، وربما تكون قريبة من التنفيذ الثنائي الداخلي ، ولديها أداء جيد في IE و Firefox (بالطبع ، المتصفحات الأخرى بلا شك). السرعة كلها في الصفر ميلي ثانية.
أخبرنا التنفيذ 10 أن طريقة اعتراض السلسلة الأصلية العادية أفضل بكثير من الاستبدال العادي ، على الرغم من أنها أكثر تعقيدًا قليلاً. ولكن طالما أن الانتظام ليس معقدًا للغاية ، يمكننا استخدام المتصفح لتحسين الانتظام لتحسين كفاءة تنفيذ البرنامج ، مثل تحقيق 8 أداء في IE. لا أعتقد أن أي شخص يقوم عادة بتطبيق التنفيذ 10 في مشروع ما ، لأن تطبيق المسافة البيضاء طويلة جدًا ويصعب تذكره (بالطبع إذا كنت تقوم ببناء مكتبة الفصل ، فهذا بالتأكيد الأول). يمكن أن يقال إن تطبيق 11 هو نسخته المحسنة. يتم قطع الفراغات في الجزء الأول عن طريق استبدال منتظم ، ويتم المعالجة اللاحقة بالطرق الأصلية. التأثير ليس أدنى من الإصدار الأصلي ، ولكن السرعة مذهلة للغاية.
إن إصدار تحسين أفضل لطريقة الكتابة للتنفيذ 10 والتنفيذ 11 لا يتعلق سرعة الأداء ، ولكن حول سهولة الذاكرة والاستخدام. واثنين من سابقيها على مستوى صفر ميلي ثانية ، لذلك سوف أستخدم هذا للعمل والخوف في المستقبل.