【问题标题】:jquery load order affects listjquery加载顺序影响列表
【发布时间】:2013-07-28 02:23:54
【问题描述】:

我有以下 jQuery 使用带有 li 状态项的 ul 将状态加载到配置文件页面。 each() 从 JSON 回调中获取项目,并且 load() 应该确保在创建 li 之前图像可用:

(showpic() 为我提供了一个格式良好的 url 供我使用。)

function showStatus(data){
var jsondata = $.parseJSON(data);
var testText = "";

$('#doNews').empty();
$('#doNews').append($('<ul/>', {"class": "newsList", id: "theNews"}));
$.each(jsondata, function(i, item){
    $('<img src="' + showpic(item[3]) + '" class="newsImage">')
    .load(function(){
        $(this)
            .appendTo($('#theNews'))
            .wrap($('<li>', {"class": "newsItem"}))
            .closest('li')
            .append(item[5])
      });
});

$("#statustext").val('');
}

问题在于状态提要现在似乎是按照图像加载的顺序写入页面的。即,不是按照 JSON 项目顺序写入,而是按照加载图像的顺序写入 li(这具有按用户分组状态的效果,而不是按日期写入,如 JSON 中那样)。

所以... 我将如何以 JSON 顺序编写项目并仍然等待 img 加载?

顺便说一下,我看了这个qn: jQuery each() and load() ordering

它似乎在正确的轨道上,但是当我尝试在 load() 函数中使用 hide() 然后 show() 时,它似乎从未被调用,并且 img 保持隐藏状态。如果这是您建议的解决方案,请给我一个简单的例子。

谢谢!

【问题讨论】:

    标签: ajax image jquery


    【解决方案1】:

    要么:

    1) 维护一个计数器和超时,计算开始时要加载的图像的数量,将项目创建为“隐藏”,在加载时倒数卸载的数量,然后(当计数器达到 0 或计时器超时时)显示一切;

    或:

    2) 将项目创建为隐藏,并在“加载”事件中显示它们。项目将以任意顺序出现,但最终会被正确排序。

    这是一个可能的示例:您的代码对于正在构建的结构和附加位置不是很清楚,所以这只是一个粗略(但编码清晰)的大纲。

    尝试更多地使用中间变量,而不是使用大量美妙的 jQuery 结构。它将帮助您调试它。

    console.log('loading news items');
    $.each( jsondata, function(i, item){ 
        console.log('  item', showpic(item[3]), item[5]);
        var img = $('<img src="' + showpic(item[3]) + '" class="newsImage" >');
        var element = img.wrap($('<li>', {"class": "newsItem", "style": "display:none;"}))
            .closest('li')
            .append(item[5]);
        element.appendTo( $('#theNews'));
    
        // when the IMG loads, find it's surrounding LI.. and show it.
        img.load( function(){
            console.log('  loaded', $(this).attr('src'));
            $(this).closest('li').show();
        });
        // put a timer & show it anyway after 8s, if img still hasn't loaded.
        element.delay( 8000).show(0);
    });
    

    您还会注意到代码中的日志记录。日志记录是良好的软件实践。 Console.log 在 IE 上不可用,因此您最终应该填充它或使用您自己的小型库函数。

    从根本上说,您必须避免在“加载”事件中添加到 DOM。这就是导致错误排序的原因。在 jsondata each() 函数中添加到 DOM,或者添加到一个单独的结构良好的代码中,以保证正确的排序。

    【讨论】:

    • 那么,你能帮我看看这个吗?我之前遇到的问题是,如果我没有在 load() 中添加到 DOM,那么它将在图片加载之前创建,并且我只有几张图片而不是 20 张。还要查看这个答案:stackoverflow。 com/questions/476679/... 如果我使用 preload(myImages),它是否也必须进入 load()?
    • 我在上面已经说过,在你的 each() 处理程序中创建隐藏的 DOM 元素 (style='display:none;')。你真的试过了吗?
    • jQuery 没有 preload() 函数,并且评论中的超链接不起作用。在这种情况下,我不会看到预加载的适用性,因为没有时间点知道您需要加载什么,在您实际需要加载它之前。因此,在您的情况下,没有“pre”。带你完成这个?你如何尝试自己并发布你能走多远。这个网站不是为你写代码。
    • stackoverflow.com/questions/476679/…Sheesh。没必要为此发脾气。我的猜测是,这是“当你知道怎么做的时候很容易”的情况之一。而且,如果您没有注意到,本网站上的大多数 answers 都有代码示例,而不仅仅是模糊的解释性文本。我一直在尝试很多不同的东西——在这里发帖是不得已而为之。所以回到问题上来, $.each(jsondata, function(i, item){ $('') 创建一个隐藏的 img。我该如何加载它?谢谢。
    • 感谢您正在研究的链接和好处。请查看示例代码以适应您的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多