จะใช้ฟังก์ชั่น slideDown (หรือแสดง) บนแถวของตารางได้อย่างไร?


215

ฉันกำลังพยายามเพิ่มแถวลงในตารางและมีการเลื่อนแถวนั้นไปยังมุมมอง แต่ฟังก์ชั่นสไลด์ที่ดูเหมือนว่าจะเพิ่มการแสดงผล: สไตล์บล็อกไปยังแถวตารางที่เลอะเค้าโครง

ความคิดใดที่จะหลีกเลี่ยงปัญหานี้?

นี่คือรหัส:

$.get('/some_url', 
  { 'val1': id },

  function (data) {
    var row = $('#detailed_edit_row');
    row.hide();
    row.html(data);
    row.slideDown(1000);
  }
);

มันจะต้องเป็นตารางหรือไม่? เป็นเรื่องง่ายขึ้นโดยไม่คิดว่าตาราง
MrChrister

fadeInและfadeOutทำงานบนแถวของตารางและสร้างเอฟเฟ็กต์ภาพสำรองที่ดี (ทดสอบบน Firefox เท่านั้น)
Savage

คำตอบ:


296

ภาพเคลื่อนไหวไม่ได้รับการสนับสนุนในแถวตาราง

จาก "การเรียนรู้ jQuery" โดย Chaffer และ Swedberg


แถวของตารางแสดงอุปสรรคเฉพาะต่อภาพเคลื่อนไหวเนื่องจากเบราว์เซอร์ใช้ค่าที่แตกต่างกัน (ตารางแถวและบล็อก) สำหรับคุณสมบัติการแสดงผลที่มองเห็นได้ วิธีการ. leather () และ. show () โดยไม่มีภาพเคลื่อนไหวจะปลอดภัยเสมอที่จะใช้กับแถวของตาราง ในฐานะของ jQuery เวอร์ชัน 1.1.3, .fadeIn () และ .fadeOut () สามารถใช้ได้เช่นกัน


คุณสามารถตัดเนื้อหา td ของคุณใน div และใช้ slideDown บนนั้น คุณต้องตัดสินใจว่าภาพเคลื่อนไหวนั้นมีค่ามากกว่ามาร์กอัปหรือไม่


5
ใช้งานได้ดี! มี gotcha อื่น ๆ เล็กน้อย: คุณจะต้องทำให้เซลล์มีชีวิตชีวาด้วยหากมี แต่นั่นไม่ใช่เรื่องใหญ่เช่นกัน
Adrian Grigore

11
คุณสามารถทำให้เกิดช่องว่างภายในแบบนี้:$('tr').find('td').animate({padding: '0px'}, {duration: 200});
แอนดรูว์

@Emily: คุณช่วยชี้ไปที่บรรทัดเฉพาะของแหล่ง jQuery ได้ไหม? ฉันอยากจะแฮ็คแหล่งข้อมูลสำหรับโครงการของฉัน
Randomblue

7
ไม่ใช่คำตอบโดยตรง แต่ฉันพบว่าการใช้ fadeIn / fadeOut เกือบจะดีในสถานการณ์ส่วนใหญ่และดูเหมือนว่าจะทำงานได้ดีบนแถวของตาราง
Phil LaNasa

@PhilLaNasa ตอนแรกฉันก็เหมือน "Nah นั่นมันดูไม่ดี" แต่แล้วฉันก็ลองแล้วมันก็ดูดีจริงๆ! ขอบคุณสำหรับการเดินทาง!
Kenton de Jong

157

ฉันเพิ่งตัด tr แบบไดนามิกแล้วลบออกเมื่อ slideUp / slideDown เสร็จสมบูรณ์ มันเป็นการเพิ่มค่าโสหุ้ยที่ค่อนข้างเล็กและลบแท็กหนึ่งหรือสองอันจากนั้นลบออกเมื่อภาพเคลื่อนไหวเสร็จสมบูรณ์ฉันไม่เห็นความล่าช้าใด ๆ

สไลด์อัพ :

$('#my_table > tbody > tr.my_row')
 .find('td')
 .wrapInner('<div style="display: block;" />')
 .parent()
 .find('td > div')
 .slideUp(700, function(){

  $(this).parent().parent().remove();

 });

slideDown:

$('#my_table > tbody > tr.my_row')
 .find('td')
 .wrapInner('<div style="display: none;" />')
 .parent()
 .find('td > div')
 .slideDown(700, function(){

  var $set = $(this);
  $set.replaceWith($set.contents());

 });

ฉันต้องจ่ายส่วยให้ fletchzone.com ขณะที่ฉันเอาปลั๊กอินของเขาและถอดมันกลับไปที่ด้านบนไชโยเพื่อน


ขอบคุณ! วิธีนี้ใช้ได้ผลกับฉัน: row.find ('td') wrapInner ('<div style = "display: none;" />').parent().prependTo('#MainTable> tbody') find (' td> div ') slideDown (' ช้า ', ฟังก์ชัน () {var $ set = $ (นี่); $ set.replaceWith ($ set.contents ());});
pauloya

ปัญหาเดียวคือมีความล่าช้าเล็กน้อยระหว่างเซลล์
Archimedes Trajano

