单击for循环中的函数
Click function inside for loop
我正试图循环我的。hide()和。show()点击处理程序,我不能让这个简单的部分正确工作。我的按钮叫做"#towelcome"等等。我想我错过了一些愚蠢而明显的东西。所有的div都隐藏在css中。
var elements = ["welcome", "slides", "projects", "pages"];
for (i=0;i<=elements.length-1;i++){
$("#to"+elements[i]).click(function() {
$("#"+elements[i]).show();
});
}
/更新 :------------------------------------------------------------------------
下面的代码是我想要最小化的代码。
$("#toprojects").click(function(){
$("#projects").show();
$("#slides").hide();
$("#pages").hide();
$("#welcome").hide();
});
$("#toslides").click(function(){
$("#projects").hide();
$("#slides").show();
$("#pages").hide();
$("#welcome").hide();
});
$("#topages").click(function(){
$("#projects").hide();
$("#slides").hide();
$("#pages").show();
$("#welcome").hide();
});
if(window.location.hash === "#slides"){
$("#projects").hide();
$("#slides").show();
$("#pages").hide();
$("#welcome").hide();
}
if(window.location.hash === "#projects"){
$("#projects").show();
$("#slides").hide();
$("#pages").hide();
$("#welcome").hide();
}
if(window.location.hash === "#pages"){
$("#projects").hide();
$("#slides").hide();
$("#pages").show();
$("#welcome").hide();
}
在这里找到了一个相关的帖子,它很好地解决了这个问题jQuery: Set click from array loop
我还没有测试过这个,但我认为沿着这些行应该为您工作:
var elements = ["welcome", "slides", "projects", "pages"];
var clickHandler = function(element) {
var id = element.attr('id') || $(this).attr('id');
$.each(elements, function(index, value) {
var element = $('#' + value);
if (id !== 'to' + element.attr('id')) {
element.hide();
} else {
element.show();
}
});
};
$.each(elements, function(index, value) {
$('#to' + value).click(clickHandler);
});
if ($.inArray(window.location.hash, elements)) {
var id = window.location.hash.substring(1);
clickHandler($('#' + id));
}
var elements = ["welcome", "slides", "projects", "pages"];
jQuery.each(elements,function(){
element = this;
$("#to"+element).live("click",function() {
$("#"+element).show(); // use toggle for hiding/show as per current state
});
});
您遇到了闭包的问题。无论点击哪个元素,i
的值都是4
。有很多方法可以解决这个问题,但是jQuery提供了一个特别方便的方法,each
函数:
var elements = ["welcome", "slides", "projects", "pages"];
$.each(elements, function(index, element) {
$("#to" + element).click(function() {
$("#" + element).show();
});
});
我们需要看到更多的代码来确定,但明显的东西可能会丢失:
- 你在这里使用JQuery功能:你在你的页面中包含了JQuery库吗? 以上代码需要在文档完全加载后运行,否则click()事件可能无法正确注册到按钮。最好的方法是使用jQuery的
$(document).ready()
方法。只需将上述所有代码包装在$(document).ready() {}
函数中,它就应该工作了。您还需要将i
变量传递给click函数,因为直到稍后才会实际调用它,并且i
的原始值早就消失了。
$(document).ready() {
var elements = ["welcome", "slides", "projects", "pages"];
for (i=0;i<=elements.length-1;i++){
$("#to"+elements[i]).click(function(i) {
$("#"+elements[i]).show();
});
}
}
正如其他人建议的那样,您可以重构循环以使用.each()
,但我认为这样做没有任何意义。我可能会使用for(i in elements) {...}
,但您使用的语法是好的。
看看你的代码更新,你'试图缩小',我认为一个不同的方法可能会工作得很好。使用JQuery toggle()
函数和一些类名以及id,您可以将整个内容放入几行中,而根本不需要循环。像这样:
$(".to-button").click(function(){
var name = $(this).attr('id').replace(/^to/,'');
$(".infopanel").hide();
$("#"+name).show();
});
那么你的HTML代码将有这样的类:
<div id='toprojects' class='to-button'>Projects</div>
和
<div id='projects' class='infopanel'>info about projects here...</div>
和类似的幻灯片,页面和欢迎。
我试图想出一种方法,将hide()
和show()
行合并为一个使用.toggle()
和showorhide
标志,但它是太早了,早上想得太辛苦了。我相信会有办法的。
- Chrome/jQuery未捕获范围错误:超过了最大调用堆栈大小(函数循环)
- 如何在返回值(Js)时不中断函数/循环
- 函数在自己的循环中使用 i,以及一个子函数循环 - var 的行为类似于 let
- 我可以在 jquery 中对函数循环使用相同的返回值吗?
- 如何使用 each() 函数循环访问 JSON 文件
- jQuery函数循环两次
- setInterval 函数循环太快
- 简化我的函数(循环、数组)
- 我的 IF 条件如何影响全局变量使函数循环
- 使用ReactJS和concatJSX语法进行渲染时的map函数循环
- 如何通过OnClick函数循环遍历标记元素并在显示器上获得相应的内容
- 函数循环问题
- 将计数器添加到javascript函数循环中
- 通过future函数循环和设置全局变量
- jQuery创建一个函数循环,每个函数都有一个动画队列
- 从另一个函数终止一个活动的javascript函数/循环
- jQuery函数循环:为什么夏奇拉在陌生人吻她时重复吻
- 在一个简单的函数循环中设置style.display时出现了奇怪的行为
- 通过多个函数循环/setinterval
- 试图防止Jquery函数循环