#javascript #jquery #conditional #chaining
#javascript #jquery #условные операторы #цепочка
Вопрос:
У меня есть две похожие функции, как показано ниже;
Для функции последнего элемента;
function last () {
var $this = $(this);
$this.animate({
left:'-1200',
opacity:0
},500, function(){
$this
.addClass('hide')
.next()
.removeClass('hide').animate({
left:'0',
opacity:1
},500)
});
}
Для функции первого элемента;
function first () {
var $this = $(this);
$this.animate({
left:'1200',
opacity:0
},500, function(){
$this
.addClass('hide')
.prev()
.removeClass('hide').animate({
left:'0',
opacity:1
},500)
});
}
они похожи, и я хочу объединить их в одну функцию, как показано ниже;
function steps (pos) { /* -- Dif-1 -- */
var $this = $(this);
$this.animate({
left:pos==='next'amp;amp; '-' '1200', /* -- Dif-2 -- */
opacity:0
},500, function(){
$this
.addClass('hide')
pos==='next' ? next() : prev() /* -- Dif-3 -- */
.removeClass('hide').animate({
left:'0',
opacity:1
},500)
});
}
Я хочу определить функцию next() или prev() в соответствии с переменной pos (pos===’next’ ? next() : prev() ). Как я могу это сделать?
Ответ №1:
Вы сделали отличный снимок. Вот как я мог бы достичь вашей цели:
function steps (pos) { /* -- Dif-1 -- */
var $this = $(this);
$this.animate({
left:(pos==='next'?-1:1) * 1200, /* -- Dif-2 -- */
opacity:0
},500, function(){
var elt = $this.addClass('hide');
var elt2 = (pos==='next' ? elt.next() : elt.prev()); /* -- Dif-3 -- */
elt2.removeClass('hide').animate({
left:'0',
opacity:1
},500);
});
}
Есть другие способы, ofc.
Ответ №2:
Разницу в вашем left
свойстве можно сделать с помощью простого троичного оператора:
left: pos==='next' ? -1200 : 1200
И вы можете продолжить объединение своих методов в цепочки, если вы используете обозначение в скобках для вызова prev()
или next()
:
$this.addClass('hide')
[pos==='next' ? "next" : "prev"]()
.removeClass('hide').animate({
Или, предполагая, что pos
всегда будет или next
или prev
, просто используйте [pos]()
:
function steps (pos) {
var $this = $(this);
$this.animate({
left:pos==='next' ? -1200 : 1200,
opacity:0
},500, function(){
$this
.addClass('hide')[pos]()
.removeClass('hide').animate({
left:'0',
opacity:1
},500)
});
}
Ответ №3:
Попробуйте следующий код.. Включите jquery перед тестированием. Конечно, вы можете оптимизировать этот код. .это просто для того, чтобы показать альтернативный подход..
<html>
<head>
<title>test</title>
<script src="jquery.js"></script>
<script type="text/javascript">
function steps (elem, pos) { /* -- Dif-1 -- */
var $this = $(elem);
var obj = $this.animate({
left: (pos == 'next') ? -1200 : 1200, /* -- Dif-2 -- */
opacity:0
},500, function(){
$this
.addClass('hide');
});
if (pos == 'next')
obj.next();
else
obj.prev();
obj.removeClass('hide').animate({
left:'0',
opacity:1
},500)
}
</script>
</head>
<body>
<div id="test">Test Div</div>
<script type="text/javascript">
$(document).ready(function(){
steps($("#test"), "prev");
});
</script>
</body>
</html>
Комментарии:
1.
next()
иprev()
возвращают элемент, они не обновляютobj
объект напрямую. Я думаю, вы забыли обновитьobj
по назначению.2. да, вы правы .. мы должны обновить переменную obj следующим образом obj = obj.next();