41

นี่คือปลั๊กอินที่ฉันเขียนขึ้นสำหรับสิ่งนี้มันใช้เวลาเล็กน้อยจากการใช้งานของ Fletch แต่การใช้ของฉันใช้เพื่อเลื่อนแถวขึ้นหรือลงเท่านั้น (ไม่มีการแทรกแถว)

(function($) {
var sR = {
    defaults: {
        slideSpeed: 400,
        easing: false,
        callback: false     
    },
    thisCallArgs: {
        slideSpeed: 400,
        easing: false,
        callback: false
    },
    methods: {
        up: function (arg1,arg2,arg3) {
            if(typeof arg1 == 'object') {
                for(p in arg1) {
                    sR.thisCallArgs.eval(p) = arg1[p];
                }
            }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                sR.thisCallArgs.slideSpeed = arg1;
            }else{
                sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
            }

            if(typeof arg2 == 'string'){
                sR.thisCallArgs.easing = arg2;
            }else if(typeof arg2 == 'function'){
                sR.thisCallArgs.callback = arg2;
            }else if(typeof arg2 == 'undefined') {
                sR.thisCallArgs.easing = sR.defaults.easing;    
            }
            if(typeof arg3 == 'function') {
                sR.thisCallArgs.callback = arg3;
            }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                sR.thisCallArgs.callback = sR.defaults.callback;    
            }
            var $cells = $(this).find('td');
            $cells.wrapInner('<div class="slideRowUp" />');
            var currentPadding = $cells.css('padding');
            $cellContentWrappers = $(this).find('.slideRowUp');
            $cellContentWrappers.slideUp(sR.thisCallArgs.slideSpeed,sR.thisCallArgs.easing).parent().animate({
                                                                                                                paddingTop: '0px',
                                                                                                                paddingBottom: '0px'},{
                                                                                                                complete: function () {
                                                                                                                    $(this).children('.slideRowUp').replaceWith($(this).children('.slideRowUp').contents());
                                                                                                                    $(this).parent().css({'display':'none'});
                                                                                                                    $(this).css({'padding': currentPadding});
                                                                                                                }});
            var wait = setInterval(function () {
                if($cellContentWrappers.is(':animated') === false) {
                    clearInterval(wait);
                    if(typeof sR.thisCallArgs.callback == 'function') {
                        sR.thisCallArgs.callback.call(this);
                    }
                }
            }, 100);                                                                                                    
            return $(this);
        },
        down: function (arg1,arg2,arg3) {
            if(typeof arg1 == 'object') {
                for(p in arg1) {
                    sR.thisCallArgs.eval(p) = arg1[p];
                }
            }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                sR.thisCallArgs.slideSpeed = arg1;
            }else{
                sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
            }

            if(typeof arg2 == 'string'){
                sR.thisCallArgs.easing = arg2;
            }else if(typeof arg2 == 'function'){
                sR.thisCallArgs.callback = arg2;
            }else if(typeof arg2 == 'undefined') {
                sR.thisCallArgs.easing = sR.defaults.easing;    
            }
            if(typeof arg3 == 'function') {
                sR.thisCallArgs.callback = arg3;
            }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                sR.thisCallArgs.callback = sR.defaults.callback;    
            }
            var $cells = $(this).find('td');
            $cells.wrapInner('<div class="slideRowDown" style="display:none;" />');
            $cellContentWrappers = $cells.find('.slideRowDown');
            $(this).show();
            $cellContentWrappers.slideDown(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function() { $(this).replaceWith( $(this).contents()); });

            var wait = setInterval(function () {
                if($cellContentWrappers.is(':animated') === false) {
                    clearInterval(wait);
                    if(typeof sR.thisCallArgs.callback == 'function') {
                        sR.thisCallArgs.callback.call(this);
                    }
                }
            }, 100);
            return $(this);
        }
    }
};

$.fn.slideRow = function(method,arg1,arg2,arg3) {
    if(typeof method != 'undefined') {
        if(sR.methods[method]) {
            return sR.methods[method].apply(this, Array.prototype.slice.call(arguments,1));
        }
    }
};
})(jQuery);

การใช้งานพื้นฐาน:

$('#row_id').slideRow('down');
$('#row_id').slideRow('up');

ผ่านตัวเลือกสไลด์เป็นอาร์กิวเมนต์แต่ละตัว:

$('#row_id').slideRow('down', 500); //slide speed
$('#row_id').slideRow('down', 500, function() { alert('Row available'); }); // slide speed and callback function
$('#row_id').slideRow('down', 500, 'linear', function() { alert('Row available'); }); slide speed, easing option and callback function
$('#row_id').slideRow('down', {slideSpeed: 500, easing: 'linear', callback: function() { alert('Row available');} }); //options passed as object

โดยพื้นฐานแล้วสำหรับภาพเคลื่อนไหวแบบเลื่อนลงปลั๊กอินจะล้อมเนื้อหาของเซลล์ใน DIV เคลื่อนไหวภาพเคลื่อนไหวเหล่านั้นจากนั้นลบออกและในทางกลับกันสำหรับการเลื่อนขึ้น (ด้วยขั้นตอนพิเศษบางอย่างเพื่อกำจัดช่องว่างภายในเซลล์) นอกจากนี้ยังส่งคืนวัตถุที่คุณเรียกว่ามันดังนั้นคุณสามารถเชื่อมโยงวิธีการดังนี้:

