函数不适用于setTimeout

时间:2016-10-23 16:41:38

标签: javascript html web

所以页面加载,但页面的一部分是从服务器获取的,后来加载,所以我设置了setTimeout函数,但是这样做之后出现了错误

Uncaught reference error: check is not defined

我还在setTimeout之外移动了检查功能仍然没有运气

如果在开发人员控制台的所有内容中没有超时功能粘贴它,则检查功能正常工作。

setTimeout(function() {


    var getclass = document.getElementsByClassName('title');
    var containerlength = getclass.length;

    for (var i = 0; i < containerlength; i++) {
        var container = getclass[i];
        var jobid = getclass[i].children[0].innerHTML.trim().substring(0, 5);
        var fragment = document.createElement('div');
        var chk = "";
        if (localStorage.getItem(jobid) == 1) {
            chk = "checked";
            getclass[i].style.textDecoration = 'line-through';
        }
        fragment.innerHTML = '<input onclick="check(this)" class="jobs" value="' + jobid + '" name="' + jobid + '" type="checkbox"' + chk + '></input>';
        container.appendChild(fragment);

    }

    function check(ele) {
        //     alert(ele.name);
        var name = ele.name;
        var papa = ele.parentNode.parentNode;
        if (localStorage.getItem(name) == 1) {
            localStorage.setItem(name, 0);
            papa.style.textDecoration = 'none';
        } else {
            localStorage.setItem(name, 1);
            papa.style.textDecoration = 'line-through';
        }
    }


}, 5000);

4 个答案:

答案 0 :(得分:2)

这可能是因为你在setTimeout回调范围内定义了check函数。尝试将检查功能排除在范围之外,如下所示:

function check(ele)
{
    //     alert(ele.name);
    var name = ele.name;
    var papa = ele.parentNode.parentNode;
    if(localStorage.getItem(name) == 1)
    {
        localStorage.setItem(name, 0);
        papa.style.textDecoration = 'none';
    }
    else
    {
        localStorage.setItem(name, 1);
        papa.style.textDecoration = 'line-through';
    }
}


setTimeout(function(){ 

var getclass = document.getElementsByClassName('title');
var containerlength = getclass.length;

for(var i=0; i<containerlength; i++)
{
    var container = getclass[i];
    var jobid = getclass[i].children[0].innerHTML.trim().substring(0, 5);
    var fragment = document.createElement('div');
    var chk = "";
    if(localStorage.getItem(jobid) == 1)
    {
        chk = "checked";
        getclass[i].style.textDecoration = 'line-through';
    }
    fragment.innerHTML = '<input onclick="check(this)" class="jobs" value="' + jobid + '" name="' + jobid + '" type="checkbox"' + chk + '></input>';
    container.appendChild(fragment);

}
}, 5000);

答案 1 :(得分:1)

你可以在超时之外编写检查功能。这样你的问题就可以解决,因为这个功能总是可用的。

答案 2 :(得分:1)

因为您尝试引用全局check功能,而不是本地check

使用当前在循环中构建输入元素的方式,您无权访问已声明check的范围。

当你可以访问输入元素引用时,你可以添加/设置事件监听器 - 那么这里的好处是使用document.createElement()创建输入元素,这样你就可以访问返回的HTML在您有权访问check的同一范围内的元素引用。

var input = document.createElement('input');
input.addEventListener('click', check.bind(null, input), false);
// This event listener could also be set
// through the 'HTMLElement#onclick' setter

fragment.appendChild(input);

以下是您的代码中的实现示例:(我将check移至较早的范围以提供易读性)

var check;

check = function(ele) {
  var name = ele.name;
  var papa = ele.parentNode.parentNode;

  if (localStorage.getItem(name) === 1) {
    localStorage.setItem(name, 0);
    papa.style.textDecoration = 'none';

  } else {
    localStorage.setItem(name, 1);
    papa.style.textDecoration = 'line-through';
  }
}

setTimeout(function() {
  var getclass = document.getElementsByClassName('title');
  var containerlength = getclass.length;

  for (var i = 0; i < containerlength; ++i) {
    var container = getclass[i];

    var jobid = getclass[i]
                  .children[0]
                  .innerHTML
                  .trim()
                  .substring(0, 5);

    var fragment = document.createElement('div');
    var chk = "";

    if (localStorage.getItem(jobid) === 1) {
      chk = "checked";
      getclass[i].style.textDecoration = 'line-through';
    }

    var input = document.createElement('input');

    input.addEventListener('click', check.bind(null, input), false);
    input.class = "jobs";
    input.value =
    input.name = jobid;
    input.type = "checkbox";

    fragment.appendChild(input);
    container.appendChild(fragment);

  }
}, 5000);

答案 3 :(得分:1)

只需将check函数移到setTimeout之外,然后删除输入中的大括号。

检查这个plunker

https://plnkr.co/edit/sop3R4PqQ13M7DwovdnZ?p=preview

template<typename T>
class Tree<T>::no_parent : public std::exception {
    virtual const char* what() const _NOEXCEPT
    {
        return "no_parent";
    }
};