使用 jQuery 预加载图像

发布于 2024-09-12 21:32:24 字数 2487 浏览 3 评论 0原文

我知道这是一个热门话题,而且我知道以前也有过具有相同标题的问题,但我尝试了所有方法,但有些东西不起作用。由于某种原因,我的 Firefox 不会预加载图像。图像会在 IE7/8 和 Chrome 中预加载(正如它们应该的那样)。但在 Firefox 中则不然。

编辑:

我创建了一个新的小提琴: http://jsfiddle.net/Z2W7r/ 如果有人可以修改它并添加适当的 jQuery 或 Javascript 代码来预加载图像,我将非常感激。


我什至使用以下插件:

jQuery.preloadCssImages = function(){
    var allImgs = [];//new array for all the image urls 
    var k = 0; //iterator for adding images
    var sheets = document.styleSheets;//array of stylesheets

    for(var i = 0; i<sheets .length; i++){//loop through each stylesheet
            var cssPile = '';//create large string of all css rules in sheet
            var csshref = (sheets[i].href) ? sheets[i].href : 'window.location.href';
            var baseURLarr = csshref.split('/');//split href at / to make array
            baseURLarr.pop();//remove file path from baseURL array
            var baseURL = baseURLarr.join('/');//create base url for the images in this sheet (css file's dir)
            if(baseURL!="") baseURL+='/'; //tack on a / if needed
            if(document.styleSheets[i].cssRules){//w3
                    var thisSheetRules = document.styleSheets[i].cssRules; //w3
                    for(var j = 0; j<thisSheetRules.length; j++){
                            cssPile+= thisSheetRules[j].cssText;
                    }
            }
            else {
                    cssPile+= document.styleSheets[i].cssText;
            }

            //parse cssPile for image urls and load them into the DOM
            var imgUrls = cssPile.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);//reg ex to get a string of between a "(" and a ".filename"
            if(imgUrls != null && imgUrls.length>0 && imgUrls != ''){//loop array
                    var arr = jQuery.makeArray(imgUrls);//create array from regex obj       
                    jQuery(arr).each(function(){
                            allImgs[k] = new Image(); //new img obj
                            allImgs[k].src = (this[0] == '/' || this.match('http://')) ? this : baseURL + this;     //set src either absolute or rel to css dir
                            k++;
                    });
            }
    }//loop
    return allImgs;

}

并像这样调用它:

$(document).ready(function() {

$.preloadCssImages();
});

所以...有人知道为什么这个脚本(或任何脚本)不能只在 Firefox 中工作吗?如果需要,我可以提供该网站的地址。

I know this is a hot topic and I know there have been previous questions with identical titles, but I tried everything and something's just not working right. For some reason, my Firefox will not preload the images. The images DO preload (as they should) in IE7/8 and Chrome. But not in Firefox.

EDIT:

I've created a new Fiddle: http://jsfiddle.net/Z2W7r/
If anyone can modify it and add the proper jQuery or Javascript code to make the image preload, I would be so gratefully appreciative.


I'm even using the following plugin:

jQuery.preloadCssImages = function(){
    var allImgs = [];//new array for all the image urls 
    var k = 0; //iterator for adding images
    var sheets = document.styleSheets;//array of stylesheets

    for(var i = 0; i<sheets .length; i++){//loop through each stylesheet
            var cssPile = '';//create large string of all css rules in sheet
            var csshref = (sheets[i].href) ? sheets[i].href : 'window.location.href';
            var baseURLarr = csshref.split('/');//split href at / to make array
            baseURLarr.pop();//remove file path from baseURL array
            var baseURL = baseURLarr.join('/');//create base url for the images in this sheet (css file's dir)
            if(baseURL!="") baseURL+='/'; //tack on a / if needed
            if(document.styleSheets[i].cssRules){//w3
                    var thisSheetRules = document.styleSheets[i].cssRules; //w3
                    for(var j = 0; j<thisSheetRules.length; j++){
                            cssPile+= thisSheetRules[j].cssText;
                    }
            }
            else {
                    cssPile+= document.styleSheets[i].cssText;
            }

            //parse cssPile for image urls and load them into the DOM
            var imgUrls = cssPile.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);//reg ex to get a string of between a "(" and a ".filename"
            if(imgUrls != null && imgUrls.length>0 && imgUrls != ''){//loop array
                    var arr = jQuery.makeArray(imgUrls);//create array from regex obj       
                    jQuery(arr).each(function(){
                            allImgs[k] = new Image(); //new img obj
                            allImgs[k].src = (this[0] == '/' || this.match('http://')) ? this : baseURL + this;     //set src either absolute or rel to css dir
                            k++;
                    });
            }
    }//loop
    return allImgs;

}

And calling it like this:

$(document).ready(function() {

$.preloadCssImages();
});

So...Does anyone have any idea why this script (OR ANY SCRIPTS at that matter) are not working in Firefox only? I can provide the address for the site if requested.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

所有深爱都是秘密 2024-09-19 21:32:24

很旧但有威胁,但问题仍然存在!!
我尝试过不同的脚本来存档此事件(包括此脚本)并调试发生的时间和原因。

我发现只有当这 3 个条件满足时脚本才会失败
pot:

Linux 操作系统 上运行 Firefox 浏览器,并且当您的 CSS 文件中有 <图像的代码>跨域URL

原因是,HTTP_access_control...但必须对 Linux 进行一些操作 另外..因为即使你尝试
代码中的 Access-Control-Allow- 失败了。

我对此的实际解决方案(不优雅但至少避免了问题)是根据以下条件加载脚本:

