如果第一次不起作用,如何重新触发功能?

时间:2011-12-07 21:12:28

标签: jquery iframe

我有一个图像/媒体tumblr,它在第一页上加载了12-25张图像,这些图像可能非常大。

我让jQuery在布局和图像上做各种化妆品,特别是,我正在检查每个帖子,看看它是不是照片集,由Tumblr作为iframe。

从视觉上看,人们会看到照片集的缩略图预览库,当您点击缩略图时,它会打开一张带有全尺寸照片的灯箱幻灯片。

我的tweek等待加载iframe,删除缩略图库并将其替换为图库中的第一个完整分辨率图像。

这是我的代码:

$(".post_relative").each(function () {
        var post_relative = $(this);
        var photoset = post_relative.find('.html_photoset');
        if(photoset.length){
            var myFrame = photoset.find("iframe");
            myFrame.load(function(){
                console.log("frame loaded");
                var newCover = myFrame.contents().find('.photoset').children(':first-child').children(':first-child');
                myFrame.contents().find('img').each(function(){
                    $(this).hide();
                })
                newCover.children(':first-child').remove();
                var psPre = newCover.attr("href")+ '?' + (Math.random() * 1000000);
                newCover.append("<img src='"+ psPre +"' alt='Cover Page' />");
                var psHeight = newCover.find('img');
                psHeight.load(function(){
                if (psHeight.height()>heightRef){
                    psHeight.height(heightRef);
                }
                newCover.detach();
                post_relative.append(newCover);
                myFrame.hide();
            })
            })
        }

无论如何,它有效率,75%的时间。我只能想象Tumblr有时会超载,或者页面上有太多的东西?

是什么导致jQuery不一致?是否有jQuery代码允许我仔细检查代码是否正确完成?

你可以看到它在这里工作与否: http://syndex.me

如果它不起作用,第三篇文章将如下所示: wrong

如果它正常工作,它将如下所示: right

2 个答案:

答案 0 :(得分:1)

我怀疑那段间歇性工作的代码可能是load上的iframe处理程序。如果由于浏览器缓存未加载iframe,或者如果在附加加载处理程序之前已经加载了框架的竞争条件,则可能不会触发您的处理程序。

<强>更新

埃文的答案是正确的,可能是正确的答案;你应该有负载处理程序的错误处理。但是,如果你发现框架加载没有错误,而是你的处理程序没有被触发:

  1. 如果这是由竞争条件引起的,请确保重新设计代码,以便在将帧插入DOM之前附加事件处理程序。
  2. 如果这是由于缓存,请在框架上添加一些东西&#39;网址,以确保他们始终是唯一的。

答案 1 :(得分:1)

你可以尝试两件事。我要做的第一件事就是在你的加载函数中添加一个回调函数:

myFrame.load("yourUrl", function(response, status, xhr) {
  if (status == "error") {
    var msg = "Sorry but there was an error: ";

    // do whatever if there is an error

    $("#error").html(msg + xhr.status + " " + xhr.statusText);
  }
});

如果这对您不起作用,我建议您在代码中使用try catch语句。围绕您认为失败的代码块包装尝试,然后添加一个catch语句,以便您知道是否在该特定块中遇到错误。你也可以throw custom errors告诉你究竟什么是失败的。