显示/隐藏滑块开关适用于任意数量的ID

4
我看了w3schools上的一个jQuery滑动切换教程,并想为自己做一个。然而,我的要求有些不同。我不想严格定义每个CSS样式jQuery函数
例如,在w3school的实现中,他们使用了:
$(document).ready(function(){
    $("#flip").click(function(){
        $("#panel").slideToggle("slow");
    });
});

但我想要做到这样的效果:
function toggleX(fid,pid){

var flipvar = document.getElementbyId(fid);
var panelvar = document.getElementbyId(pid);

$(document).ready(function(){
    $(flipvar).click(function(){
        $(panelvar).slideToggle("slow");
    });
});

}

我的要求是,我应该能够通过简单地做这个来在HTML中实现这种效果:

<div id="flip" onclick="toggleX('flip','panel');">...</div>
<div id="panel">...</div>
<!-- Similarly for any number of DIVs in same pattern -->
<div id="flip1" onclick="toggleX('flip1','panel1');">...</div>
<div id="panel1">...</div>

如果让你更容易看到事物本身,下面是代码片段,请查看并提出改进建议。

function toggleX(fid,pid){
  fid.style.background="#fff";//This is for testing purpose but the color never changes :/
}
//IF I could make that^ function work, I am planning to use the function below by using the id-values I get from onclick event

$(document).ready(function(){
    $("#flip").click(function(){
        $("#panel").slideToggle("slow");
    });
});
#panel, #flip {
    padding: 5px;
    text-align: center;
    background-color: #e5eecc;
    border: solid 1px #c3c3c3;
}

#panel {
    padding: 50px;
    display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<div id="flip" onclick="toggleX('flip','panel');">Only this one works right now(Click me)</div>
<div id="panel">This slider is working only for THIS div and this slider is getting its style from 'panel' and 'flip' CSS. Can I get those CSS attributes by ID?<br/>(for flip1,panel1,flip2,panel2...and so on?)</div>

<div id="flip2" onclick="toggleX('flip2','panel2');">I want to make this DIV slidable show/hide too!</div>
<div id="panel2">And I want to get CSS style from ID too! :/</div>

<!--
I want this to happen for any number of ids that I make and pass with toggleX function.
-->

让我再次分解这个问题...

我的要求:

  • 为很多div添加滑块开关
  • 每一个div 相互独立,但是都使用同一个中央函数,并从相同的CSS中获取样式

