jQuery.attr()在谷歌Chrome和IE上运行良好,但在Firefox 8.0.1上失败

时间:2011-12-10 09:59:10

标签: jquery firefox jquery-selectors firebug jplayer

我正面临着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 个答案:

答案 0 :(得分:1)

虽然我发现你所做的事情的细节有点奇怪,但我试图找到一种更稳定的方法来实现它。您看到的不一致行为似乎是由于时间问题所致。 “警报”,“调试步进”和“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);
});

第三,完整示例

我创建this fiddle让你玩。它以更完整的方式展示了我的建议。希望这能指出你正确的方向。

答案 1 :(得分:0)

您正在将jQuery对象保存在变量中;

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

然后你尝试通过将它包装为$()

来使该变量成为jQuery对象
$(curtrack).attr({rel:j});

尝试curtrack.attr(“rel”,j);

答案 2 :(得分:0)

从阅读评论看起来似乎是一个时间问题。我曾经有过类似的外部组件问题。它在通过代码时工作,但在正常运行时却没有。

我用黑客攻击解决了这个问题:

设置完所有值后,我在执行代码之前添加了一个小超时。

//set values
setTimeout(function(){
//I called the textbox I had problems with here
}, 20);

它起作用的时间,即使我宁愿正确地解决它,这比破碎的文本框更好。它会导致一个小的延迟,所以我实际上检查了我遇到问题的浏览器,否则运行正常的代码。