jQuery.attr () отлично работает в Google Chrome и IE, но не работает в Firefox 8.0.1 - PullRequest
8 голосов
/ 10 декабря 2011

Я сталкиваюсь с любопытным поведением Firefox 8.0.1: этот фрагмент кода отлично работает в Google Chrome и IE, но в Firefox он не работает, за исключением случаев, когда я запускаю его в «режиме отладки _ шаг за шагом» или если Я ставлю предупреждение сразу после строки, в которой я устанавливаю атрибут "rel" ...

// some stuff before
// this piece of code works fine excepts on FF
        totaltracks = data.length;
    j=0;
    while(j<totaltracks){
        newtrack =data[j];
        myPlaylist.add(newtrack);
        tracks = $("a.jp-playlist-item");
        curtrack =  $("a.jp-playlist-item")[j];
        $(curtrack).attr({rel:j});
        // I tried too : $("a.jp-playlist-item")[j].attr("rel",j); with same no effect on FF
        j++;            
    }    

Кажется, FF просто не позаботится о инструкции (или прыгнет), если не выполнено шаг за шагом ... 2 дня прошло лицом к этой стене ... любая помощь / подсказка / трюк будет высоко ценится

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

Хотя я нахожу специфику того, что вы делаете, немного странной, я попытался найти более стабильный способ добиться этого. Кажется вероятным, что непоследовательное поведение, которое вы наблюдаете, связано с проблемами времени. «Alert», «debug steping» и «setTimout» взламывают все точки в этом направлении.

Сначала несколько отзывов о вашем коде

totaltracks = data.length;
j=0;

// I preferably use $.each() in these type of situations.
// See http://api.jquery.com/jQuery.each/
while(j<totaltracks){
    newtrack =data[j];
    myPlaylist.add(newtrack);

    // Here you select the same DOM elements for every loop of the while statement.
    // This is a performance issue.
    tracks = $("a.jp-playlist-item");

    // Here you select the those DOM elements once again,
    // then you assign the j:th element to the curtrack variable.
    // This doubles the performance issue.
    curtrack =  $("a.jp-playlist-item")[j];

    $(curtrack).attr({rel:j});
    j++;            
}

Я верю, что эти проблемы с производительностью могут быть причиной ваших проблем.

Во-вторых, мое предложение

// Select the DOM elements only once.
var trackElements = $("a.jp-playlist-item"),
    trackData = [
                    {title: 'Stuck in a groove', artist: 'Puretone'},
                    {title: 'Addicted To Bass', artist: 'Puretone'},
                    {title: 'Hypersensitive', artist: 'Puretone'}
                ];

$.each(trackData, function(index, newTrack){
    myPlaylist.add(newTrack);
    $(trackElements[index]).attr("rel", index);
});

В-третьих, полный пример

Я создал эту скрипку , чтобы вы могли поиграть с ней. Это демонстрирует мое предложение в более полной форме. Надеюсь, это указывает на правильное направление.

0 голосов
/ 10 декабря 2011

После прочтения комментариев это похоже на проблему времени.Однажды у меня была похожая проблема с внешним компонентом.Это работало при просмотре кода, но не во время его нормального выполнения.

В тот раз я решил это с помощью хака:

После установки всех значений я добавил небольшой тайм-аут перед выполнением кода.хотя я предпочел бы решить это правильно, это было бы лучше, чем разбитое текстовое поле.Это приведет к небольшой задержке, поэтому я на самом деле проверил браузер, с которым у меня были проблемы, и запустил обычный код в противном случае.

0 голосов
/ 10 декабря 2011

Вы сохраняете объект jQuery в переменной;

curtrack =  $("a.jp-playlist-item")[j];

, но затем вы пытаетесь сделать эту переменную объектом jQuery, обернув его $ ()

$(curtrack).attr({rel:j});

Попробуйте curtrack.attr ("rel", j);

...