Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions entries/jQuery.htmlPrefilter.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?xml version="1.0"?>
<entry type="method" name="jQuery.htmlPrefilter" return="String">
<title>jQuery.htmlPrefilter()</title>
<desc>Modify and filter HTML strings passed through <a href="/category/manipulation/">jQuery manipulation methods</a>.</desc>
<signature>
<added>1.12/2.2</added>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can't remember or find any method that has the double version. I'm fine with this line but I wonder if we have any other example for consistency.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tried to find one, but I think this is the first. Not sure which I'd pick were I forced to pick one.

<argument name="html" type="String">
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The type is correct but I wonder if we could use htmlString.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, I think String is more correct. Strings passed to this function do not need to conform to the constraints laid out by htmlString (for instance, starting with a "<").

<desc>The HTML string on which to operate.</desc>
</argument>
</signature>
<longdesc>
<p>This method rarely needs to be called directly. Instead, use it as an entry point to modify existing <a href="/category/manipulation/">jQuery manipulation methods</a>. For instance, to remove all <code>&lt;del&gt;</code> tags from incoming HTML strings, do this:</p>
<pre><code>
var htmlPrefilter = $.htmlPrefilter,
rdel = /&lt;(del)(?=[\s&gt;])[\w\W]*?&lt;\/\1\s*&gt;/gi;

$.htmlPrefilter = function( html ) {
return htmlPrefilter.call( this, html ).replace( rdel, "" );
};
</code></pre>
<p>This function can also be overwritten in order to bypass certain edge case issues. The default <code>htmlPrefilter</code> function in jQuery will greedily ensure that all tags are XHTML-compliant. This includes anything that looks like an HTML tag, but is actually within a string (e.g. <pre>&lt;a title="&lt;div /&gt;"&gt;&lt;&gt;</pre>). The <code>jQuery.htmlPrefilter()</code> function can be used to bypass this:</p>
<pre><code>
$.htmlPrefilter = function( html ) {
// Return HTML strings unchanged
return html;
};
</code></pre>
<p>However, while the above fix is short and simple, it puts the burden on you to ensure XHTML-compliant tags in any HTML strings. A more thorough fix for this issue would be this:</p>
<pre><code>
var panything = "[\\w\\W]*?",

// Whitespace
// https://html.spec.whatwg.org/multipage/infrastructure.html#space-character
pspace = "[\\x20\\t\\r\\n\\f]",

// End of tag name (whitespace or greater-than)
pnameEnd = pspace.replace( "]", "&gt;]" ),

// Tag name (a leading letter, then almost anything)
// 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" ) + "*",

// Void element (end tag prohibited)
// 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 + ")",

// Attributes (double-quoted value, single-quoted value, unquoted value, or no value)
// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
pattrs = "(?:" + pspace + "+[^\\0-\\x20\\x7f-\\x9f=\"'/&gt;]+(?:" + pspace + "*=" + pspace +
"*(?:\"" + panything + "\"|'" + panything + "'|" +
pnameEnd.replace( "[", "[^" ) + "*(?!/)" +
")|))*" + pspace + "*",

// Trailing content of a close tag
pcloseTail = "(?:" + pspace + panything + "|)",

rspecialHtml = new RegExp(
// Non-void element that self-closes: $1–$5
"(&lt;)(?!" + pvoidName + ")(" + pname + ")(" + pattrs + ")(\\/)(&gt;)|" +
// No-innerHTML container (element, comment, or CDATA): $6
"(&lt;(script|style|textarea)" + pattrs + "&gt;" + panything + "&lt;\\/\\7" + pcloseTail + "&gt;|" +
"&lt;!--" + panything + "--)",
"gi"
),

// "&lt;"; element name; attributes; "&gt;"; "&lt;"; "/"; element name; "&gt;"; no-innerHTML container
pspecialReplacement = "$1$2$3$5$1$4$2$5$6";

$.htmlPrefilter = function( html ) {
return ( html + "" ).replace( rspecialHtml, pspecialReplacement );
};
</code></pre>
</longdesc>
<category slug="manipulation"/>
</entry>