13

好的,我正在做一堆 RIA/AJAX 的东西,需要创建一个“漂亮”的自定义确认框,它是一个 DIV(不是内置的 javascript 确认)。我无法确定如何在执行中暂停以让用户有机会在恢复或停止执行之前接受或拒绝条件。(取决于他们的回答)

所以这是我正在处理的一般逻辑流程:

  1. 用户从下拉列表中选择一个项目并单击按钮。
  2. 在按钮的客户端javascript事件处理程序中,我需要检查他们在下拉列表中选择的项目的一系列条件(这是关键)。
  3. 这些条件可能会导致根本不显示任何确认,或者可能只有某些条件评估为真,这意味着我需要在继续之前要求用户接受或拒绝该条件。一次只能显示一个确认。

演示逻辑:

function buttonEventHandler() {

if (condition1) {
  if(!showConfirmForCondition1) // want execution to pause while waiting for user response.
     return; // discontinue execution
}

if (condition2) {
  if (!showConfirmForCondition2) // want execution to pause while waiting for user response.

     return; // discontinue execution
}

if (condition3) {
  if (!showConfirmForCondition3) // want execution to pause while waiting for user response.

     return; // discontinue execution
}

...  
}

如果有人以前处理过这个挑战并找到了解决方案,我们将不胜感激。需要注意的是,我还在使用MS AjaxjQuery库,尽管我还没有找到任何可能已经包含在解决这个问题的功能中。

4

6 回答 6

7

恐怕不能以与“确认”和“警报”对话框暂停它相同的方式暂停 Javascript 运行时。要使用 DIV 执行此操作,您将不得不将代码分成多个块,并让自定义确认框上的事件处理程序调用下一段代码。

已经有一些项目将“延续”支持引入 Javascript,例如Narrative Javascript,所以如果你真的热衷于让它在单个代码块中工作,你可以研究一下。

于 2008-12-11T01:12:26.093 回答
7

我如何做到这一点的方式:

  1. 创建您自己的带有按钮的确认对话框,比如“是”和“否”。
  2. 创建触发对话框的函数,比如说confirmBox(text, callback).
  3. 在“是”和“否”按钮上绑定事件 - “是” - callback(true),“否” - callback(false)
  4. 当您调用该函数时,请使用以下语法:

    confirmBox("Are you sure", function(callback){
        if (callback) {
            // do something if user pressed yes
        } 
        else {
            // do something if user pressed no
        }
    });
    
于 2010-08-17T12:35:25.670 回答
1

试试这个,将你的javascript客户端函数传递给'this'对象并启动你的自定义确认对话框,但总是返回false以防止回发触发。但是,在您退出处理功能之前,请将相关信息手动触发回发到您的自定义确认框的“是”按钮。

于 2008-12-11T02:40:46.027 回答
0

就我而言,目标是customConfirm每当用户单击嵌入在 .Net 中继器每一行中的删除链接时显示一个框

每当用户单击任何特定行的删除链接时,都会调用自定义确认函数。现在在confirm函数里面,除了渲染新的盒子,还需要做以下2件事:

// obtain the element(we will call it targetObject) that triggered the event

targetObject = (event.target==undefined ? event.srcElement : event.target);

// include a call to _doPostBack in the onclick event of OK/YES button ONLY

(targetObject.href!=undefined){ eval(targetObject.href); } else{ _doPostBack(targetObject.name,''); // it is assumed that name is available

上面的 if/else 结构与我的情况有关。主要是知道您可以使用事件对象和__doPostBack函数来模拟确认暂停和连续性。

于 2009-01-23T17:30:11.667 回答
0

就像保罗说的......这对我有用(我猜你使用 ASP.NET,但如果不是你可以轻松地重写它):

function BeforeDelete(controlUniqueId) {
    confirmPopup('question...?', function() { __doPostBack(controlUniqueId, ''); });
    return false;
}

function confirmPopup(message, okCallback) {
    $('#popup-buttons-confirm').click(okCallback);
    // set message
    // show popup
}
于 2009-07-16T12:06:10.713 回答
0

使用 JqueryUI modal查看我的 Fiddle 模式警报框:http: //jsfiddle.net/katiabaer/UXM9y/33/

   showAlert = function (msg, header, callback) {
      var mydiv = $("<div id='mydiv'> </div>");
      mydiv.alertBox({
          message: msg,
          header: header,
          callback: callback
      });

  },

  $('#show').click(function () {
      var m = $('#message').val();
      var h = $('#header').val();
      var callback = function () {
          alert("I can do anything here");
      }
      showAlert(m, h, callback);

  });

  $.widget("MY.alertBox", {
      options: {
          message: "",
          header: "",
          callback: ''
      },

      _create: function () {
          var self = this;
          self.callback = self.options.callback;

          self.container = $(".alert-messagebox");
          var header = self.container.find(".alert-header");
          header.html(self.options.header);

          var message = self.container.find(".alert-message");
          message.html(self.options.message);

          var closeButton = self.container.find("button.modal-close-button");
          closeButton.click(function () {
              self.close();
          });

          self.show();
      },

      show: function () {
          var self = this;
          self.container.modal({
              maxWidth: 500
          });
      },

      close: function () {

          if (this.callback != null) {
              this.callback();
              $.modal.close();
              return;
          }
          $.modal.close();

      },

      destroy: function () {
          $.Widget.prototype.destroy.call(this);
      }

  });
于 2013-08-19T14:37:08.250 回答