【问题标题】:JS (jQuery): Randomly trigger-click 2 table rowsJS(jQuery):随机触发单击 2 个表格行
【发布时间】:2012-05-17 08:02:44
【问题描述】:

鉴于此 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 个&lt;tr&gt;我什至无法做到这一点。

目前我使用的测试是:

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

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

那我该怎么办:

  1. 当我按下#按钮时,
  2. 从每个表中获取 2 个随机行,触发器
  3. 每 10 毫秒点击一次每一行(这样他们就有了顺序)。

关于应用程序:

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

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

支持 IE8+。

【问题讨论】:

  • 你的最终目标是什么?您究竟想通过随机点击两个表格行来实现什么?
  • 是的,因为如果您尝试制作某种动画或创建动态内容或您有什么,有比尝试在随机表中的随机行上随机模拟点击事件更好的方法。如果人们知道您的最终目标是什么,他们或许能够为您提供比您正在尝试的更好的解决方案。
  • 这是一个音乐播放器网站。每张桌子都有不同风格的音乐。摇滚,另类,爵士等。有一个按钮'随机选择音乐')。该按钮将触发每个表中的 2 个随机 tr,因此您最终将 2 首爵士音乐、2 首摇滚音乐添加到播放列表中。表格看起来像这样:dribbble.com/system/users/31916/screenshots/167289/… 但这些复选框不是实际的复选框,而是在点击时改变位置的图像,看起来和感觉比复选框更好,并且仍然与复选框相同
  • 用户可以通过点击行的任意位置触发'复选框'或行,所以后端的开发方式是捕获一行任意位置的点击,我没有更好的解决方案只是从每个表中随机触发 2 行点击。
  • 您支持哪些浏览器?你可以使用css3吗?随机 nth-child 调用?

标签: javascript jquery random triggers


【解决方案1】:

请看下面我的版本,

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 />');
    });
});

【讨论】:

  • @Vega 我提交答案只是为了好奇。但你是最好的。
【解决方案2】:

我首先建议您以不同的方式执行此操作,但如果您打算触发点击事件,这是一般的想法。

  $(".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

    });

【讨论】:

    【解决方案3】:

    在 Fiddle 上也更新了新代码

    也许更像这样? ...

    $(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 ...

    【讨论】:

    • 这实际上行不通。它是为我的测试用例设计的。我已经提到了应用程序是什么,因此我有超过 3 个表(大约 40 个)。也就是说,我需要补足 rand40,这不是我想要的。
    • 所有表的 tr 长度都一样吗?
    • 没有。一点也不。表格是音乐类别。每个类别大约有 100 首歌曲。也就是说,有些可能有 110 个,其他 87 个其他 158 个等等。
    • 更新的小提琴,我认为它完全符合您的要求,“想想”
    猜你喜欢
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2016-10-24
    • 2017-05-21
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多