【问题标题】:Selecting link from preselected links and go to choosen link once从预选链接中选择链接并转到选择的链接一次
【发布时间】:2018-11-05 02:21:25
【问题描述】:

我想做类似的事情;所有链接只访问一次,当所有链接都被访问过时,删除已访问链接的数据,从头开始统计已访问链接。

此代码效果很好,但有时相同的链接会连续出现。

var urls=["http://randomemes.com/links/apotatoflewaround.html",
"youtube.com",
"yandex.com",
"google.com",

];
function goSomewhere() {
var e=Math.floor(Math.random()*urls.length);
window.location=urls[e],
urls.splice(e, 1)
}

<!-- begin snippet: js hide: false console: true babel: false -->
&lt;input class="start" type="button" onClick="goSomewhere(); return ;" alt="Submit" width="800" height="100"value="»» Bring Memes ««"&gt;

【问题讨论】:

  • 外部链接需要http://

标签: javascript html


【解决方案1】:

问题是,您将在哪里保存访问过的链接?您不能只从数组中删除项目,因为这些值在您离开页面后不会保存,因此当您返回页面时,您将拥有完整的 urls 数组。您可以使用localStorage 来存储您的数据。您可以为每个链接创建一个对象,并在其内部使用 url 和 visited 等属性来检查页面是否已被访问。但是localStorage 不能存储javascript 对象,只能存储变量和JSON 字符串,但是您可以使用JSON.parse() 和JSON.stringify() 来解决它。实现可能是这样的(我写的很匆忙,它可能会写得更短更好,但它应该可以工作,我在 cmets 中写了一些解释):

// Store javascript object to localStorage
Storage.prototype.setObject = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

// Get javascript object from localStorage
Storage.prototype.getObject = function(key) {
    return JSON.parse(this.getItem(key));
}

// Your URLs with default visited values
var urls = [
    { name: "somesite1", url: "http://somesite1.com", visited: false },
    { name: "somesite2", url: "http://somesite2.com", visited: false },
    { name: "somesite3", url: "http://somesite3.com", visited: false },
    { name: "somesite4", url: "http://somesite4.com", visited: false }
];

// If there's no urls object in localStorage, call setDefault method
if (!localStorage.getObject("urls")) {setDefault();}

// Check all link objects. If all are visited, return true, else return false
function checkVisited() {
    var counter = 0;
    var getUrls = localStorage.getObject("urls");
    for (var i = 0; i < getUrls.length; i++) {
        if (getUrls[i].visited) {counter++;}
    }
    return counter === getUrls.length;
}

// Set defaults values to localStorage
function setDefault() {
    localStorage.setObject("urls", urls);
}

// If all links are visited, set default values
// Then get random links until you find one
// that's not visited. When it's found, set it
// to visited in localStorage and redirect to it 
function goSomewhere() {
    if (checkVisited()) {setDefault();}
    var getUrls = localStorage.getObject("urls");
    var visited = true;
    while(visited) {
        var e = Math.floor(Math.random()*getUrls.length);
        if (!getUrls[e].visited) {
            visited = false;
            getUrls[e].visited = true;
            localStorage.setObject("urls", getUrls);
            window.location = getUrls[e].url;
        }
    }
}

希望这会有所帮助。要查看有关 localStorage 的更多信息,请查看 MDN:https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

也适用于 JSON:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON

【讨论】:

  • 你太棒了!自 1 个月以来我一直在寻找类似的东西。非常感谢。
  • 其实我还有一个问题。我想在我的主页上添加一个复选框。如果选中,则将使用另一个预选的链接集。
  • 你可以拥有三个数组,比如urls、urlsChecked、urlsUnchecked,然后在复选框上查找 onchange 事件。当事件被触发时,您执行if (checkBox.checked) { urls = urlsChecked } else { urls = urlsUnchecked } 之类的操作。您将值存储在 urlsChecked 和 urlsUnchecked 数组中,并使用 urls 将它们传递给函数调用
  • 我错过了一些事情,例如您必须在localStorage 中至少有两个数组等。您仍然需要根据复选框上的onchange 事件执行您的操作,因此您需要查看在那个方向。您需要修改我发布的代码,而不仅仅是添加我在最后一条评论中写的内容。最好打开另一个问题。
猜你喜欢
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多