所以页面加载,但页面的一部分是从服务器获取的,后来加载,所以我设置了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);
答案 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";
}
};