由于paddingRight和parseInt(),IE8 jQuery无效参数

时间:2012-05-23 14:09:55

标签: jquery internet-explorer cross-browser

问题:

调试我的网站时收到无效参数错误。只有当悬停在一个手风琴菜单项上时才会出现错误。进一步检查后,我发现了可能导致此问题的代码,这是我在下面的问题。 (参见更新#2)。

我不知道具体导致错误的原因,或者如何解决错误.HALPS

突出显示的代码行是: a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now

我无法弄清楚..我讨厌IE8:)


更新#1

我将问题追溯到使用从ThemeForest下载的此管理模板预先构建的可折叠导航。

我发现“Accordian Menu”代码中的内容:

https://gist.github.com/48d7ffcc654ce24040c5

以及用于初始化菜单的这段代码:

/*
 * Accordion Menu
 */
$('.menu').initMenu();

更新#2

进一步检查显示IE8开发工具在本地人

下抛出此内容

Prop "PaddingRight" String

然后我偶然发现了要点中第二个函数的一行:

        $(this).hover(
            function() {
                $(this).animate({
                    paddingLeft:parseInt(padding_left) + parseInt(5) + "px",
                    paddingRight: parseInt(padding_right) - parseInt(5) + "px"
                }, 130);
            },
            function() {
                bc_hover = $(this).css("background-color");
                $(this).animate({
                    paddingLeft: padding_left,
                    paddingRight: padding_right
                }, 130);
            }

更新#3

这是我尝试过的代码的jsfiddle,而在jsfiddle我无法复制问题。 http://jsfiddle.net/7Y68Y/6/

1 个答案:

答案 0 :(得分:4)

当介入CSS时,这种错误很常见。如果给CSS属性一个错误的值,IE会抱怨它。

<强>更新

OP忘记提及padding_left之前已声明为$(this).css('padding-left')

在这种情况下,你应该知道空字符串;例如:

$('<div />').css('padding-left') == ''
parseInt('') == NaN

有了这些知识,让我们改变作业:

var padding_left = $(this).css("padding-left");
var padding_right = $(this).css("padding-right");

将它们变成正确的整数:

var padding_left = parseInt($(this).css('padding-left') || 0);
var padding_right = parseInt($(this).css("padding-right") || 0);

然后让我们回到动画代码:

$(this).animate({
    paddingLeft: parseInt(padding_left) + parseInt(5) + "px",
    paddingRight: parseInt(padding_right) - parseInt(5) + "px"
}, 130);

我们假设原始填充也是px个单位。在这种情况下,我们可以将语句简化为:

$(this).animate({
    paddingLeft: (padding_left + 5) + "px",
    paddingRight: (padding_right - 5) + "px"
}, 130);

另一个:

$(this).animate({
    paddingLeft: padding_left + "px",
    paddingRight: padding_right + "px"
}, 130);