【问题标题】:How to display confirm box before submitting an AJAX form in Drupal 7?如何在 Drupal 7 中提交 AJAX 表单之前显示确认框?
【发布时间】:2012-09-18 14:31:19
【问题描述】:

使用 Drupal 7 表单 API,如何在提交 AJAX 表单之前提示 javascript 确认框?我尝试了不同的可能方法来做到这一点,但没有成功。代码如下:

function create_list_form($form, &$form_state) {

  $form['list_name'] = array(
    '#type' => 'textfield',
    '#required' => TRUE,
    '#title' => 'List Name'
    '#attributes' => array()
  );

  $form['list_desc'] = array(
    '#type' => 'textfield',
    '#required' => TRUE,
    '#title' => 'List Desc'
    '#attributes' => array()
  );

    $form['actions']['submit'] = array(
        '#type' => 'submit',
        '#attributes' => array('class' => array('use-ajax-submit')),            
        '#value' => 'Create List'
      );


  return $form;
}

这里是 Javascript 代码:

Drupal.behaviors.module = {
  attach: function() {

       jQuery('#edit-submit').click(function(){
          if(!confirm('Are you sure?'))
              return false;
      });

  }
}

【问题讨论】:

  • 你应该展示你的javascript代码,因为这是最相关的。
  • 我已经尝试了各种 javascript 技术来完成这项工作,但还没有成功。我已经编辑了问题并添加了其中一个 javascript 代码。 IT 显示确认框,但即使我按下否按钮也会提交表单。

标签: php jquery drupal-7


【解决方案1】:

我找到了解决方案。我们可以通过重写 beforeSerialize() 函数来做到这一点:

 Drupal.behaviors.module = {
  attach: function() {  

     Drupal.ajax['edit-submit'].beforeSerialize = function () {  

          if(confirm('Are you sure?'))
              return true;
          else
              return false;

      }
   }
 }

【讨论】:

  • 非常重要的是要知道,这部分代码不应该在 $(document).ready 事件中,因为那样它就不会运行。对我来说,它不适用于此事件的侦听器。根据本教程:drupal.org/node/304258#drupal-behaviors,这部分代码什么时候运行
  • 我有一个非常复杂的表单,它使用 field_collections 添加任意数量的不同角色的创建者。 UX 人员说,如果用户试图删除任何一个创建者,添加删除确认会很好。我无法使用任何类型的事件侦听器来做到这一点,因为即使使用 e.preventDefault() 或 e.stopPropogation() ajax 调用仍然可以通过。然而,这个答案是关键,上面的代码根据我们的情况进行了更改,效果很好。谢谢。
【解决方案2】:

您是否尝试在按钮上添加事件监听器?

function show_confirmation() {
    if (confirm("Do you want to submit?")){
        // here you can do something before it gets submitted
    } else {
        // return false prevents the form from submitting
        return false;
    }
}
var button = document.getElementById('button_name');
button.addEventListener('click', show_confirmation);

编辑:如果你想让你的函数可重用,你可以使用这个:

function your_callback_func() {
    // This could be any code for example your AJAX code etc
}

function show_confirmation(your_callback_func) {
    if (confirm("Do you want to submit?")){
        your_callback_func()
    } else {
        // return false prevents the form from submitting
        return false;
    }
}
var button = $('#button_name');
button.click(function() {
    show_confirmation(your_callback_func);
});

【讨论】:

  • 我试过这段代码。它提示确认框,但不等待用户响应并继续提交 AJAX 表单。
  • 您必须为您的 AJAX 提交代码创建一个函数,然后在 if(confirm) 语句中调用该函数。顺便说一句,为什么不使用 javascript 库,例如 JQuery、Prototype、MooTools 等?它们易于使用且速度很快!我一直在为 JS 苦苦挣扎很长时间,因为我从不想使用任何库。但是现在我不能没有 JQuery。无论如何告诉我你的脚本现在是否有效。我将编辑我的答案以使脚本更有效率。
  • 我正在使用 JQuery。再次查看我的问题,我已对其进行了编辑并添加了 javascript 部分。在 Drupal 表单中,我们不编写自定义 AJAX 来提交表单,而是在提交按钮上使用 css 类“use-ajax-submit”将常规表单转换为 AJAX。
  • 糟糕.. 我的错。把它和另一个问题混在一起。我已经超过 24 小时没有睡觉了。
猜你喜欢
  • 2018-03-27
  • 2011-01-18
  • 2018-02-11
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多