$('#row_id').slideRow('down').css({'font-color':'#F00'}); //make the text in the row red

หวังว่านี่จะช่วยใครซักคน


ถ้าฉันต้องการเพิ่ม / ลบกลุ่มแถว? ฉันต้องให้ฟังก์ชั่น Master / Detail
Volatil3

ฟังก์ชั่นการโทรกลับเริ่มทำงานทันทีสำหรับฉัน
จัสติน

นั่นเป็นเพียงการแสดงออก ใช้งานได้ดีมาก (แม้ว่ายังไม่ได้ทดสอบฟังก์ชันการเรียกกลับ) วันหนึ่งฉันจะรู้จัก jQuery มากพอที่จะทำวิศวกรรมย้อนกลับได้
cartbeforehorse

1
FYI: สิ่งนี้ดูเหมือนจะผิดถ้าเนื้อหาของแถวเป้าหมายเป็นตารางอื่น ฉันไม่มีเวลาไปไหนอีกแล้ว แต่สิ่งที่ฉันพบคือมันยุบตารางเด็กตั้งค่าแถวทั้งหมดให้ซ่อนเพิ่มช่องว่างแปลก ๆ จากนั้นจะไม่ขยายแถวเหล่านั้นอีกเมื่อคุณเรียก slideRow ('ลง').
Chris Porter

1
ฉันพบปัญหาเดียวกันกับคนอื่น ๆ ที่มีตารางเด็กที่แสดงตลกเมื่อเรียกใช้ slideRow ('up') จากนั้นเลื่อน slideRow ('down') ฉันคิดว่าเป็นเพราะวิธีการค้นหา ('td') ที่ใช้สองครั้งในปลั๊กอิน ฉันเปลี่ยนสิ่งนี้เป็นเด็ก ('td') และปัญหาก็หายไปในทันที สำหรับปัญหาเกี่ยวกับเซลล์ th เพียงแค่อัปเดตทั้งสองอินสแตนซ์ของเด็ก ('td') เป็น children ('td, th')
OregonJeff

4

คุณสามารถลองห่อเนื้อหาของแถวใน a <span>และให้ตัวเลือกของคุณเป็น$('#detailed_edit_row span');- แฮ็คเล็กน้อย แต่ฉันเพิ่งทดสอบและใช้งานได้ ฉันลองทำตามtable-rowคำแนะนำด้านบน แต่ดูเหมือนจะไม่ทำงาน

ปรับปรุง : ฉันได้รับการเล่นกับปัญหานี้และจากสิ่งบ่งชี้ทั้งหมด jQuery ต้องการวัตถุที่จะดำเนินการ slideDown เพื่อเป็นองค์ประกอบบล็อก ดังนั้นไม่มีลูกเต๋า ฉันสามารถสร้างตารางที่ฉันใช้ slideDown บนเซลล์และมันไม่ได้ส่งผลกระทบต่อเค้าโครงเลยดังนั้นฉันไม่แน่ใจว่าวิธีการตั้งค่าของคุณ ฉันคิดว่าวิธีแก้ปัญหาเดียวของคุณคือการสร้างตารางใหม่ในลักษณะที่ไม่เป็นไรกับเซลล์นั้นเป็นบล็อกหรือแค่.show();เรื่องแช่ง โชคดี.


1
คุณไม่สามารถทำให้แท็ก TR และแท็กเคลื่อนไหว คุณต้องห่อเนื้อหาของแต่ละ td ด้วย div แล้วทำให้ div เคลื่อนไหวแล้วซ่อน / แสดง tr:<td><div style="display:block">contents</div></td>
Andrew

4

เลือกเนื้อหาของแถวดังนี้:

$(row).contents().slideDown();

.contents () - รับลูกของแต่ละองค์ประกอบในชุดขององค์ประกอบที่ตรงกันรวมถึงโหนดข้อความและความคิดเห็น


คุณต้องเลือกคอลัมน์ด้วยเช่น$('tr > td').contents().slideDown()กัน ตรวจสอบให้แน่ใจว่าเนื้อหาทั้งหมดในคอลัมน์นั้นถูกห่อด้วยแท็กนั่นคือการใช้<td>Some text</td>งานไม่ได้ นี่คือทางออกที่ง่ายที่สุด
2233706

3

ฉันใช้เวลาตอบคำถามนี้ไม่ทันเล็กน้อย แต่ฉันพบวิธีที่จะทำได้ :)

function eventinfo(id) {
    tr = document.getElementById("ei"+id);
    div = document.getElementById("d"+id);
    if (tr.style.display == "none") {
        tr.style.display="table-row";
        $(div).slideDown('fast');
    } else {
        $(div).slideUp('fast');
        setTimeout(function(){tr.style.display="none";}, 200);
    }
}

