jQuery. Каждая строка цикла или объект

Почему это не работает?

$( ["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() :( Всем спасибо за помощь, очень признателен.


person Jongosi    schedule 10.09.2012    source источник
comment
Ваш код выглядит просто отлично. Вы уверены, что window.location.pathname содержит параметр?   -  person João Silva    schedule 10.09.2012
comment
разве это не должно быть $(#blog,#user,#forum)?   -  person VVV    schedule 10.09.2012
comment
Ваш код находится в блоке readyили load? Возможно, ваши флажки еще не установлены.   -  person Michael Laffargue    schedule 10.09.2012
comment
Как упоминалось в @ComputerArts, это должен быть идентификатор, тип или имя класса — [.blog,.user,.forum] или #blog и т. д..   -  person karthikr    schedule 10.09.2012
comment
Не могли бы вы предоставить также html-код веб-страницы?   -  person Muffo    schedule 10.09.2012
comment
@karthikr не обязательно, метод каждый является универсальным, он работает с любым массивом, это не должно быть элементами.   -  person James    schedule 10.09.2012
comment
Согласен - итерируемые объекты!! Я исправляюсь. Благодарность   -  person karthikr    schedule 10.09.2012
comment
Спасибо, ребята. window.location.pathname не равно null и содержит путь, как и ожидалось.   -  person Jongosi    schedule 10.09.2012


Ответы (3)


В чем может быть проблема, если страница загружена не полностью и #rb-blog еще не доступен.

$(document).ready(function(){
    $( ["blog","user","forum"] ).each(function(num,opt) {
        if ( window.location.pathname.indexOf(opt) != -1 ) {
            $('#rb-' + opt).attr('checked','checked');
            return false;
        }
    });
});
person Ties    schedule 10.09.2012

Как уже отмечалось в комментариях, return false фактически выйдет из цикла «блог», «пользователь», «форум» и, таким образом, перестанет проверять флажки, как только одно условие pathname.indexOf будет истинным.

Также вы можете добавить console.log(window.location.pathname);, чтобы убедиться, что эта переменная содержит то, что вы проверяете. Возможно, это проблема с корпусом?

Если вы хотите узнать, какие литералы присутствуют в имени пути, вы можете использовать это:

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

Если вы просто хотите узнать, присутствует ли один из литералов в имени пути:

var isAtLeastOneIsPresent = false;
$( ["blog","user","forum"] ).each(function(num,opt) {
    if ( window.location.pathname.indexOf(opt) != -1 ) {
        $('#rb-' + opt).attr('checked','checked');
        isAtLeastOneIsPresent = true;
    }
});
person Laoujin    schedule 10.09.2012
comment
Спасибо, выход из цикла после первого совпадения является желаемым поведением. - person Jongosi; 10.09.2012

Решение: содержимое HTML еще не было записано на страницу, поэтому теперь мы ждем завершения запросов ajax, затем вызываем функцию для обновления значения выбора, например...

// 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 без макета на кнопках "назад" и "вперед"

person Jongosi    schedule 10.09.2012