jQuery show/hide不起作用

10
我在使用jQuery的hide()show()函数时遇到了奇怪的问题。
我正在开发一个网站,它可以在这里找到。
在页面上,您会看到Featured Products下面有一个名为Hydrate的产品。该产品有一些口味选项,因此我想当用户单击“添加到购物车”按钮时,它会显示一个默认隐藏的层。请参见此处的两个屏幕截图:

enter image description hereenter image description here

然而,当我点击“添加到购物车”按钮时,该层并未出现。下面是Firebug截图,显示我点击“添加到购物车”按钮后元素的样式。 enter image description here 请注意,元素样式为“display:block”,符合jQuery规范,然后应该覆盖“display:none”的CSS元素样式。我已经做了这个操作数百次,如果不是更多,这是第一次它没有起作用。现在看看下面的Firebug截图。如果我在调试控制台中单击显示:none旁边的红色斜杠圆圈,则该层将按预期显示。 enter image description here 以下是我认为相关代码片段,但我无法看到问题所在。
CSS代码:
.carouselProduct {float:left; border:2px solid #e9e9e9; width:223px; min-height:242px; margin:18px 2px 0 2px; position:relative; overflow:hidden;}
.productOptions{
    position:absolute;
    bottom:0px;
    left:0px;
    width:211px;
    background: url('../images/black_background_75.png');
    z-index:99999;
    padding: 6px;
    height:170px;
    display:none;
}

JS代码:

$(document).ready(function(){
    $.noConflict();
    jQuery('.add_to_cart_btn').live('click',function(e){
        e.preventDefault();
        $(this).getForm().sendRequest( 'shop:on_addToCart', {update: {'mini_cart': 'mini:cart'} });
    });
    jQuery('.choose_options').live('click',function(e){
        e.preventDefault();
        jQuery('#options_'+jQuery(this).attr('rel')).show();
    });
});

注意:我认为可能有某种方式在干扰,因此我实施了noConflict,但没有任何区别。还要注意的是,在Firebug中我没有收到任何JS错误。
HTML代码:
<article class="carouselProduct"> 
    <!--productContent starts here-->
    <article class="productContent">
        <a href="/shop/product/intensity-hydrate"><img class='productImage' src="/uploaded/thumbnails/db_file_img_33_autox126.png" style="margin: 3px;"></a>
        <hgroup>
            <h4>Hydrate</h4>
           <h3>$25.00</h3>
            <h3 class="orange">$15.00</h3>
        </hgroup>
        <strong>Key Benefits:</strong>
        <ul>
            <li>Proper electrolyte balance</li>
            <li>Reduce muscle fatigue & cramping</li>
        </ul>
        </article>
        <!--productContent ends here--> 
        <!--productOptions layer starts here -->
        <div class="productOptions" id="options_1">
            <div class='selectbox1'>
                <label>Flavor</label>
                <select class='my-dropdown' name='product_options[4448804864d703e8b696c3fa7713aa23]'>
                    <option value='Fruit Punch'>Fruit Punch</option>
                    <option value='Orange'>Orange</option>
                </select>
            </div><br>
            <article class="product_btn">
                <a class="yellow_btn" rel="1" title="Add To Cart" href="#" onclick="return $(this).getForm().sendRequest( 'shop:on_addToCart', {update: {'mini_cart': 'mini:cart'},onSuccess: function(){ close_layer(1) } })">Add To Cart</a>
                <a class="gray_btn" title="View More" href="#" onclick="close_layer(1)">Cancel</a>
            </article>
        </div>
        <!--productOptions layer ends here -->
        <!--product_btn starts here-->
        <article class="product_btn">
            <a class="yellow_btn choose_options" title="Add To Cart" href="#" rel="1">Add To Cart</a>
            <a class="gray_btn" title="View More" href="/shop/product/intensity-hydrate">View More</a>
        </article>
    <!--product_btn ends here--> 
</article>

请注意,有两个“添加到购物车”按钮。 仅此处代码中的最后一个按钮(最初显示的按钮)具有“choose_options”类。 此外,在覆盖层内部的取消按钮上,我调用了一个名为close_layer的函数,该函数传递了id,然后运行jQuery hide()函数,但这也不起作用。
我已经尝试了我能想到的一切。 我已禁用其他JS和CSS,但仍然不起作用。 我已记录了所有内容并添加了警报。 它确实运行该函数,因为它将元素显示样式添加到隐藏的div中,但某些东西不允许它覆盖CSS文件。
非常感谢您的帮助。

你在其他浏览器中是否遇到类似的结果,比如Chrome? - Anthony Forloney
style="display:block" 添加在哪里了?由于您提到已禁用 JS 但仍未生效,很可能是在服务器端设置的。需要将其删除以允许 CSS 正常工作。 - Ianthe the Duke of Nukem
Anthony - 是的,我尝试了所有的浏览器都出现了同样的问题。包括 Chrome、Safari 和 Firefox。 - Andrew Christensen
Lanthe - 点击“添加到购物车”按钮后,jQuery会动态地添加"display:block"。 - Andrew Christensen
4个回答

11

您的页面中有多个div具有相同的ID“ options_1”。 因此,您的代码只更改其中一个。 如果您确实想显示它们所有,则可以按如下方式执行:

jQuery('div[id=options_'+jQuery(this).attr('rel')+']').show();

这个大部分都有效!实际上,剩下的问题可能与此无关。但奇怪的是,我查看我的源代码并进行搜索,只发现每个产品列表“options_1”仅出现一次。但是,您提供的代码解决了这个问题,所以谢谢!现在唯一的问题是,当我点击层内的下拉菜单时,滑块会变得混乱。我将尝试自己解决这个问题。 - Andrew Christensen
我没有检查你的源代码。但如果你使用jQuery('div[id=options_1]')搜索你的页面,你可能会发现三个DIV:所以你最好检查一下为什么会有三个。 - AnthonyY

3
我感觉问题是由于“特定性”引起的。
与 .productoptions 相比,element.style 的特定性更高,因为该属性是 style 属性的一部分。
即使你将 class 应用于元素,element.style 仍然会被优先考虑。
更好的选择是从你的 HTML 中删除 style 属性。
在一个类中添加 display:block。
.block
{
    display : block;
}

<div id="options_1" style="display:block">

现在应该看起来像:
<div id="options_1" class="block">

现在使用 .addClass().removeClass() 来指定您的逻辑。

1
实际上这与你想的恰好相反。当我点击“添加到购物车”按钮时,jQuery会动态地添加元素样式。display:none在样式表中定义,但当我点击按钮时,它会将style="display:block"附加到元素本身。这让我困惑,因为元素应该覆盖样式表对吧? - Andrew Christensen
我尝试使用addClass和removeClass,但没有任何效果。就好像它不会改变样式,即使它改变了类名。这真的很令人沮丧。 - Andrew Christensen
你从HTML中删除了内联CSS吗? - Sushanth --
原始 HTML 中没有内联 CSS,只有类和 ID。 - Andrew Christensen

1

看起来你的DOM出了问题。也许你漏掉了某个标签或者其他什么东西?

无论如何,我访问了你的页面,当我改变:

jQuery('#options_'+jQuery(this).attr('rel')).show();

jQuery('#options_'+jQuery(this).attr('rel')).show().appendTo(jQuery(this).parent())

一切都很好。


我尝试了这个方法,虽然它确实可以将图层放入其中,但我仍然无法删除该图层。此外,如果我查看Firebug控制台,原始div仍然存在,并设置为display:none,即使它是可见的,因此通过附加它,我们正在复制它。不过还是感谢您提供的想法! - Andrew Christensen
代码不是解决方案。只是指出您的DOM结构似乎有问题。如果您想使用此代码来“修复”问题,可以尝试使用moveTo() - Malk

1
我曾遇到类似的问题,并在调试后发现我在一个地方强制使用了“display: inline-block !important”,这导致它覆盖了我的hide()。你能否检查CSS中是否有任何使用!important的相关内容?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接