ฉันแค่ใส่องค์ประกอบ div ไว้ในแท็ก data table เมื่อมีการตั้งค่าให้มองเห็นได้เมื่อ div ขยายตัวแถวทั้งหมดจะถูกลง จากนั้นบอกให้จางหายไป (จากนั้นหมดเวลาเพื่อให้คุณเห็นผล) ก่อนที่จะซ่อนแถวตารางอีกครั้ง :)

หวังว่านี่จะช่วยใครซักคน!


3

ฉันกำหนดตารางที่มีแถวที่ซ่อนอยู่ซึ่งเลื่อนเข้าและออกจากการดูเมื่อคลิกแถว


3

มีแถวของตารางที่มีตารางซ้อนกัน:

<tr class='dummyRow' style='display: none;'>
    <td>
        <table style='display: none;'>All row content inside here</table>
    </td>
</tr>

หากต้องการเลื่อนลงแถว:

$('.dummyRow').show().find("table").slideDown();

หมายเหตุ:ทั้งแถวและเนื้อหา (นี่คือ"table") ทั้งคู่ควรซ่อนไว้ก่อนที่ภาพเคลื่อนไหวจะเริ่มขึ้น


หากต้องการเลื่อนแถว:

$('.dummyRow').find("table").slideUp('normal', function(){$('.dummyRow').hide();});

พารามิเตอร์ที่สอง ( function()) คือการติดต่อกลับ


ง่าย !!

ทราบว่ายังมีหลายตัวเลือกที่สามารถเพิ่มเป็นพารามิเตอร์ของสไลด์ขึ้น / ลงฟังก์ชั่น (ถูกพบมากที่สุดระยะเวลา'slow'และ'fast')


คุณใส่เนื้อหาของคุณระหว่างแถวหรือว่าเป็นคำที่พิมพ์ผิด?
Vincent

2

ฉันได้รับสิ่งนี้โดยใช้องค์ประกอบ td ในแถว:

$(ui.item).children("td").effect("highlight", { color: "#4ca456" }, 1000);

การเคลื่อนไหวแถวนั้นทำให้เกิดพฤติกรรมแปลก ๆ ซึ่งส่วนใหญ่เป็นปัญหาการเคลื่อนไหวแบบอะซิงก์

สำหรับโค้ดด้านบนฉันจะเน้นแถวที่ลากและวางในตารางเพื่อเน้นว่าการอัปเดตสำเร็จ หวังว่านี่จะช่วยใครซักคน


ฉันจะได้รับeffect is not a function
โหด

2

ฉันใช้ความคิดที่มีให้ที่นี่และประสบปัญหาบางอย่าง ฉันแก้ไขพวกเขาทั้งหมดและมีหนึ่งซับที่ราบรื่นฉันต้องการแบ่งปัน

$('#row_to_slideup').find('> td').css({'height':'0px'}).wrapInner('<div style=\"display:block;\" />').parent().find('td > div').slideUp('slow', function() {$(this).parent().parent().remove();});

มันใช้ CSS ในองค์ประกอบ td มันลดความสูงลงเหลือ 0px ด้วยวิธีนี้เฉพาะความสูงของเนื้อหาของ div-wrapper ที่สร้างขึ้นใหม่ภายในองค์ประกอบ td แต่ละเรื่องเท่านั้น

slideUp ทำงานช้า หากคุณทำให้มันช้าลงคุณอาจตระหนักถึงความผิดพลาดบางอย่าง กระโดดเล็ก ๆ ที่จุดเริ่มต้น นี่เป็นเพราะการตั้งค่า css ที่กล่าวถึง แต่หากไม่มีการตั้งค่าเหล่านี้แถวจะไม่ลดความสูง เนื้อหาเท่านั้นที่จะ

ในตอนท้ายองค์ประกอบ tr จะถูกลบออก

บรรทัดทั้งหมดมีเพียง JQuery และไม่มี Javascript ดั้งเดิม

หวังว่ามันจะช่วย

นี่คือตัวอย่างรหัส:

    <html>
            <head>
                    <script src="https://code.jquery.com/jquery-3.2.0.min.js">               </script>
            </head>
            <body>
                    <table>
                            <thead>
                                    <tr>
                                            <th>header_column 1</th>
                                            <th>header column 2</th>
                                    </tr>
                            </thead>
                            <tbody>
                                    <tr id="row1"><td>row 1 left</td><td>row 1 right</td></tr>
                                    <tr id="row2"><td>row 2 left</td><td>row 2 right</td></tr>
                                    <tr id="row3"><td>row 3 left</td><td>row 3 right</td></tr>
                                    <tr id="row4"><td>row 4 left</td><td>row 4 right</td></tr>
                            </tbody>
                    </table>
                    <script>
    setTimeout(function() {
    $('#row2').find('> td').css({'height':'0px'}).wrapInner('<div style=\"display:block;\" />').parent().find('td > div').slideUp('slow',         function() {$(this).parent().parent().remove();});
    }, 2000);
                    </script>
            </body>
    </html>

โพสต์นี้มีอายุเพียงสองปี ฉันทำงานกับ jquery เวอร์ชัน 3.2.0 แล้ว ฉันทดสอบโค้ดในวันนี้ด้วย Chrome 73.0.3683.75 และใช้งานได้
darkwind

1

ฉันต้องการเลื่อนร่างกายทั้งหมดและจัดการปัญหานี้โดยรวมเอฟเฟกต์จางและสไลด์

ฉันทำสิ่งนี้ใน 3 ขั้นตอน (ขั้นที่ 2 และ 3 ถูกแทนที่ในกรณีที่คุณต้องการเลื่อนลงหรือขึ้น)

  1. กำหนดความสูงให้กับร่างกาย
  2. ซีดจาง td และ th ทั้งหมด
  3. เลื่อนร่างกาย

ตัวอย่างของ slideUp:

tbody.css('height', tbody.css('height'));
tbody.find('td, th').fadeOut(200, function(){
    tbody.slideUp(300)
});

สิ่งนี้ไม่ส่งผลกระทบต่อทั้งตารางแทนที่จะเป็นเพียงแถวใดแถวหนึ่งใช่ไหม
โหด

1

ฉันมีปัญหากับวิธีแก้ไขปัญหาอื่น ๆ ทั้งหมดที่นำเสนอ แต่ลงเอยด้วยการทำสิ่งง่าย ๆ ที่เรียบเนียนราวกับเนย

ตั้งค่า HTML ตามต้องการ:

<tr id=row1 style='height:0px'><td>
  <div id=div1 style='display:none'>
    Hidden row content goes here
  </div>
</td></tr>

จากนั้นตั้งค่าจาวาสคริปต์ของคุณดังนี้:

function toggleRow(rowid){
  var row = document.getElementById("row" + rowid)

  if(row.style.height == "0px"){
      $('#div' + rowid).slideDown('fast');
      row.style.height = "1px";   
  }else{
      $('#div' + rowid).slideUp('fast');
      row.style.height = "0px";   
  } 
}

โดยพื้นฐานแล้วทำให้แถว "มองไม่เห็น" สูง 0px โดยมี div อยู่ด้านใน
ใช้ภาพเคลื่อนไหวบน div (ไม่ใช่แถว) จากนั้นตั้งค่าความสูงของแถวเป็น 1px

หากต้องการซ่อนแถวอีกครั้งให้ใช้ภาพเคลื่อนไหวที่ตรงข้ามกับ div และตั้งค่าความสูงของแถวกลับเป็น 0px


1

ฉันชอบปลั๊กอินที่ Vinny เขียนและใช้งานอยู่ แต่ในกรณีของตารางภายในแถวเลื่อน (tr / td) แถวของตารางที่ซ้อนกันจะถูกซ่อนอยู่เสมอแม้หลังจากเลื่อนขึ้น ดังนั้นฉันจึงแฮ็คอย่างง่ายและรวดเร็วในปลั๊กอินไม่ซ่อนแถวของตารางที่ซ้อนกัน เพียงแค่เปลี่ยนบรรทัดต่อไปนี้

var $cells = $(this).find('td');

ถึง

var $cells = $(this).find('> td');

ซึ่งค้นหาเฉพาะ tds ทันทีที่ไม่ซ้อนกัน หวังว่าจะช่วยให้ใครบางคนใช้ปลั๊กอินและมีตารางที่ซ้อนกัน


1

ฉันต้องการเพิ่มความคิดเห็นในโพสต์ของ # Vinny แต่ไม่มีตัวแทนดังนั้นต้องโพสต์คำตอบ ...

พบข้อผิดพลาดกับปลั๊กอินของคุณ - เมื่อคุณเพิ่งผ่านวัตถุที่มีข้อโต้แย้งที่พวกเขาได้รับการเขียนทับหากไม่มีข้อโต้แย้งอื่น ๆ จะถูกส่งผ่านเข้าแก้ไขได้อย่างง่ายดายโดยการเปลี่ยนลำดับการประมวลผลข้อโต้แย้งรหัสด้านล่าง ฉันได้เพิ่มตัวเลือกสำหรับการทำลายแถวหลังจากปิด (เช่นเดียวกับที่ฉันต้องการ!): $ ('# row_id'). slideRow ('up', จริง); // ทำลายแถว