我不想要:

  • Class-based answer because I did read this related answer but that did not answer my question. Neither was it quite what I was looking for. I would prefer an ID-based answer.

    • ...and I must have messed it up because I could not get it to work, as you can see in the snippet below, it works!(although not as desired) in SO, but it refuses to work in jsfiddle which worries me about specific dependencies. Will this not work with specific settings or platforms?
      $('.toggler').click(function(evt) {
        var $toggler = $(this);
        var $container = $toggler.siblings('.container');
      
        $container.toggle();
        $toggler.text($container.is(':visible') ? "Hide" : "Show");
        evt.preventDefault();
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
      <div class="toggleset">
        <a class="toggler" href="#">Hide</a>
        <div class="container">
          Data to show/hide
        </div>
        <br/>
        <a class="toggler" href="#">Hide</a>
        <div class="container">
          Data to show/hide
        </div>
      </div>
  • multiple CSS for each div because I dont know how many DIVs I'll be using for a slider in the future (okay maybe 10 at most but I want clean CSS dammit)

  • multiple functions for multiple IDs because I'm going to put the jQuery function in my template and then use the div wherever required in my posts and pages, as I mentioned earlier:
像这样(这是我的理想解决方案):
<div id="flip" onclick="toggleX('flip','panel');">...</div>
<div id="panel">...</div>
<!-- Similarly for any number of DIVs in same pattern -->
<div id="flip1" onclick="toggleX('flip1','panel1');">...</div>
<div id="panel1">...</div>

什么样的解决方案?

  • 有创意的答案也是可以考虑的,即使它们不符合我上述的规格。如果你能做到优雅地解决,那就做吧!我之所以指出ID,是因为我认为通过ID来解决会更有效。
  • 最佳实践:正如你所看到的,我是一个新手。如果你知道一些更好的方法来制作这样的切换滑块,我将非常感激!
  • 相互协作:如果你一直在尝试解决这个问题,但也卡在某个地方,请随时提供答案。与此同时,我也会尽力自己解决。

太多的ID了!尝试使每个小部件的结构相同,并在小部件内部相对定位元素,并找出为什么基于类的解决方案没有起作用(这是正确的方法!) - James
那个例子完全不同,@James。我只是想展示那一部分对我来说没有起作用。无论如何,我还是要感谢你,因为你的代码片段帮助我更好地理解了类实现(这在我的代码中也是本来就有的)。 - Siddhant Rimal
没有什么区别。您可以使用完全相同的技术来处理这段新代码。 - James
4个回答

4
你可以通过使用“属性开始选择器”和“next()”函数来实现它,具体请参考attribute starts with selectornext()函数的文档。
 $("div[id^=flip]").click(function() {
   $(this).next("div[id^=panel]").stop().slideToggle("slow");
 });

演示

我已经按照您上面的要求回答了问题。但是,在这种情况下使用普通类是正确的选择。因为具有id的元素将为具名访问创建不必要的全局引用。

 $("div.flipClass").click(function() {
   $(this).next("div.panelClass").stop().slideToggle("slow");
 });

DEMO


1
这个已经满足了所有的要求,而且很整洁,我喜欢不同的jQuery选择器的正确使用,做得好。 - Islam Al-Rayan
1
太好了!正是我想要的。你能用如此简短的代码完成它,让我印象深刻。+1并标记^_^ - Siddhant Rimal

1

这就是我认为你想要的全部内容。

[id^=panel],
[id^=flip] {
  padding: 5px;
  text-align: center;
  background-color: #e5eecc;
  border: solid 1px #c3c3c3;
}

[id^=panel] {
  padding: 50px;
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
<script>
  function toggleX(pid) {
    $("#" + pid).slideToggle("slow");
  }
</script>
<div id="flip1" onclick="toggleX('panel1');">Only this one works right now(Click me)</div>
<div id="panel1">This slider is working only for THIS div and this slider is getting its style from 'panel' and 'flip' CSS. Can I get those CSS attributes by ID?
  <br/>(for flip1,panel1,flip2,panel2...and so on?)</div>
<div id="flip2" onclick="toggleX('panel2');">I want to make this DIV slidable show/hide too!</div>
<div id="panel2">And I want to get CSS style from ID too! :/</div>


我给这个+1,因为采用了CSS的方法。就像其他答案一样,这对学习很有帮助 :) - Siddhant Rimal

0
//Solution for id
function toggleX(fid,pid){
$('#'+pid).slideToggle("slow");
}

//I would do it like this  
<div class="wrapper">
    <div class="flip">...</div>
    <div class="panel">...</div>
</div>
<div class="wrapper">
    <div class="flip">...</div>
    <div class="panel">...</div>
</div>

<script>
$(document).ready(function() {
    $('.flip').click(function() {
        $('.panel', $(this).closest('.wrapper')).slideToggle('slow');
    });
});
</script>

为什么它被踩了?(请在您踩的时候留下评论) - Arjun J Gowda
对不起,我不知道。我没有给这个打负分。无论如何,感谢你的回答。它帮助我理解了一些东西(之前我也尝试过使用'#'+方法,现在我知道那种方式怎么用了)。我会点赞的(因为这对于学习者是有帮助的)。 - Siddhant Rimal

0

转换我的评论。

几点观察:

  • 不要在另一个函数内使用document.ready。
  • 如果混合使用$("#id")document.getElementbyId("id")会很令人困惑。
  • W3Schools不是一个好的资源 - 使用MDN或其他教程。

在我看来,您可以使用类并使用.next()来获取您想要翻转的div。

$(function() {
  $(".flip").on("click", function() {
    $(this).next(".panel").slideToggle();
  });
});
.panel { display:none }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="flip">Show panel1</div>
<div class="panel">Panel 1</div>
<div class="flip">Show panel2</div>
<div class="panel">Panel 2</div>
<div class="flip">Show panel3</div>
<div class="panel">Panel 3</div>
<div class="flip">Show panel4</div>
<div class="panel">Panel 4</div>


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