HTML-encoding lost when attribute read from input field

前端 未结 25 3907
时光说笑
时光说笑 2020-11-21 04:04

I’m using JavaScript to pull a value out from a hidden field and display it in a textbox. The value in the hidden field is encoded.

For example,



        
相关标签:
25条回答
  • 2020-11-21 05:02

    Good answer. Note that if the value to encode is undefined or null with jQuery 1.4.2 you might get errors such as:

    jQuery("<div/>").text(value).html is not a function

    OR

    Uncaught TypeError: Object has no method 'html'

    The solution is to modify the function to check for an actual value:

    function htmlEncode(value){ 
        if (value) {
            return jQuery('<div/>').text(value).html(); 
        } else {
            return '';
        }
    }
    
    0 讨论(0)
  • 2020-11-21 05:02

    FWIW, the encoding is not being lost. The encoding is used by the markup parser (browser) during the page load. Once the source is read and parsed and the browser has the DOM loaded into memory, the encoding has been parsed into what it represents. So by the time your JS is execute to read anything in memory, the char it gets is what the encoding represented.

    I may be operating strictly on semantics here, but I wanted you to understand the purpose of encoding. The word "lost" makes it sound like something isn't working like it should.

    0 讨论(0)
  • 2020-11-21 05:04

    Faster without Jquery. You can encode every character in your string:

    function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}
    

    Or just target the main characters to worry about (&, inebreaks, <, >, " and ') like:

    function encode(r){
    return r.replace(/[\x26\x0A\<>'"]/g,function(r){return"&#"+r.charCodeAt(0)+";"})
    }
    
    test.value=encode('Encode HTML entities!\n\n"Safe" escape <script id=\'\'> & useful in <pre> tags!');
    
    testing.innerHTML=test.value;
    
    /*************
    * \x26 is &ampersand (it has to be first),
    * \x0A is newline,
    *************/
    <textarea id=test rows="9" cols="55"></textarea>
    
    <div id="testing">www.WHAK.com</div>

    0 讨论(0)
  • 2020-11-21 05:04

    Here's a little bit that emulates the Server.HTMLEncode function from Microsoft's ASP, written in pure JavaScript:

    function htmlEncode(s) {
      var ntable = {
        "&": "amp",
        "<": "lt",
        ">": "gt",
        "\"": "quot"
      };
      s = s.replace(/[&<>"]/g, function(ch) {
        return "&" + ntable[ch] + ";";
      })
      s = s.replace(/[^ -\x7e]/g, function(ch) {
        return "&#" + ch.charCodeAt(0).toString() + ";";
      });
      return s;
    }

    The result does not encode apostrophes, but encodes the other HTML specials and any character outside the 0x20-0x7e range.

    0 讨论(0)
  • 2020-11-21 05:06

    You shouldn't have to escape/encode values in order to shuttle them from one input field to another.

    <form>
     <input id="button" type="button" value="Click me">
     <input type="hidden" id="hiddenId" name="hiddenId" value="I like cheese">
     <input type="text" id="output" name="output">
    </form>
    <script>
        $(document).ready(function(e) {
            $('#button').click(function(e) {
                $('#output').val($('#hiddenId').val());
            });
        });
    </script>
    

    JS doesn't go inserting raw HTML or anything; it just tells the DOM to set the value property (or attribute; not sure). Either way, the DOM handles any encoding issues for you. Unless you're doing something odd like using document.write or eval, HTML-encoding will be effectively transparent.

    If you're talking about generating a new textbox to hold the result...it's still as easy. Just pass the static part of the HTML to jQuery, and then set the rest of the properties/attributes on the object it returns to you.

    $box = $('<input type="text" name="whatever">').val($('#hiddenId').val());
    
    0 讨论(0)
  • 2020-11-21 05:07

    For those who prefer plain javascript, here is the method I have used successfully:

    function escapeHTML (str)
    {
        var div = document.createElement('div');
        var text = document.createTextNode(str);
        div.appendChild(text);
        return div.innerHTML;
    }
    
    0 讨论(0)
提交回复
热议问题