التابع ‎‎jQuery.htmlPrefilter()‎‎ في jQuery

من موسوعة حسوب
< jQuery‏ | jQuery
(بالتحويل من jQuery/jQuery.htmlPrefilter)

jQuery.htmlPrefilter( html )‎

القيم المعادة

يعيد سلسلةً نصيةً (String).

الوصف

يعدِّل ويرشِّح هذا التابع سلاسل HTML النصية الممرَّرة عبر توابع التعديل (manipulation) في jQuery.

jQuery.htmlPrefilter( html )‎

أُضيف مع الإصدار: 1.12/2.2.

html

سلسلة نصية تحتوي على شيفرة HTML التي يراد تطبيق العمليَّة عليها.

إنَّ الحاجة إلى استدعاء هذا التابع بشكل مباشر أمرٌ نادر الحدوث، إذ يستعمل بدلًا من ذلك كنقطة دخول لتعديل توابع التعديل الموجودة. إن أردنا مثلًا إزالة الوسم <del> من محتوى HTML الوارد، فاستعمل هذا التابع مثلما موضح في الشيفرة التالية:

var htmlPrefilter = $.htmlPrefilter,
  rdel = /<(del)(?=[\s>])[\w\W]*?<\/\1\s*>/gi;
 
$.htmlPrefilter = function( html ) {
  return htmlPrefilter.call( this, html ).replace( rdel, "" );
};

يمكن استبدال هذا التابع أيضًا لتجنب الوقوع في مشكلات حالة حدِّية (edge case) معيَّنة. سيتأكد التابع htmlPrefilter الافتراضي في jQuery من أنَّ جميع الوسوم متوافقة مع XHTML، وهذا يتضمن أي شيء يشبه وسم HTML ولكنه موجود فعليًّا ضمن سلسلة نصية (مثل ‎<a title="<div />"><>‎). يمكن مثلًا استعمال jQuery.htmlPrefilter()‎ لتجنب ما يلي:

$.htmlPrefilter = function( html ) {
  // نصية غير معدلة HTML إعادة سلاسل
  return html;
};

على أي حال، لمًا كانت المشكلة في هذا المثال مختصرة وبسيطة، فإنَّه يضع العبء عليك للتأكد من أنَّ الوسوم في جميع سلاسل HTML النصية متوافقة مع XHTML. تفحَّص الشيفرة التالية التي تمثِّل مشكلات شاملة لما سبق:

var panything = "[\\w\\W]*?",
 
  // (whitespace) مسافات بيضاء
  // https://html.spec.whatwg.org/multipage/infrastructure.html#space-character
  pspace = "[\\x20\\t\\r\\n\\f]",
 
  // (نهاية اسم الوسم (مسافة بيضاء واحدة أو أكثر
  pnameEnd = pspace.replace( "]", ">]" ),
 
  // (اسم وسم (حرف بادئ ثم يتبعه أي شيء تقريبًا
  // https://html.spec.whatwg.org/multipage/syntax.html#tag-open-state
  // https://html.spec.whatwg.org/multipage/syntax.html#tag-name-state
  pname = "[a-z]" + pnameEnd.replace( "[", "[^/\\0" ) + "*",
 
  // (عنصر باطل (وسم نهاية ممنوع
  // https://html.spec.whatwg.org/multipage/syntax.html#void-elements
  pvoidName = "(?:area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|" +
    "source|track|wbr)(?=" + pnameEnd + ")",
 
  // (خاصيات (قيمة مقتبسة بمحرف اقتباس مزدوج أو فردي، أو قيمة غير مقتبسة، أو عدم وجود قيمة
  // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
  pattrs = "(?:" + pspace + "+[^\\0-\\x20\\x7f-\\x9f=\"'/>]+(?:" + pspace + "*=" + pspace +
    "*(?:\"" + panything + "\"|'" + panything + "'|" +
    pnameEnd.replace( "[", "[^" ) + "*(?!/)" +
    ")|))*" + pspace + "*",
 
  // محتوى زائد لوسم الإغلاق
  pcloseTail = "(?:" + pspace + panything + "|)",
 
  rspecialHtml = new RegExp(
    // عنصر سليم مغلق ذاتيًّا: $1–$5
    "(<)(?!" + pvoidName + ")(" + pname + ")(" + pattrs + ")(\\/)(>)|" +
      // No-innerHTML container (element, comment, or CDATA): $6
      "(<(script|style|textarea)" + pattrs + ">" + panything + "<\\/\\7" + pcloseTail + ">|" +
      "<!--" + panything + "--)",
    "gi"
  ),
 
  // "<"; element name; attributes; ">"; "<"; "/"; element name; ">"; no-innerHTML container
  pspecialReplacement = "$1$2$3$5$1$4$2$5$6";
 
$.htmlPrefilter = function( html ) {
  return ( html + "" ).replace( rspecialHtml, pspecialReplacement );
};

مصادر