]> source.dussan.org Git - jquery.git/commitdiff
Traversing: $.fn.contents() supports HTMLTemplateElement 3530/head
author南漂一卒 <shiy007@qq.com>
Sun, 29 Jan 2017 22:32:15 +0000 (06:32 +0800)
committerOleg Gaidarenko <markelog@gmail.com>
Sun, 29 Jan 2017 22:32:15 +0000 (23:32 +0100)
Fixes gh-3436
Closes gh-3462

src/traversing.js
test/unit/traversing.js

index 50cd2d6ee7946a1a3b0f1d821e8390bc724cbd69..d9686901747babcf0f2b00a4f6ef49102a28f86b 100644 (file)
@@ -143,7 +143,18 @@ jQuery.each( {
                return siblings( elem.firstChild );
        },
        contents: function( elem ) {
-               return elem.contentDocument || jQuery.merge( [], elem.childNodes );
+        if ( jQuery.nodeName( elem, "iframe" ) ) {
+            return elem.contentDocument;
+        }
+
+        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+        // Treat the template element as a regular one in browsers that
+        // don't support it.
+        if ( jQuery.nodeName( elem, "template" ) ) {
+            elem = elem.content || elem;
+        }
+
+        return jQuery.merge( [], elem.childNodes );
        }
 }, function( name, fn ) {
        jQuery.fn[ name ] = function( until, selector ) {
index c7ed01415ebfa2f805f9b60ffad00b72302363a1..83c267a27d3c52b887faabb4cc75f89ef7ed9ba8 100644 (file)
@@ -743,6 +743,58 @@ QUnit.test( "contents()", function( assert ) {
        assert.equal( c[ 0 ].nodeValue, "hi", "Check node,textnode,comment contents is just the one from span" );
 } );
 
+QUnit.test( "contents() for <template />", function( assert ) {
+    assert.expect( 4 );
+
+    jQuery( "#qunit-fixture" ).append(
+        "<template id='template'>" +
+        "    <div id='template-div0'>" +
+        "        <span>Hello, Web Component!</span>" +
+        "    </div>" +
+        "    <div id='template-div1'></div>" +
+        "    <div id='template-div2'></div>" +
+        "</template>"
+    );
+
+    var contents = jQuery( "#template" ).contents();
+    assert.equal( contents.length, 6, "Check template element contents" );
+
+    assert.equal( contents.find( "span" ).text(), "Hello, Web Component!", "Find span in template and check its text" );
+
+    jQuery( "<div id='templateTest' />" ).append(
+        jQuery( jQuery.map( contents, function( node ) {
+            return document.importNode( node, true );
+        } ) )
+    ).appendTo( "#qunit-fixture" );
+
+    contents = jQuery( "#templateTest" ).contents();
+    assert.equal( contents.length, 6, "Check cloned nodes of template element contents" );
+
+    assert.equal( contents.filter( "div" ).length, 3, "Count cloned elements from template" );
+} );
+
+QUnit[ "content" in document.createElement( "template" ) ? "test" : "skip" ](
+       "contents() for <template /> remains inert",
+       function( assert ) {
+        assert.expect( 2 );
+
+               Globals.register( "testScript" );
+               Globals.register( "testImgOnload" );
+
+        jQuery( "#qunit-fixture" ).append(
+            "<template id='template'>" +
+            "    <script>testScript = 1;</script>" +
+            "    <img src='data/1x1.jpg' onload='testImgOnload = 1' >" +
+            "</template>"
+        );
+
+        var content = jQuery( "#template" ).contents();
+
+        assert.strictEqual( window.testScript, true, "script in template isn't executed" );
+        assert.strictEqual( window.testImgOnload, true, "onload of image in template isn't executed" );
+       }
+);
+
 QUnit.test( "sort direction", function( assert ) {
        assert.expect( 12 );