(function ($) {
    var sR = {
        defaults: {
            slideSpeed: 400,
            easing: false,
            callback: false
        },
        thisCallArgs: {
            slideSpeed: 400,
            easing: false,
            callback: false,
            destroyAfterUp: false
        },
        methods: {
            up: function (arg1, arg2, arg3) {
                if (typeof arg2 == 'string') {
                    sR.thisCallArgs.easing = arg2;
                } else if (typeof arg2 == 'function') {
                    sR.thisCallArgs.callback = arg2;
                } else if (typeof arg2 == 'undefined') {
                    sR.thisCallArgs.easing = sR.defaults.easing;
                }
                if (typeof arg3 == 'function') {
                    sR.thisCallArgs.callback = arg3;
                } else if (typeof arg3 == 'undefined' && typeof arg2 != 'function') {
                    sR.thisCallArgs.callback = sR.defaults.callback;
                }
                if (typeof arg1 == 'object') {
                    for (p in arg1) {
                        sR.thisCallArgs[p] = arg1[p];
                    }
                } else if (typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                    sR.thisCallArgs.slideSpeed = arg1;
                } else if (typeof arg1 != 'undefined' && (typeof arg1 == 'boolean')) {
                    sR.thisCallArgs.destroyAfterUp = arg1;
                } else {
                    sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                }

                var $row = $(this);
                var $cells = $row.children('th, td');
                $cells.wrapInner('<div class="slideRowUp" />');
                var currentPadding = $cells.css('padding');
                $cellContentWrappers = $(this).find('.slideRowUp');
                $cellContentWrappers.slideUp(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing).parent().animate({
                    paddingTop: '0px',
                    paddingBottom: '0px'
                }, {
                    complete: function () {
                        $(this).children('.slideRowUp').replaceWith($(this).children('.slideRowUp').contents());
                        $(this).parent().css({ 'display': 'none' });
                        $(this).css({ 'padding': currentPadding });
                    }
                });
                var wait = setInterval(function () {
                    if ($cellContentWrappers.is(':animated') === false) {
                        clearInterval(wait);
                        if (sR.thisCallArgs.destroyAfterUp)
                        {
                            $row.replaceWith('');
                        }
                        if (typeof sR.thisCallArgs.callback == 'function') {
                            sR.thisCallArgs.callback.call(this);
                        }
                    }
                }, 100);
                return $(this);
            },
            down: function (arg1, arg2, arg3) {

                if (typeof arg2 == 'string') {
                    sR.thisCallArgs.easing = arg2;
                } else if (typeof arg2 == 'function') {
                    sR.thisCallArgs.callback = arg2;
                } else if (typeof arg2 == 'undefined') {
                    sR.thisCallArgs.easing = sR.defaults.easing;
                }
                if (typeof arg3 == 'function') {
                    sR.thisCallArgs.callback = arg3;
                } else if (typeof arg3 == 'undefined' && typeof arg2 != 'function') {
                    sR.thisCallArgs.callback = sR.defaults.callback;
                }
                if (typeof arg1 == 'object') {
                    for (p in arg1) {
                        sR.thisCallArgs.eval(p) = arg1[p];
                    }
                } else if (typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')) {
                    sR.thisCallArgs.slideSpeed = arg1;
                } else {
                    sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                }

                var $cells = $(this).children('th, td');
                $cells.wrapInner('<div class="slideRowDown" style="display:none;" />');
                $cellContentWrappers = $cells.find('.slideRowDown');
                $(this).show();
                $cellContentWrappers.slideDown(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function () { $(this).replaceWith($(this).contents()); });

                var wait = setInterval(function () {
                    if ($cellContentWrappers.is(':animated') === false) {
                        clearInterval(wait);
                        if (typeof sR.thisCallArgs.callback == 'function') {
                            sR.thisCallArgs.callback.call(this);
                        }
                    }
                }, 100);
                return $(this);
            }
        }
    };

    $.fn.slideRow = function (method, arg1, arg2, arg3) {
        if (typeof method != 'undefined') {
            if (sR.methods[method]) {
                return sR.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
            }
        }
    };
})(jQuery);

ลืมพูดถึงฉันยังได้เพิ่มในการแก้ไขเด็ก & th
Mark Ball

0

หากคุณต้องการเลื่อนและจางแถวของตารางในเวลาเดียวกันให้ลองใช้สิ่งเหล่านี้:

jQuery.fn.prepareTableRowForSliding = function() {
    $tr = this;
    $tr.children('td').wrapInner('<div style="display: none;" />');
    return $tr;
};

jQuery.fn.slideFadeTableRow = function(speed, easing, callback) {
    $tr = this;
    if ($tr.is(':hidden')) {
        $tr.show().find('td > div').animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback);
    } else {
        $tr.find('td > div').animate({opacity: 'toggle', height: 'toggle'}, speed, easing, function(){
            $tr.hide();
            callback();
        });
    }
    return $tr;
};

$(document).ready(function(){
    $('tr.special').hide().prepareTableRowForSliding();
    $('a.toggle').toggle(function(){
        $button = $(this);
        $tr = $button.closest('tr.special'); //this will be specific to your situation
        $tr.slideFadeTableRow(300, 'swing', function(){
            $button.text('Hide table row');
        });
    }, function(){
        $button = $(this);
        $tr = $button.closest('tr.special'); //this will be specific to your situation
        $tr.slideFadeTableRow(300, 'swing', function(){
            $button.text('Display table row');
        });
});
});

0
function hideTr(tr) {
  tr.find('td').wrapInner('<div style="display: block;" />').parent().find('td > div').slideUp(50, function () {
    tr.hide();
    var $set = jQuery(this);
    $set.replaceWith($set.contents());
  });
}

function showTr(tr) {
  tr.show()
  tr.find('td').wrapInner('<div style="display: none;" />').parent().find('td > div').slideDown(50, function() {
    var $set = jQuery(this);
    $set.replaceWith($set.contents());
  });
}

คุณสามารถใช้วิธีการเหล่านี้เช่น:

jQuery("[data-toggle-tr-trigger]").click(function() {
  var $tr = jQuery(this).parents(trClass).nextUntil(trClass);
  if($tr.is(':hidden')) {
    showTr($tr);
  } else {
    hideTr($tr);
  }
});

