以下に示すように、非常に単純な関数があります。これは、ユーザーがやりたいことを確認した後、ユーザーの伝票を削除します (カスタム に注意してくださいconfirm
)。確認時のコールバック関数内でid
、最初は正しく設定されますが、その後は更新されません。
Iが関数console.log
内にある場合は、常に正しいです。コールバック内にある場合は、常に最初に送信します。JavaScriptをデバッグすると同じことがわかります。値は最初は正しいですが、その後は更新されません。deleteSlip
id
console.log
id
で更新されたときにコールバック関数内の値を更新するには、どうすればよい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
私がunbind
きちんとしていない何か?