<?PHP
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $firefox = strpos( $ua, 'Firefox') ? true : false ;
    $ubuntu = strpos( $ua, 'Ubuntu') ? true : false ;
    if ( !$firefox && !$ubuntu )echo '<script type="text/javascript" src="js/preloadcssimg.js"></script>';
?>

Very old but threat, but the problem it's still alive!!
I have tried diffent script to archive this (including this one) and debug when and why it's happend.

I have found that the script fails ONLY when this 3 conditions are in the
pot:

Running Firefox browser, on Linux OS and when you have in your CSS files, cross domain URL for images.

The reason, HTTP_access_control... But must have to do something with Linux also.. because even if you try with
Access-Control-Allow- in the code, it's fails.

My actual solution to this (not elegant but at least avoid the problem) is to load the script based on the following condition:

<?PHP
    $ua = $_SERVER["HTTP_USER_AGENT"];
    $firefox = strpos( $ua, 'Firefox') ? true : false ;
    $ubuntu = strpos( $ua, 'Ubuntu') ? true : false ;
    if ( !$firefox && !$ubuntu )echo '<script type="text/javascript" src="js/preloadcssimg.js"></script>';
?>
与酒说心事 2024-09-19 21:32:24

可能是因为您在本地使用,FF访问本地CSS文件存在安全问题。尝试将项目上传到 Web 服务器或启动本地 apache,看看问题是否仍然存在。

It's probably because you are using it locally, FF has a security issue accessing local CSS files. Try uploading the project to a web server or fire up a local apache and see if the problem remains.

红衣飘飘貌似仙 2024-09-19 21:32:24

我猜人们是说图片是使用问题中提到的预加载插件为他们预加载的。

如果有人想提供额外的建议或更简单的预加载脚本,我会洗耳恭听。否则,我会将这个答案作为正确的答案......

为了正确起见,这是我正在谈论的插件:

jQuery.preloadCssImages = function(){
var allImgs = [];//new array for all the image urls 
var k = 0; //iterator for adding images
var sheets = document.styleSheets;//array of stylesheets

for(var i = 0; i<sheets .length; i++){//loop through each stylesheet
        var cssPile = '';//create large string of all css rules in sheet
        var csshref = (sheets[i].href) ? sheets[i].href : 'window.location.href';
        var baseURLarr = csshref.split('/');//split href at / to make array
        baseURLarr.pop();//remove file path from baseURL array
        var baseURL = baseURLarr.join('/');//create base url for the images in this sheet (css file's dir)
        if(baseURL!="") baseURL+='/'; //tack on a / if needed
        if(document.styleSheets[i].cssRules){//w3
                var thisSheetRules = document.styleSheets[i].cssRules; //w3
                for(var j = 0; j<thisSheetRules.length; j++){
                        cssPile+= thisSheetRules[j].cssText;
                }
        }
        else {
                cssPile+= document.styleSheets[i].cssText;
        }

        //parse cssPile for image urls and load them into the DOM
        var imgUrls = cssPile.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);//reg ex to get a string of between a "(" and a ".filename"
        if(imgUrls != null && imgUrls.length>0 && imgUrls != ''){//loop array
                var arr = jQuery.makeArray(imgUrls);//create array from regex obj       
                jQuery(arr).each(function(){
                        allImgs[k] = new Image(); //new img obj
                        allImgs[k].src = (this[0] == '/' || this.match('http://')) ? this : baseURL + this;     //set src either absolute or rel to css dir
                        k++;
                });
        }
}//loop
return allImgs;
}

并这样称呼它:

$(document).ready(function() {

$.preloadCssImages();
});

谢谢!
阿米特

I guess people are saying the pictures are preloading for them using the preloading plugin mentioned in the question.

If someone wants to offer additional advice or a simpler preloading script, I'm all ears. Otherwise, I'll make this answer as the correct one...

And just for correctness, here's the plugin that I'm talking about:

jQuery.preloadCssImages = function(){
var allImgs = [];//new array for all the image urls 
var k = 0; //iterator for adding images
var sheets = document.styleSheets;//array of stylesheets

for(var i = 0; i<sheets .length; i++){//loop through each stylesheet
        var cssPile = '';//create large string of all css rules in sheet
        var csshref = (sheets[i].href) ? sheets[i].href : 'window.location.href';
        var baseURLarr = csshref.split('/');//split href at / to make array
        baseURLarr.pop();//remove file path from baseURL array
        var baseURL = baseURLarr.join('/');//create base url for the images in this sheet (css file's dir)
        if(baseURL!="") baseURL+='/'; //tack on a / if needed
        if(document.styleSheets[i].cssRules){//w3
                var thisSheetRules = document.styleSheets[i].cssRules; //w3
                for(var j = 0; j<thisSheetRules.length; j++){
                        cssPile+= thisSheetRules[j].cssText;
                }
        }
        else {
                cssPile+= document.styleSheets[i].cssText;
        }

        //parse cssPile for image urls and load them into the DOM
        var imgUrls = cssPile.match(/[^\(]+\.(gif|jpg|jpeg|png)/g);//reg ex to get a string of between a "(" and a ".filename"
        if(imgUrls != null && imgUrls.length>0 && imgUrls != ''){//loop array
                var arr = jQuery.makeArray(imgUrls);//create array from regex obj       
                jQuery(arr).each(function(){
                        allImgs[k] = new Image(); //new img obj
                        allImgs[k].src = (this[0] == '/' || this.match('http://')) ? this : baseURL + this;     //set src either absolute or rel to css dir
                        k++;
                });
        }
}//loop
return allImgs;
}

And calling it like this:

$(document).ready(function() {

$.preloadCssImages();
});

Thanks!
Amit

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文