JS(jQuery):随机触发 - 单击2个表行

时间:2012-05-08 19:43:33

标签: javascript jquery random triggers

鉴于此HTML:

<div id="TABLE1" class="tabs">
    <table>
        <tbody datasrc="Music">
            <tr id="randomid">lorem</tr>
            <tr id="foo">lorem</tr>
            <tr id="abcde">lorem</tr>
            <tr id="fghijk">lorem</tr>
            <tr id="lmnop">lorem</tr>
            <tr id="qwerty">lorem</tr>
        </tbody>
    </table>
</div>
<div id="TABLE_2" class="tabs">
    <table>
        <tbody datasrc="Music">
            <tr id="random5">lorem</tr>
            <tr id="farhaf">lorem</tr>
            <tr id="haerf">lorem</tr>
            <tr id="hagasdg">lorem</tr>
            <tr id="hrfafh">lorem</tr>
            <tr id="qwerty">lorem</tr>
        </tbody>
    </table>
</div>
<div id="LASTTABLE" class="tabs">
    <table>
        <tbody datasrc="Music">
            <tr id="rtefdgag">lorem</tr>
            <tr id="wrtjfd">lorem</tr>
            <tr id="reaht">lorem</tr>
            <tr id="aggag">lorem</tr>
            <tr id="rthhre">lorem</tr>
            <tr id="argarg">lorem</tr>
        </tbody>
    </table>
</div>

我试图从每个表中随机触发2 <tr>我甚至无法做到这一点。

目前我的测试使用:

$("#button").on('click', function () {
    $('#randomid').trigger('click')
})

但是这个触发器只是第一个表的第一行。

那我怎么能:

  1. 当我按#button时,
  2. 从每张表中获取2个随机行,Trigger
  3. 每10毫秒点击一行(因此他们有订单)。
  4. 关于应用:

    这是一个音乐播放器网站。每张桌子都有不同的音乐风格。 Rock,Alternative,Jazz等。有一个按钮'随机选择音乐')。该按钮将从每个表中触发2个随机tr,因此您最终会将2首爵士乐歌曲,2首摇滚歌曲等添加到播放列表中。该表看起来像这样:http://dribbble.com/system/users/31916/screenshots/167289/k-dribble.png?1309036379但这些复选框不是实际的复选框,而是在点击时改变位置的图像看起来和感觉比复选框更好,并且仍然像复选框一样。

    用户可以通过单击行上的任意位置(逻辑)来触发“复选框”或选择一首歌曲,因此后端的开发方式可以捕获行中任意位置的点击,而不是特定的复选框(因此我我不是选择触发那些)。我不认为有一个更好的解决方案,只需从每个tble中随机触发2行点击。

    支持IE8 +。

3 个答案:

答案 0 :(得分:3)

请参阅下面的我的版本,

DEMO

注意:下面的代码中有一些可以清理的演示代码和冗余变量,但我将它留在那里,以使代码看起来清晰且自我解释。

$(function() {
    var $tables = $('table'); //gets the tree tables

    var mQ = []; //music queue
    var timer = null;
    $('button').click(function () {
        $('#result').html(''); //demo code
        var t = 0, $tr;
        var t1 = [];
        $tables.each(function () {
            $tr = $(this).find('tr');

            t1[0] = Math.floor(Math.random()*$tr.length);
            t1[1] = Math.floor(Math.random()*$tr.length);

            while (t1[0] == t1[1]) { //To make sure not same row is selected
                t1[1] = Math.floor(Math.random()*$tr.length);
            }

            mQ.push($tr.get(t1[0]));
            mQ.push($tr.get(t1[1]));
        });

        timer = setInterval(function () {//Create timer to trigger click every 10ms
            if (mQ.length == 0) {
                clearInterval(timer);
                return false;
            }
            $(mQ.shift()).click().addClass('selected');            
        }, 10);
    });

    $('tr').click(function () {
        //do your magic
        $('#result').append(this.id + '<br />');
    });
});

答案 1 :(得分:3)

我首先会建议您以不同的方式执行此操作,但如果您已经开始触发点击事件,那么这就是一般性的想法。

  $(".tab").each(function(){
        var count = $(this).children(tr).length;    
        var r1 = Math.floor(Math.random()*count); //Get a random number less than the total count of rows
        $(this).children('tr').eq(r1).trigger('click');//retrieve the nth (r1) item in the list and fire it's trigger event

    });

答案 2 :(得分:1)

  

更新了小提琴上的新代码

也许更喜欢这个? ...

$(function() {
    $("button").click(function(e) {
        $(".selected").removeClass("selected");

        $("table").each(function(i) {
            var irand = {
                a: Math.floor((Math.random()*($(this).find("tr").length)-1)+1),
                b: undefined
            };

            while (irand.b == irand.a || irand.b == undefined) {
                irand.b = Math.floor((Math.random()*($(this).find("tr").length)-1)+1);
            };

            console.log($(this).find("tr").filter(function(i) { return i == irand.a || i == irand.b }).addClass("selected"));
        });
    });
});​

See working fiddle here ...