jQuery document.createElement equivalent?

后端 未结 14 1697
暖寄归人
暖寄归人 2020-11-22 05:41

I\'m refactoring some old JavaScript code and there\'s a lot of DOM manipulation going on.

var d = document;
var odv = d.createElement(\"div\");
odv.style.di         


        
相关标签:
14条回答
  • 2020-11-22 06:14

    since jQuery1.8, using $.parseHTML() to create elements is a better choice.

    there are two benefits:

    1.if you use the old way, which may be something like $(string), jQuery will examine the string to make sure you want to select a html tag or create a new element. By using $.parseHTML(), you tell jQuery that you want to create a new element explicitly, so the performance may be a little better.

    2.much more important thing is that you may suffer from cross site attack (more info) if you use the old way. if you have something like:

        var userInput = window.prompt("please enter selector");
        $(userInput).hide();
    

    a bad guy can input <script src="xss-attach.js"></script> to tease you. fortunately, $.parseHTML() avoid this embarrassment for you:

    var a = $('<div>')
    // a is [<div>​</div>​]
    var b = $.parseHTML('<div>')
    // b is [<div>​</div>​]
    $('<script src="xss-attach.js"></script>')
    // jQuery returns [<script src=​"xss-attach.js">​</script>​]
    $.parseHTML('<script src="xss-attach.js"></script>')
    // jQuery returns []
    

    However, please notice that a is a jQuery object while b is a html element:

    a.html('123')
    // [<div>​123​</div>​]
    b.html('123')
    // TypeError: Object [object HTMLDivElement] has no method 'html'
    $(b).html('123')
    // [<div>​123​</div>​]
    
    0 讨论(0)
  • 2020-11-22 06:19

    Simply supplying the HTML of elements you want to add to a jQuery constructor $() will return a jQuery object from newly built HTML, suitable for being appended into the DOM using jQuery's append() method.

    For example:

    var t = $("<table cellspacing='0' class='text'></table>");
    $.append(t);
    

    You could then populate this table programmatically, if you wished.

    This gives you the ability to specify any arbitrary HTML you like, including class names or other attributes, which you might find more concise than using createElement and then setting attributes like cellSpacing and className via JS.

    0 讨论(0)
  • 2020-11-22 06:20

    Though this is a very old question, I thought it would be nice to update it with recent information;

    Since jQuery 1.8 there is a jQuery.parseHTML() function which is now a preferred way of creating elements. Also, there are some issues with parsing HTML via $('(html code goes here)'), fo example official jQuery website mentions the following in one of their release notes:

    Relaxed HTML parsing: You can once again have leading spaces or newlines before tags in $(htmlString). We still strongly advise that you use $.parseHTML() when parsing HTML obtained from external sources, and may be making further changes to HTML parsing in the future.

    To relate to the actual question, provided example could be translated to:

    this.$OuterDiv = $($.parseHTML('<div></div>'))
        .hide()
        .append($($.parseHTML('<table></table>'))
            .attr({ cellSpacing : 0 })
            .addClass("text")
        )
    ;
    

    which is unfortunately less convenient than using just $(), but it gives you more control, for example you may choose to exclude script tags (it will leave inline scripts like onclick though):

    > $.parseHTML('<div onclick="a"></div><script></script>')
    [<div onclick=​"a">​</div>​]
    
    > $.parseHTML('<div onclick="a"></div><script></script>', document, true)
    [<div onclick=​"a">​</div>​, <script>​</script>​]
    

    Also, here's a benchmark from the top answer adjusted to the new reality:

    JSbin Link

    jQuery 1.9.1

      $.parseHTML:    88ms
      $($.parseHTML): 240ms
      <div></div>:    138ms
      <div>:          143ms
      createElement:  64ms
    

    It looks like parseHTML is much closer to createElement than $(), but all the boost is gone after wrapping the results in a new jQuery object

    0 讨论(0)
  • 2020-11-22 06:22
    var div = $('<div/>');
    div.append('Hello World!');
    

    Is the shortest/easiest way to create a DIV element in jQuery.

    0 讨论(0)
  • 2020-11-22 06:23

    Here's your example in the "one" line.

    this.$OuterDiv = $('<div></div>')
        .hide()
        .append($('<table></table>')
            .attr({ cellSpacing : 0 })
            .addClass("text")
        )
    ;
    

    Update: I thought I'd update this post since it still gets quite a bit of traffic. In the comments below there's some discussion about $("<div>") vs $("<div></div>") vs $(document.createElement('div')) as a way of creating new elements, and which is "best".

    I put together a small benchmark, and here are roughly the results of repeating the above options 100,000 times:

    jQuery 1.4, 1.5, 1.6

                   Chrome 11  Firefox 4   IE9
    <div>            440ms      640ms    460ms
    <div></div>      420ms      650ms    480ms
    createElement    100ms      180ms    300ms
    

    jQuery 1.3

                    Chrome 11
    <div>             770ms
    <div></div>      3800ms
    createElement     100ms
    

    jQuery 1.2

                    Chrome 11
    <div>            3500ms
    <div></div>      3500ms
    createElement     100ms
    

    I think it's no big surprise, but document.createElement is the fastest method. Of course, before you go off and start refactoring your entire codebase, remember that the differences we're talking about here (in all but the archaic versions of jQuery) equate to about an extra 3 milliseconds per thousand elements.


    Update 2

    Updated for jQuery 1.7.2 and put the benchmark on JSBen.ch which is probably a bit more scientific than my primitive benchmarks, plus it can be crowdsourced now!

    http://jsben.ch/#/ARUtz

    0 讨论(0)
  • 2020-11-22 06:23

    Creating new DOM elements is a core feature of the jQuery() method, see:

    • http://api.jquery.com/jQuery/#creating-new-elements
    • and particulary http://api.jquery.com/jQuery/#example-1-1
    0 讨论(0)
提交回复
热议问题