The jQuery form .serialize() method serializes form contents to a string and automatically URL-encodes the string. My server then reverses this process and URL-decodes the string when deserializing it.
But what I need to be able to do is to HTML-encode the form contents before the form is serialized. In other words, if a user enters HTML into a text input in my form, I want this to be made safe using HTML encoding, then transmitted exactly as described above (using URL-encoding as normal).
Let me illustrate with an example:
Current implementation using .serialize()
- User enters
My name is <b>Fred</b>
into a form input with nameDetails
..serialize()
serializes this asDetails=My+name+is+%3Cb%3EFred%3C%2Fb%3E
(URL-encoding)- The server deserializes the string and gets
My name is <b>Fred</b>
(URL-decoding)
What I want to happen
- User enters
My name is <b>Fred</b>
into a form input with nameDetails
.- This gets HTML-encoded to
My name is <b>Fred</b>
(HTML-encoding).serialize()
serializes this asDetails=My+name+is+%26lt%3Bb%26gt%3BFred%26lt%3B%2Fb%26gt%3B
(URL-encoding)- The server URL-decodes the string and gets
My name is <b>Fred</b>
(URL-decoding only)
I was hoping that .serialize()
might take an argument to specify that the form contents should be HTML-encoded, but no such luck. A couple of other possible solutions would be:
- Iterate through the form inputs and HTML-encode them "by hand" before calling
.serialize()
: I'd rather not have to do this as it will make the code messier and less robust. - Modify my server to accept non-HTML-encoded values: for various reasons I won't go into this is problematic and not a practical solution.
Is there a simpler solution?