У меня довольно простая функция, как показано ниже. Это приведет к удалению пользователя после подтверждения того, что они хотят сделать (обратите внимание на пользовательский confirm
). Внутри функции обратного вызова при подтверждении, id
устанавливается правильно в первый раз, но после этого он не обновляется.Значение внутри обратного вызова не обновляется при каждом вызове функции
Если я console.log
внутри функции deleteSlip
, id
всегда правилен. Если I console.log
внутри обратного вызова, это всегда первый id
Я отправляю его. Я вижу то же самое, когда отлаживаю javascript. Значение правильное в первый раз, но после этого оно не обновляется.
Что нужно сделать, чтобы получить значение внутри функции обратного вызова для обновления, когда оно обновляется в deleteSlip
?
function deleteSlip(id){
// id is correct right here
confirm('This will delete your slip. Are you sure you want to do this?', function(confirmed){
// id here is always the first value from deleteSlip, and never changes
if (confirmed)
{
// do stuff
}
});
}
confirm
называют это обычай и определяется следующим образом:
window._originalConfirm = window.confirm;
window.confirm = function(text, cb) {
bootStrapConfirm = function() {
if(! $.fn.modal.Constructor)
return false;
if($('#windowConfirmModal').length == 1)
return true;
$('body').append(' \
<div id="windowConfirmModal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> \
<div class="modal-body"> \
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> \
<p> alert text </p> \
</div> \
<div class="modal-footer"> \
<button class="btn btn-danger" data-dismiss="modal" aria-hidden="true">No</button> \
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Yes</button> \
</div> \
</div> \
');
function unbind() {
$("#windowConfirmModal .btn-primary").unbind('click', confirm);
$("#windowConfirmModal .btn-danger").unbind('click', deny);
}
function confirm() { cb(true); delete cb;}
function deny() { cb(false); delete cb;}
$("#windowConfirmModal .btn-primary").bind('click', confirm);
$("#windowConfirmModal .btn-danger").bind('click', deny);
return true;
}
if (bootStrapConfirm()){
$('#windowConfirmModal .modal-body p').text(text);
$('#windowConfirmModal').modal();
} else {
console.log('bootstrap was not found');
window._originalConfirm(text);
}
}
deleteSlip
является атрибутом onclick
HTML на кнопке. Как так:
onclick="deleteSlip(1234)"
Опять же, чтобы подтвердить, то id
внутри deleteSlip
правильно. id
внутри обратного вызова на confirm
- это то, что он получает первым и никогда не меняется. Обратный вызов может быть асинхронным, но я вызываю его только один раз в любой момент времени. deleteSlip
уволен нажатием кнопки.
Я разместил этот вопрос раньше и ему сказали, что это слишком неоднозначно. Пожалуйста, дайте мне знать, что вам нужно, чтобы помочь мне в этом. Область «do stuff» имеет вызов ajax, но перед этим значение не так (поэтому не показывать его для людей, которые не читают весь вопрос).
Обновление: Похоже, что это проблема с обычным confirm
. Изменить пользовательские confirm
быть следующее:
window.confirm = function(text, cb) {
bootStrapConfirm = function() {
if(! $.fn.modal.Constructor)
return false;
if($('#windowConfirmModal').length == 1)
return true;
$('body').append(' \
<div id="windowConfirmModal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> \
<div class="modal-body"> \
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> \
<p> alert text </p> \
</div> \
<div class="modal-footer"> \
<button class="btn btn-danger" data-dismiss="modal" aria-hidden="true">No</button> \
<button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Yes</button> \
</div> \
</div> \
');
return true;
}
if (bootStrapConfirm()){
function confirm() { cb(true); }
function deny() { cb(false); }
$("#windowConfirmModal .btn-primary").unbind('click', confirm);
$("#windowConfirmModal .btn-danger").unbind('click', deny);
$("#windowConfirmModal .btn-primary").bind('click', confirm);
$("#windowConfirmModal .btn-danger").bind('click', deny);
$('#windowConfirmModal .modal-body p').text(text);
$('#windowConfirmModal').modal();
} else {
console.log('bootstrap was not found');
window._originalConfirm(text);
}
}
Теперь, когда confirm
называется, он называет ВСЕ id
«S это когда-либо видел. Что-то я не unbind
правильно?
Почему вы только что удалили этот вопрос и повторно разместили его? –
Мне сказали, что это было слишком неоднозначно. Я обновил вопрос с гораздо большей информацией. – tubaguy50035
Я просто рад, что сделал копию своего комментария, который я не мог опубликовать, поэтому вот оно ... –