#javascript #html #jquery #angularjs
#javascript #HTML #jquery #angularjs
Вопрос:
У меня простая вкладка с несколькими формами. Он работает нормально, и когда я нажимаю кнопку далее внутри каждого набора полей, он переходит к следующему набору полей. Это отлично работает, но я создал новую кнопку «Отправить ответ» внутри первого набора полей, которая будет вызывать функцию Angularjs, и после завершения отправки ответа внутри блока успеха я пытаюсь использовать ту же логику следующей кнопки, которая переходит к следующему набору полей. Это не работает внутри блока успеха отправки ответа. Есть ли что-то, чего мне не хватает? Внешняя кнопка next в первом наборе полей отлично работает.
<!-- fieldsets -->
<fieldset>
<div class="row">
<div class="col-md-12">
<div class="form-group text-center">
<strong>Test</strong>
</div>
</div>
<div class="col-md-12">
<div class="form-group text-center">
<input type="text" class="form-control" id="txt-Answer" name="txt-Answer" maxlength="100" ng-model="testAnswer" style="width:120%;" />
</div>
</div>
<br />
<div class="row">
<div class="col-md-12 text-center">
<input type="button" name="btnSubmitAnswer" class="next action-button" value="Submit Answer" ng-click="submitAnswer(userInfo.UserSecurityQuestion[0].SecurityQuestionId);" />
</div>
</div>
</div>
<input type="button" name="next" class="next action-button" value="Next" />
</fieldset>
<fieldset>
<h2 class="fs-title">Test</h2>
<h3 class="fs-subtitle">Test</h3>
@*<input type="text" name="twitter" placeholder="Twitter" />
<input type="text" name="facebook" placeholder="Facebook" />
<input type="text" name="gplus" placeholder="Google Plus" />*@
@*<input type="button" name="previous" class="previous action-button" value="Previous" />
<input type="button" name="next" class="next action-button" value="Next" />*@
<input type="submit" name="submit" class="submit action-button" value="Submit" />
</fieldset>
@*<fieldset>
<h2 class="fs-title">Test</h2>
<h3 class="fs-subtitle">We will never sell it</h3>
<input type="text" name="fname" placeholder="First Name" />
<input type="text" name="lname" placeholder="Last Name" />
<input type="text" name="phone" placeholder="Phone" />
<textarea name="address" placeholder="Address"></textarea>
<input type="button" name="previous" class="previous action-button" value="Previous" />
<input type="submit" name="submit" class="submit action-button" value="Submit" />
</fieldset>*@
Следующее нажатие кнопки — это работает
$(".next").click(function () {
if (animating) return false;
animating = true;
current_fs = $(this).parent();
next_fs = $(this).parent().next();
//activate next step on progressbar using the index of next_fs
$("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");
//show the next fieldset
next_fs.show();
//hide the current fieldset with style
current_fs.animate({ opacity: 0 }, {
step: function (now, mx) {
//as the opacity of current_fs reduces to 0 - stored in "now"
//1. scale current_fs down to 80%
scale = 1 - (1 - now) * 0.2;
//2. bring next_fs from the right(50%)
left = (now * 50) "%";
//3. increase opacity of next_fs to 1 as it moves in
opacity = 1 - now;
current_fs.css({
'transform': 'scale(' scale ')',
'position': 'absolute'
});
next_fs.css({ 'left': left, 'opacity': opacity });
},
duration: 800,
complete: function () {
current_fs.hide();
animating = false;
},
//this comes from the custom easing plugin
easing: 'easeInOutBack'
});
});
Нажатие кнопки отправки ответа — это не работает (не переходит к шагу 2 (набор полей)
$scope.submitAnswer = function ()
{
$http({
method: 'POST',
url: window.location.protocol '//' window.location.host '/Home/SubmitAnswer'
}).then(
function (response) {
//Response Message
if (response.data.isMatchedResult)
{
nextFieldSet();
}
}
);
}
}
function nextFieldSet()
{
if (animating) return false;
animating = true;
current_fs = $(this).parent();
next_fs = $(this).parent().next();
//activate next step on progressbar using the index of next_fs
$("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");
//show the next fieldset
next_fs.show();
//hide the current fieldset with style
current_fs.animate({ opacity: 0 }, {
step: function (now, mx) {
//as the opacity of current_fs reduces to 0 - stored in "now"
//1. scale current_fs down to 80%
scale = 1 - (1 - now) * 0.2;
//2. bring next_fs from the right(50%)
left = (now * 50) "%";
//3. increase opacity of next_fs to 1 as it moves in
opacity = 1 - now;
current_fs.css({
'transform': 'scale(' scale ')',
'position': 'absolute'
});
next_fs.css({ 'left': left, 'opacity': opacity });
},
duration: 800,
complete: function () {
current_fs.hide();
animating = false;
},
//this comes from the custom easing plugin
easing: 'easeInOutBack'
});
}
Комментарии:
1. можете ли вы использовать этот рабочий фрагмент?
2. Это как-то связано с Parent.Next()
Ответ №1:
Вы используете this
внутри своей функции nextFieldSet
, которая не ссылается ни на один элемент. Вот почему внутри вашей функции ничего не работает. Вместо этого вы можете использовать progressbar
, чтобы получить индекс li
, у которого есть класс active
, так как при нажатии на .next
кнопку вы добавляете к нему активный класс.
Затем используйте это index
, чтобы получить fieldset
то, что находится в этой позиции, используя $("fieldset:eq(" next_fs ")")
это, вы получите ссылку на набор полей, который вам нужно скрыть.То же самое вы можете сделать для другого fieldset
, который вам нужно показать следующим.
Демонстрационный код (в приведенном ниже коде вместо angularjs я просто использую событие click и вызываю nextFieldSet оттуда) :
$("fieldset:first").fadeIn(); //show first fieldset
var animating;
$(".next").click(function() {
if (animating) return false;
animating = true;
current_fs = $(this).parent();
next_fs = $(this).parent().next();
//remove current active
$("#progressbar li").eq($("fieldset").index(current_fs)).removeClass("active")
$("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");
next_fs.show();
//hide the current fieldset with style
current_fs.animate({
opacity: 0
}, {
step: function(now, mx) {
scale = 1 - (1 - now) * 0.2;
left = (now * 50) "%";
opacity = 1 - now;
current_fs.css({
'transform': 'scale(' scale ')',
'position': 'absolute'
});
next_fs.css({
'left': left,
'opacity': opacity
});
},
duration: 800,
complete: function() {
current_fs.hide();
animating = false;
},
//this comes from the custom easing plugin
easing: 'easeInOutBack'
});
});
//suppose submit button is click
$(".action-button").click(function() {
//call function
nextFieldSet()
})
function nextFieldSet() {
if (animating) return false;
animating = true;
//get active li index
current_fs = $("#progressbar li.active").index();
//for next div add 1
next_fs = $("#progressbar li.active").index() 1;
$("#progressbar li").eq(current_fs).removeClass("active") //remove current active
//activate next step on progressbar using the index of next_fs
$("#progressbar li").eq(next_fs).addClass("active");
var next_divs = $("fieldset:eq(" next_fs ")") //find the fieldset eq
var current_div = $("fieldset:eq(" current_fs ")")
//show the next fieldset
next_divs.show();
//hide the current fieldset with style
current_div.animate({
opacity: 0
}, {
step: function(now, mx) {
scale = 1 - (1 - now) * 0.2;
left = (now * 50) "%";
opacity = 1 - now;
current_div.css({
'transform': 'scale(' scale ')',
'position': 'absolute'
});
next_divs.css({
'left': left,
'opacity': opacity
});
},
duration: 800,
complete: function() {
current_div.hide();
animating = false;
},
easing: 'easeInOutBack'
});
}
fieldset {
display: none;
}
.active {
color: red;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.3/jquery.easing.min.js?ver=5.3.2'></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<ul id="progressbar">
<li class="active"><strong>1</strong></li>
<li><strong>2</strong></li>
<li><strong>3</strong></li>
</ul>
<div class="fields">
<fieldset>
<div class="row">
<div class="col-md-12">
<div class="form-group text-center">
<strong>Test</strong>
</div>
</div>
<div class="col-md-12">
<div class="form-group text-center">
<input type="text" class="form-control" id="txt-Answer" name="txt-Answer" maxlength="100" ng-model="testAnswer" style="width:120%;" />
</div>
</div>
<br />
<div class="row">
<div class="col-md-12 text-center">
<input type="button" name="btnSubmitAnswer" class=" action-button" value="Submit Answer" ng-click="submitAnswer(userInfo.UserSecurityQuestion[0].SecurityQuestionId);" />
</div>
</div>
</div>
<input type="button" name="next" class="next action-button" value="Next" />
</fieldset>
<fieldset>
<h2 class="fs-title">Test</h2>
<h3 class="fs-subtitle">Test</h3>
<input type="text" name="twitter" placeholder="Twitter" />
<input type="text" name="facebook" placeholder="Facebook" />
<input type="text" name="gplus" placeholder="Google Plus" />
<input type="button" name="previous" class="previous action-button" value="Previous" />
<input type="button" name="next" class="next action-button" value="Next" />
<input type="submit" name="submit" class="submit action-button" value="Submit" />
</fieldset>
<fieldset>
<h2 class="fs-title">Test</h2>
<h3 class="fs-subtitle">We will never sell it</h3>
<input type="text" name="fname" placeholder="First Name" />
<input type="text" name="lname" placeholder="Last Name" />
<input type="text" name="phone" placeholder="Phone" />
<textarea name="address" placeholder="Address"></textarea>
<input type="button" name="previous" class="previous action-button" value="Previous" />
<input type="submit" name="submit" class="submit action-button" value="Submit" />
</fieldset>
</div>