简体   繁体   中英

Can I use nextUntil to grab these values?

I want to take the .text or .val from some <td> s that are between <tr> s with a class .ccc and put it into an array.

<tr class="ccc">
   <td>Strategy & Performance</td>
   <td class="l_ccc_data" id="Foo~Q_1"></td> //the innerHTML of this should read 10
   <td class="l_ccc_data" id="Foo~Q_2"></td> //the innerHTML of this should read 12
</tr>
<tr class="inner">
   <td id="Bar~Q_1">5</td>
   <td id="Bar~Q_2">6</td>
</tr>
<tr class="inner">
   <td id="Something~Q_1">5</td>
   <td id="Something~Q_2">6</td>
</tr>
<tr class="ccc">
   <td>Central Engineering</td>
   <td class="l_ccc_data" id="Boo~Q_1">Next total Goes here</td>
   etc...

What I have for the script so far:

$(document).ready(function(){
    $('.l_ccc_data').each(function(){
        var id = $(this).attr('id');
        var arr_id = id.split('~');
        var q = arr_id[1];
        var arr_sum = [];
        arr_sum.push($(this).nextUntil('.ccc', '[id$="+q+"]').html()); //this could be .text(), or .val(), not sure
        //then add up all the values in arr_sum and set
        //$(this).html(whatever the sum);
    });
});

I understand that encoding data into IDs is a bad idea, it's not really able to be helped currently. I need to get the values from any <td> that ends with the same Q_1 or Q_2 or whatever as my <td> with class l_ccc_data . Then I need to get that number, push it to an array, add them up, and have it be displayed in the innerhtml of that <td> with class l_ccc_data . A simple total. Shouldn't be this hard, but I feel like I'm missing something.

Is this the correct usage of nextUntil? What am I doing wrong?

The nextUntil method will look at the next siblings only, not at the next nodes that might have a different parent.

So you need to go one level up the DOM tree, from the current td to the parent tr , and then apply nextUntil . Then you need to go down again, for which you can use find .

Note that there were some errors which I corrected also (for instance the bad quoting in '[id$="+q+"]' which made the + not function as you intended). Note that you should not use html() for putting plain text. Use text() for that.

$(function(){
    $('.l_ccc_data').each(function(){
        var q = $(this).attr('id').split('~').pop();
        var sum = 0;
        $(this).parent().nextUntil('.ccc').find('[id$="'+q+'"]')
               .each(function () {
                    sum += +$(this).text();
               });
        $(this).text(sum);
    });
});

A simple querySelectorAll call will solve this quite well:

 var elements = document.querySelectorAll('.ccc > .l_ccc_data'); var texts = Array.prototype.map.call(elements, function(element) { return element.innerText; }) console.log(texts) // ["Total Needs to go here", "Total Needs to go here"] 
 <table> <tr class="ccc"> <td>Strategy & Performance</td> <td class="l_ccc_data" id="Foo~Q_1">Total Needs to go here</td> <td class="l_ccc_data" id="Foo~Q_2">Total Needs to go here</td> </tr> <tr class="inner"> <td id="Bar~Q_1">Some number I need</td> <td id="Bar~Q_2">Some number I need</td> </tr> <tr class="inner"> <td id="Something~Q_1">Some other number I need</td> <td id="Something~Q_2">Some number I need</td> </tr> </table> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM