jQuery .each循环字符串或对象

jQuery .each loop string or object

为什么这不起作用?

1
2
3
4
5
6
$( ["blog","user","forum"] ).each(function(num,opt) {
    if ( window.location.pathname.indexOf(opt) != -1 ) {
        $('#rb-' + opt).attr('checked','checked');
        return false;
      }
});

当我输入$('#rb-blog').attr('checked','checked');时,它会按预期工作吗?

console.log(typeof opt)产生string和预期值。

---更新---

我刚刚看到HTML通过Ajax被写入页面,并在.ready()上执行:(感谢大家的帮助,非常感谢。


如果页面没有完全加载,并且#rb-blog还不可用,那么问题可能是什么?

1
2
3
4
5
6
7
8
$(document).ready(function(){
    $( ["blog","user","forum"] ).each(function(num,opt) {
        if ( window.location.pathname.indexOf(opt) != -1 ) {
            $('#rb-' + opt).attr('checked','checked');
            return false;
        }
    });
});


解决方案:HTML内容还没有写入页面,所以现在我们等待Ajax请求完成,然后调用函数更新select值,就像这样……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// apply checked to the selected element
function setAsChecked() {
    $.each(["blog","user","forum"], function(num,opt){
        if (window.location.pathname.indexOf(opt) != -1) {
            $('#rb-' + opt, '.radio_menu').attr('checked','checked');
            return false;
        }
    });
}

// $('.radio_menu').ajaxStop(function(){
//  setAsChecked();
// });

// UPDATE! ajaxStop() catches all our ajax events - not cool. Instead, use when
$.when( $.ajax("") ).done(function(){
    setAsChecked();
});

也许这会让别人头疼!

---编辑---

被警告!当与cakephp一起使用时,这个解决方案会引起严重的头痛。当我们在页脚中调用这个函数时,布局就消失了。

查看此线程:cakephp后退和前进按钮上没有布局


正如评论中已经提到的,return false实际上将退出"blog"、"user"、"forum"循环,因此一旦一个pathname.indexOf条件为真,就会停止检查复选框。

另外,您可能希望添加一个console.log(window.location.pathname);,以确保该变量包含您正在检查的内容。可能是套管问题?

如果您想知道路径名中存在哪些文本,可以使用:

1
2
3
4
5
6
7
var isPresent = [];
$( ["blog","user","forum"] ).each(function(num,opt) {
    if ( window.location.pathname.indexOf(opt) != -1 ) {
        $('#rb-' + opt).attr('checked','checked');
        isPresent.push(opt);
    }
});

如果只想知道路径名中是否存在一个文本:

1
2
3
4
5
6
7
var isAtLeastOneIsPresent = false;
$( ["blog","user","forum"] ).each(function(num,opt) {
    if ( window.location.pathname.indexOf(opt) != -1 ) {
        $('#rb-' + opt).attr('checked','checked');
        isAtLeastOneIsPresent = true;
    }
});