2

以下に示すように、非常に単純な関数があります。これは、ユーザーがやりたいことを確認した後、ユーザーの伝票を削除します (カスタム に注意してくださいconfirm)。確認時のコールバック関数内でid、最初は正しく設定されますが、その後は更新されません。

Iが関数console.log内にある場合は、常に正しいです。コールバック内にある場合は、常に最初に送信します。JavaScriptをデバッグすると同じことがわかります。値は最初は正しいですが、その後は更新されません。deleteSlipidconsole.logid

で更新されたときにコールバック関数内の値を更新するには、どうすればよい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ボタンのonclickHTML 属性です。そのようです:

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きちんとしていない何か?

4

2 に答える 2

1

ここにスコープの問題があります。idは、コールバックではなく、 deleteSlip()で定義されます。そのため、id をパラメーターとしてコールバックに渡す必要があります。

組み込みの jquery では、これは、コールバック関数がconfirm()に渡される直前にパラメーターを追加することによって行われます。ただし、どのように行う必要があるかはわかりません。

あなたの場合、私は次のようにします:

function deleteSlip(id){
  //  id is correct right here
  confirm('This will delete your slip.  Are you sure you want to do this?', id, function(cb_id, confirmed){
      //  id here is always the first value from deleteSlip, and never changes
      if (confirmed)
      {
        // do stuff 
      }
  });
}

と:

window._originalConfirm = window.confirm;
window.confirm = function(text, id, 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(id, true); delete cb;}
    function deny() { cb(id, 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);
  }
}

免責事項: コードを実行していないため、エラーが発生する可能性があります。しかし、その考えは健全でなければなりません。

于 2013-02-27T16:52:20.790 に答える
-1

IDをコールバック関数に明示的に渡す必要があります。

    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){
            var newId = id;
            alert(newId);
            //  id here is always the first value from deleteSlip, and never changes
            if (confirmed)
            {
              // do stuff 
            }
        }); }
于 2013-02-27T16:45:42.053 に答える