0

ฉันสามารถทำได้ถ้าคุณตั้งค่า td ในแถวเพื่อแสดงไม่มีในเวลาเดียวกับที่คุณเริ่มเคลื่อนไหวความสูงในแถว

tbody tr{
    min-height: 50px;
}
tbody tr.ng-hide td{
    display: none;
}
tr.hide-line{
    -moz-transition: .4s linear all;
    -o-transition: .4s linear all;
    -webkit-transition: .4s linear all;
    transition: .4s linear all;
    height: 50px;
    overflow: hidden;

    &.ng-hide { //angularJs specific
        height: 0;
        min-height: 0;
    }
}

0

รหัสนี้ใช้งานได้!

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <title></title>
        <script>
            function addRow() {
                $('.displaynone').show();
                $('.displaynone td')
                .wrapInner('<div class="innerDiv" style="height:0" />');
                $('div').animate({"height":"20px"});
            }
        </script>
        <style>
            .mycolumn{border: 1px solid black;}
            .displaynone{display: none;}
        </style>
    </head>
    <body>
        <table align="center" width="50%">
            <tr>
                <td class="mycolumn">Row 1</td>
            </tr>
            <tr>
                <td class="mycolumn">Row 2</td>
            </tr>
            <tr class="displaynone">
                <td class="mycolumn">Row 3</td>
            </tr>
            <tr>
                <td class="mycolumn">Row 4</td>
            </tr>
        </table>
        <br>
        <button onclick="addRow();">add</button>    
    </body>
</html>

0

http://jsfiddle.net/PvwfK/136/

<table cellspacing='0' cellpadding='0' class='table01' id='form_table' style='width:100%;'>
<tr>
    <td style='cursor:pointer; width:20%; text-align:left;' id='header'>
        <label style='cursor:pointer;'> <b id='header01'>▲ Customer Details</b>

        </label>
    </td>
</tr>
<tr>
    <td style='widtd:20%; text-align:left;'>
        <div id='content' class='content01'>
            <table cellspacing='0' cellpadding='0' id='form_table'>
                <tr>
                    <td>A/C ID</td>
                    <td>:</td>
                    <td>3000/A01</td>
                </tr>
                <tr>
                    <td>A/C ID</td>
                    <td>:</td>
                    <td>3000/A01</td>
                </tr>
                <tr>
                    <td>A/C ID</td>
                    <td>:</td>
                    <td>3000/A01</td>
                </tr>
            </table>
        </div>
    </td>
</tr>

$(function () {
$(".table01 td").on("click", function () {
    var $rows = $('.content01');
    if ($(".content01:first").is(":hidden")) {
        $("#header01").text("▲ Customer Details");
        $(".content01:first").slideDown();
    } else {
        $("#header01").text("▼ Customer Details");
        $(".content01:first").slideUp();
    }
});

});


สิ่งนี้แสดง & ซ่อน div ที่มีตาราง ไม่ใช่แถวของตารางตามที่ OP ถาม
shazbot

0

