【问题标题】:Randomize order of <a> links on page using jQuery使用 jQuery 随机化页面上 <a> 链接的顺序
【发布时间】:2011-11-06 10:25:58
【问题描述】:

我现在有一个位于标签内的链接列表。我希望页面在页面重新加载(页面视图)时“重新组织”每个链接的顺序并显示结果。

例如:

<div id="testgroup">
     <a href="1.html" id="1">1</a>
     <a href="2.html" id="2">2</a>
     <a href="3.html" id="3">3</a>
     <a href="4.html" id="4">4</a>
     <a href="5.html" id="5">5</a>
</div>

在页面重新加载时,源代码如下所示:

<div id="testgroup">
     <a href="5.html" id="5">5</a>
     <a href="1.html" id="1">1</a>
     <a href="3.html" id="3">3</a>
     <a href="4.html" id="4">4</a>
     <a href="2.html" id="2">2</a>
</div>

或其他一些随机顺序

是否有一个非常基本的 jQuery DOM 操作脚本来完成这个?如果有帮助,该页面也是基于 PHP 构建的。

【问题讨论】:

  • 链接是如何添加到页面的?它们来自数据库吗?你把它们放在一个数组里吗?
  • @Johnie Karr - 暂时和这个例子,它们是静态的并且硬编码到实际的 PHP 页面中

标签: php jquery dom-manipulation


【解决方案1】:

如果简单比随机更重要:

您可以使用 get 将 jQuery 对象转换为数组,然后使用原生的 sort 和一个旨在随机化它的函数。然后将随机排列的数组放回 DOM 中。

var array = $("#testgroup").children().get().sort( function() {
    return 0.5 - Math.random();
});
$("#testgroup").append(array);

演示:http://jsfiddle.net/4e7cs/

如果您正在寻找真正的洗牌:

您可以使用Fisher-Yates shuffle

var array = $("#testgroup").children().toArray();
var i = array.length,
    j, temp;
while (--i) {
    j = Math.floor(Math.random() * (i + 1));
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

$("#testgroup").append(array);

演示:http://jsfiddle.net/4e7cs/3/

这里有一个 writeup 说明为什么第一个不好,但为了完整起见,我会把它留在这里。

【讨论】:

  • 从技术上讲,您对我的问题给出了“正确”的答案。经过额外考虑,我现在打算走 PHP 路线,但感谢您的帮助!
【解决方案2】:

PHP 有一个shuffle() 函数来随机化数组。您可以在服务器端进行随机化。

<?php
$links = array(
    1 => '1.html',
    2 => '2.html',
    3 => '3.html',
    4 => '4.html',
    5 => '5.html'
);
$shuffledLinks = shuffle_assoc($links);

foreach ($shuffledLinks as $value=>$key) {
    echo '<a href="'.$key.'" id='.$value.'>'.$value.'</a><br/>';
}
function shuffle_assoc($list) {
    if (!is_array($list)) return $list;

    $keys = array_keys($list);
    shuffle($keys);
    $random = array();
    foreach ($keys as $key)
        $random[$key] = $list[$key];

    return $random;
} 
?>

好的...现在已修复并经过测试。实际上 shuffle() 不适用于关联数组,所以我借用了andjones at gmail dot com's shuffle_assoc() function for that

我还混淆了我使用“+”而不是“。”的连接。 O.o 混合了我的 JavaScript 和 PHP 语法。对此我深表歉意。

艾伦

【讨论】:

  • 上面的代码不能正常工作,但我明白了。谢谢你的帮助。有什么理由使用 PHP 而不是 jquery?
  • 通常 PHP 比 javascript 更快。 + 不保证最终用户使用 JavaScript。
【解决方案3】:

我正在使用一个实际上可以做到这一点的插件:http://james.padolsey.com/javascript/sorting-elements-with-jquery/

但是如果你使用的是PHP,你可以直接在服务器上排序吗?

【讨论】:

  • 就个人而言,我会使用 PHP 对其进行排序,正如 David 在这里提到的那样。
  • 感谢您的建议 - 虽然我相信这样做肯定是可行的,但我想让我们团队中的任何人尽可能简单地添加新的超链接(他们有零编码背景),在需要时匹配上面的格式,并通过一个 jQuery 函数来进行实际的随机化。
  • @David - 关于客户端不使用 JS 的实事求是;虽然我最近阅读了超过 70% 的时间,但总是需要考虑。也许我最终会走 PHP 路线。
  • @David - 很难在其他地方给予肯定,因为从技术上讲,你的答案是我将要使用的路线,但不得不感谢丹尼斯回答最初的问题以及他所投入的时间。
  • @JM4 我们的目标是帮助您,不仅要获得荣誉,还要感谢您提供的信息。
猜你喜欢
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多