我有一个关于jquery的小问题:我需要做这样的事情:
$(document).ready(function(){
links = {};
links.a = "Link a";
links.b = "Link b";
links.c = "Link c";
for (x in links){
$("#" + x).css("border","1px solid #000");
$("#" + x).click(function(){
alert(x);
});
}
});
</script>
<div id="a">a</div><br />
<div id="b">b</div><br />
<div id="c">c</div><br />
因此,当您点击div#a时,您将获得“链接a”警报,div#b上的“链接b”等等... 问题是,如果你运行这个代码,点击每个元素将给出警告(“链接c”)作为结果,似乎只有最后一个函数变量分配给每个div ...
当然我可以通过编辑函数来使用div的id并使用$(this)来破解它,但是对于cursiosity:有没有办法让这个循环工作?通过为函数中的每个元素创建和分配新函数?
提前......
答案 0 :(得分:32)
关于jQuery的好处是它允许链接和绑定多个元素,就像css一样。
$(document).ready(function(){
$('#a,#b,#c')
.css("border","1px solid #000")
.bind('click',function(){
// do something
});
});
答案 1 :(得分:6)
我相信这就是你所追求的:
$(document).ready(function(){
links = {
a:"Link a",
b:"Link b",
c:"Link c",
};
$.each(links, function(id,text){
$("#"+id)
.css("border","1px solid #000")
.click(function(){ alert(text) })
})
});
答案 2 :(得分:4)
使用闭包:(“这个”解决方案更优雅,但我发布这个是因为现在删除的答案有一个无效的闭包解决方案)
$(document).ready(function(){
links = {};
links.a = "Link a";
links.b = "Link b";
links.c = "Link c";
for (var x in links){
$("#" + x).css("border","1px solid #000");
$("#" + x).click(
function(xx){
return function() { alert(xx) };
}(x)
);
};
});
答案 3 :(得分:2)
工作演示http://jsfiddle.net/FWcHv/
在您的代码中,您多次调用jQuery构造函数,$('#a')
而不是$('#b')
和$('#c')
,而应该调用$('#a,#b,#c')
在我的代码中,我使用$ .each传递了所有id并将它们组合在一起,并在下一步中使用存储在变量$('#a,#b,#c')
中的x
来使代码优化且简单。< / p>
我还检查过如果links{}
为空,则不会使用变量i
进行处理
$(document).ready(function () {
links = {};
links.a = "Link a";
links.b = "Link b";
links.c = "Link c";
i = 0;
x = '';
$.each(links, function (id) {
x += "#" + id + ',';
i++;
});
if (i > 0) {
$($(x.slice(0, -1))).css("border", "1px solid #000").click(function () {
alert($(this).text());
});
}
});
答案 4 :(得分:1)
<script type="text/javascript">
$(document).ready(function(){
$('.links').css("border","1px solid #000");
$('.links').live('click', function() {
alert("Link " + $(this).attr('id'));
});
});
</script>
</head>
<body>
<div id="a" class="links">a</div><br />
<div id="b" class="links">b</div><br />
<div id="c" class="links">c</div><br />
答案 5 :(得分:0)
您需要使用“this”。
$(document).ready(function(){
links = {};
links.a = "Link a";
links.b = "Link b";
links.c = "Link c";
for (var x in links){
$("#" + x).css("border","1px solid #000");
$("#" + x).click(function(){
alert("Link "+this.id+" Alert!");
});
}
});
答案 6 :(得分:0)
<script type="text/javascript">
$(document).ready(function(){
links = {};
links.a = "Link a";
links.b = "Link b";
links.c = "Link c";
for (x in links){
$("#" + x).css("border","1px solid #000").click(function(){
alert($(this).attr('id'));
});
}
});
</script>
</head>
<body>
<div id="a">a</div><br />
<div id="b">b</div><br />
<div id="c">c</div><br />
答案 7 :(得分:0)
看到你正在硬编码要被影响的元素,你也可以这样做,因为它可能更快,更清洁,IMO:
$("#a,#b,#c").css("border","1px solid #000");
$("#a,#b,#c").click(function(){
alert("Link "+this.id+" Alert!");
});
修改:我没有看到你问题的最后一部分......抱歉。你也可以这样做:
var links = {};
links.a = "Link a";
links.b = "Link b";
links.c = "Link c";
var ids = '';
$.each(function(key,val) {
ids += "#"+key+","; // extra commas are ignored in jQuery
});
$(ids)
.css("border","1px solid #000")
.bind('click',function(){
alert("Link "+this.id+" Alert!");
});
答案 8 :(得分:0)
尝试使用:
$(window).load(function(){
});
:)