ปลั๊กที่นำเสนอโดย Vinny อยู่ใกล้จริง ๆแต่ฉันพบและแก้ไขปัญหาเล็ก ๆ สองสามข้อ

  1. มันตั้งเป้าหมายที่องค์ประกอบ td อย่างตะกละตะกลามเกินกว่าเด็ก ๆ ของแถวที่ถูกซ่อนอยู่ นี่คงจะไม่เป็นไรถ้าหากเด็ก ๆ มองหาแถวนั้น ในขณะที่มันเข้าใกล้พวกเขาทั้งหมดก็จบลงด้วย "display: none" บนพวกเขาทำให้พวกมันถูกซ่อน
  2. มันไม่ได้กำหนดเป้าหมายองค์ประกอบของเด็กเลย
  3. สำหรับเซลล์ของตารางที่มีเนื้อหาจำนวนมาก (เช่นตารางที่ซ้อนกันที่มีแถวจำนวนมาก) การเรียกใช้ slideRow ('up') โดยไม่คำนึงถึงค่าของ SlideSpeed ​​ที่มีให้มันจะยุบมุมมองของแถวทันทีที่ภาพเคลื่อนไหวเสร็จสมบูรณ์ . ฉันแก้ไขมันเพื่อให้แอนิเมชั่นการขยายไม่ทำงานจนกว่าเมธอด slideUp () บนการตัดคำจะเสร็จสิ้น

    (function($){
        var sR = {
            defaults: {
                slideSpeed: 400
              , easing: false
              , callback: false
            }
          , thisCallArgs:{
                slideSpeed: 400
              , easing: false
              , callback: false
            }
          , methods:{
                up: function(arg1, arg2, arg3){
                    if(typeof arg1 == 'object'){
                        for(p in arg1){
                            sR.thisCallArgs.eval(p) = arg1[p];
                        }
                    }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')){
                        sR.thisCallArgs.slideSpeed = arg1;
                    }else{
                        sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                    }
    
                    if(typeof arg2 == 'string'){
                        sR.thisCallArgs.easing = arg2;
                    }else if(typeof arg2 == 'function'){
                        sR.thisCallArgs.callback = arg2;
                    }else if(typeof arg2 == 'undefined'){
                        sR.thisCallArgs.easing = sR.defaults.easing;    
                    }
                    if(typeof arg3 == 'function'){
                        sR.thisCallArgs.callback = arg3;
                    }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                        sR.thisCallArgs.callback = sR.defaults.callback;    
                    }
                    var $cells = $(this).children('td, th');
                    $cells.wrapInner('<div class="slideRowUp" />');
                    var currentPadding = $cells.css('padding');
                    $cellContentWrappers = $(this).find('.slideRowUp');
                    $cellContentWrappers.slideUp(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function(){
                        $(this).parent().animate({ paddingTop: '0px', paddingBottom: '0px' }, {
                            complete: function(){
                                $(this).children('.slideRowUp').replaceWith($(this).children('.slideRowUp').contents());
                                $(this).parent().css({ 'display': 'none' });
                                $(this).css({ 'padding': currentPadding });
                            }
                        });
                    });
                    var wait = setInterval(function(){
                        if($cellContentWrappers.is(':animated') === false){
                            clearInterval(wait);
                            if(typeof sR.thisCallArgs.callback == 'function'){
                                sR.thisCallArgs.callback.call(this);
                            }
                        }
                    }, 100);                                                                                                    
                    return $(this);
                }
              , down: function (arg1, arg2, arg3){
                    if(typeof arg1 == 'object'){
                        for(p in arg1){
                            sR.thisCallArgs.eval(p) = arg1[p];
                        }
                    }else if(typeof arg1 != 'undefined' && (typeof arg1 == 'number' || arg1 == 'slow' || arg1 == 'fast')){
                        sR.thisCallArgs.slideSpeed = arg1;
                    }else{
                        sR.thisCallArgs.slideSpeed = sR.defaults.slideSpeed;
                    }
    
                    if(typeof arg2 == 'string'){
                        sR.thisCallArgs.easing = arg2;
                    }else if(typeof arg2 == 'function'){
                        sR.thisCallArgs.callback = arg2;
                    }else if(typeof arg2 == 'undefined'){
                        sR.thisCallArgs.easing = sR.defaults.easing;    
                    }
                    if(typeof arg3 == 'function'){
                        sR.thisCallArgs.callback = arg3;
                    }else if(typeof arg3 == 'undefined' && typeof arg2 != 'function'){
                        sR.thisCallArgs.callback = sR.defaults.callback;    
                    }
                    var $cells = $(this).children('td, th');
                    $cells.wrapInner('<div class="slideRowDown" style="display:none;" />');
                    $cellContentWrappers = $cells.find('.slideRowDown');
                    $(this).show();
                    $cellContentWrappers.slideDown(sR.thisCallArgs.slideSpeed, sR.thisCallArgs.easing, function() { $(this).replaceWith( $(this).contents()); });
    
                    var wait = setInterval(function(){
                        if($cellContentWrappers.is(':animated') === false){
                            clearInterval(wait);
                            if(typeof sR.thisCallArgs.callback == 'function'){
                                sR.thisCallArgs.callback.call(this);
                            }
                        }
                    }, 100);
                    return $(this);
                }
            }
        };
    
        $.fn.slideRow = function(method, arg1, arg2, arg3){
            if(typeof method != 'undefined'){
                if(sR.methods[method]){
                    return sR.methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
                }
            }
        };
    })(jQuery);

@ วงกลมคุณมีบางสิ่งบางอย่างที่จะเสนอหรือวิจารณ์ของคุณเพียงพอหรือไม่
OregonJeff

@ Regoneff เพียงแค่มีความซื่อสัตย์ ฉันกำลังมองหาบางสิ่งที่ง่ายกว่านี้ ไม่ควรใช้รหัส 109 บรรทัดเพื่อเลื่อนแถวตาราง
วงจร

@ วงกลมมันไม่ได้ง่ายขึ้นถ้าคุณต้องการที่จะใช้เป็นปลั๊กอิน (และไม่เพียง แต่มีส่วนร่วมในการปฏิบัติที่ไม่ดีของรหัสเฉพาะการใช้งาน) ด้วยความสามารถในการควบคุมความเร็วลดความสะดวกสบายและมีการเรียกกลับในการปรับแต่ง รากฐาน เนื่องจากนี่คือสิ่งที่คุณต้องการรวมไว้ในห้องสมุดรหัสของคุณและสามารถนำมาใช้สำหรับการใด ๆการดำเนินการที่ต้องขยาย / แถวตารางการล่มสลายผมไม่แน่ใจว่าทำไมมันเป็นเรื่องสำคัญว่ามันเป็น 109 สายรหัส
OregonJeff

0

แก้ไขด่วน / ง่าย:

ใช้ JQuery .toggle ()เพื่อแสดง / ซ่อนแถว onclick ของ Row หรือ Anchor

จะต้องเขียนฟังก์ชันเพื่อระบุแถวที่คุณต้องการซ่อน แต่สลับจะสร้างฟังก์ชันการทำงานที่คุณต้องการ


ผมคิดว่านี่คือข้อเสนอแนะในนี้คำตอบแล้ว ...
DarkCygnus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.