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 не е задължително, методът each е общ, работи с всякакъв вид масив, не трябва да са елементи.   -  person James    schedule 10.09.2012
comment
Съгласен - итерируеми обекти!! Поправям се. Благодаря   -  person karthikr    schedule 10.09.2012
comment
Благодаря момчета. window.location.pathname не е нула и съдържа пътя, както се очаква.   -  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 всъщност ще излезе от цикъла "blog", "user", "forum" и по този начин ще спре да поставя отметки в квадратчетата, след като едно 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);
    }
});

Ако просто искате да знаете дали един от литералите присъства в pathname:

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
Thx, излизането от цикъла след първото съвпадение е желаното поведение. - 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