简体   繁体   English

为什么三元运算符不能与“ hasClass”一起使用?

[英]Why Ternary Operator doesn't work with using 'hasClass'?

I'm making my own slide plugin using jQuery for practice. 我正在使用jQuery制作自己的幻灯片插件进行练习。 The problem is, I don't know why but some reason ternary operator doesn't work. 问题是,我不知道为什么,但是由于某种原因,三元运算符不起作用。 The slider only responses when user clicks prev button which registered as a condition from the code. 滑块仅响应时用户点击prev其登记为从代码的条件按钮。

I expected it should move to right side when user presses next button, but next button is totally broken. 我希望当用户按下next按钮时它应该移到右侧,但是next按钮完全坏了。

I could just make 2 different trigger buttons and use multiple if statements for solving this problem, but I want to merge it on single line by using ternary operator and minifise my code as much as I can. 我可以只使用2个不同的触发器按钮,并使用多个if语句来解决此问题,但是我想通过使用三元运算符将其合并在一行上,并尽可能地减少我的代码。

How would I solve this problem? 我该如何解决这个问题?

Code block: 代码块:

 (function($) { $.fn.sliderModule = function(options) { const defaults = { myGallery: $(this) }; var settings = $.extend({ myItems: null, trigger: null, current: null }, defaults, options); $(settings.trigger).on('click', function() { if (!(defaults.myGallery.is(':animated'))) { var movement = settings.trigger.hasClass('prev') ? -1 : 1 defaults.myGallery.animate({left: "+=" + (100 / settings.current) * movement + '%'}); // It doesn't respond the `next` button. }; }); }; })(jQuery); $(function() { $('#slide-list').sliderModule({ myItems: '#img-slider', trigger: $('#buttons').find('#button'), current: 4 }); }) 
 li { list-style-type: none; } #slide-container { position: relative !important; width: 1170px; margin: 0 auto; overflow: hidden; height: auto; } #slide-list { margin: 0 auto; position: relative; display: flex; width: 1170px; } #buttons { width: 1170px; margin: 0 auto; display: flex; justify-content: center; } #buttons li { margin: 0 20px; } .slide-l-quarter { flex-shrink: 0; position: relative; white-space: nowrap; width: calc(100% / 4); } .slide-l-quarter img { width: 100%; height: auto; } 
 <div id="slide-container"> <ul id="slide-list"> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/PVsHlX9.jpg" alt=""> </li> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/WfWhNnU.jpg" alt=""> </li> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/eqHdnNs.jpg" alt=""> </li> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/0jziABY.jpg" alt=""> </li> </ul> </div> <ul id="buttons"> <li id="button" class="prev">Prev</li> <li id="button" class="next">Next</li> </ul> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 

There is no problem with using ternary operators. 使用三元运算符没有问题。 But you made some mistakes along the way. 但是您在此过程中犯了一些错误。

IDs must be unique ID必须是唯一的

You cannot have this in your HTML: 您的HTML中不能包含以下内容:

<li id="button" class="prev">Prev</li>
<li id="button" class="next">Next</li>

If you need multiple elements to have the same selector, use a class instead: 如果您需要多个元素具有相同的选择器,请改用一个类:

<li class="button prev">Prev</li>
<li class="button next">Next</li>

settings.trigger selects both buttons settings.trigger选择两个按钮

When you do this: 执行此操作时:

settings.trigger.hasClass('prev')

You're refering to both buttons. 您指的是两个按钮。 You only want the one clicked by the user: 您只希望用户单击一个:

$(this).hasClass('prev')

Fixed version 固定版

 (function($) { $.fn.sliderModule = function(options) { const defaults = { myGallery: $(this) }; var settings = $.extend({ myItems: null, trigger: null, current: null }, defaults, options); $(settings.trigger).on('click', function() { if (!(defaults.myGallery.is(':animated'))) { var movement = $(this).hasClass('prev') ? -1 : 1; defaults.myGallery.animate({left: "+=" + (100 / settings.current) * movement + '%'}); }; }); }; })(jQuery); $(function() { $('#slide-list').sliderModule({ myItems: '#img-slider', trigger: $('#buttons').find('.button'), current: 4 }); }) 
 li { list-style-type: none; } #slide-container { position: relative !important; width: 1170px; margin: 0 auto; overflow: hidden; height: auto; } #slide-list { margin: 0 auto; position: relative; display: flex; width: 1170px; } #buttons { width: 1170px; margin: 0 auto; display: flex; justify-content: center; } #buttons li { margin: 0 20px; } .slide-l-quarter { flex-shrink: 0; position: relative; white-space: nowrap; width: calc(100% / 4); } .slide-l-quarter img { width: 100%; height: auto; } 
 <div id="slide-container"> <ul id="slide-list"> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/PVsHlX9.jpg" alt=""> </li> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/WfWhNnU.jpg" alt=""> </li> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/eqHdnNs.jpg" alt=""> </li> <li class="slide-l-quarter" id="image-slider"> <img src="https://i.imgur.com/0jziABY.jpg" alt=""> </li> </ul> </div> <ul id="buttons"> <li class="button prev">Prev</li> <li class="button next">Next</li> </ul> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM