【问题标题】:jQuery .animate issues in IE8IE8 中的 jQuery .animate 问题
【发布时间】:2011-05-23 19:35:12
【问题描述】:

我正在尝试使用 jQuery 通过滚动背景显示 iPhone 应用程序的屏幕截图。我编写的代码在 FF & Safari 中完美运行,但 IE 抛出“Invalid argument”错误。

/编辑:我想我会添加 IE 在失败时实际执行的操作。它跳转到第二个屏幕截图并引发错误。其他浏览器动画流畅,但 IE 没有动画,它只是跳转到第二个屏幕截图然后抛出错误。

这是我的代码:

var scrollInterval = 5000; // scroll every 5 seconds

    // set the default position
    var current = 1284;

    var screenScroll = function(){
        var imageSize = 1284;
        var screenshotWidth = 214;
        current -= screenshotWidth;

        if ( current < screenshotWidth) {
            current = imageSize;
        }

        var bgPos = current + "px top";
        $("#screenshotDiv").animate({backgroundPosition:bgPos}, 500);
        
    }

    $(document).ready(function() {
        //Calls the scrolling function repeatedly
        var init = setInterval(screenScroll, scrollInterval);
    });

【问题讨论】:

    标签: javascript jquery internet-explorer jquery-animate


    【解决方案1】:

    我无法仅使用 jQuery 在 IE8 上运行。显然,IE 上的 jQuery 背景位置动画存在一个错误。惊喜,惊喜 IE 在所有其他现代浏览器上都存在问题。

    别担心,我找到了解决办法。在包含 jQuery 后包含此脚本,它将解决问题。我试图找到插件的官方链接,但放弃了找到最新的,所以我只发布文件:

    /**
     * @author Alexander Farkas
     * v. 1.21
     */
    
    (function($) {
        if(!document.defaultView || !document.defaultView.getComputedStyle){ // IE6-IE8
            var oldCurCSS = jQuery.curCSS;
            jQuery.curCSS = function(elem, name, force){
                if(name === 'background-position'){
                    name = 'backgroundPosition';
                }
                if(name !== 'backgroundPosition' || !elem.currentStyle || elem.currentStyle[ name ]){
                    return oldCurCSS.apply(this, arguments);
                }
                var style = elem.style;
                if ( !force && style && style[ name ] ){
                    return style[ name ];
                }
                return oldCurCSS(elem, 'backgroundPositionX', force) +' '+ oldCurCSS(elem, 'backgroundPositionY', force);
            };
        }
    
        var oldAnim = $.fn.animate;
        $.fn.animate = function(prop){
            if('background-position' in prop){
                prop.backgroundPosition = prop['background-position'];
                delete prop['background-position'];
            }
            if('backgroundPosition' in prop){
                prop.backgroundPosition = '('+ prop.backgroundPosition;
            }
            return oldAnim.apply(this, arguments);
        };
    
        function toArray(strg){
            strg = strg.replace(/left|top/g,'0px');
            strg = strg.replace(/right|bottom/g,'100%');
            strg = strg.replace(/([0-9\.]+)(\s|\)|$)/g,"$1px$2");
            var res = strg.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);
            return [parseFloat(res[1],10),res[2],parseFloat(res[3],10),res[4]];
        }
    
        $.fx.step. backgroundPosition = function(fx) {
            if (!fx.bgPosReady) {
                var start = $.curCSS(fx.elem,'backgroundPosition');
    
                if(!start){//FF2 no inline-style fallback
                    start = '0px 0px';
                }
    
                start = toArray(start);
    
                fx.start = [start[0],start[2]];
    
                var end = toArray(fx.options.curAnim.backgroundPosition);
                fx.end = [end[0],end[2]];
    
                fx.unit = [end[1],end[3]];
                fx.bgPosReady = true;
            }
            //return;
            var nowPosX = [];
            nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
            nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];           
            fx.elem.style.backgroundPosition = nowPosX[0]+' '+nowPosX[1];
    
        };
    })(jQuery);
    

    代码现在可以在 IE8 中完美运行。我没有费心在 IE7 中测试,因为我的流量只有 13% 来自 IE,所以我不会费心支持旧版本.... 太头疼了。

    【讨论】:

      【解决方案2】:

      IE 要求第二个参数是 {duration: 500},对吗?还是只是约定俗成?

      实际上,环顾四周,在 IE8 上使用 top:http://reference.sitepoint.com/css/background-positionbackgroundPosition 被破坏了

      也许你可以试试底部?

      【讨论】:

      • 我试过用 0px 代替 top,结果是一样的
      • 以防万一我继续尝试使用底部。它仍然抛出同样的错误。
      【解决方案3】:

      Alexander Farkas 关于脚本的解决方案有效,但首先需要进行一些修复(我需要它才能使其正常工作)。线路:

      var end = toArray(fx.options.curAnim.backgroundPosition);
      

      必须更改

      var end = toArray(fx.end);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 2016-01-18
        相关资源
        最近更新 更多