Làm thế nào để vô hiệu hóa nút gửi sau khi nhấp?


13

Drupal dường như không ngăn chặn nhiều hình thức gửi, ngay cả trên các trang nút. QA này đề nghị sửa nó ở phía máy chủ.

Làm thế nào tôi có thể vô hiệu hóa nút gửi sau khi nhấp vào?

Bất kỳ giải pháp nào khác?


Không phải API biểu mẫu của Drupal ngăn chặn việc gửi hai lần nhờ kiểm tra giá trị mã thông báo biểu mẫu của nó? Không thể gửi biểu mẫu có cùng mã thông báo hai lần?
Johnathan Elmore

Câu trả lời:


12

Chỉ có trong dev nhưng mô-đun Hide Gửi sẽ thực hiện thủ thuật. Một trong những tính năng là:

Ẩn (hoặc vô hiệu hóa) nút gửi sau khi đã nhấp vào

Tôi vừa cài đặt nó trên một trang dev và nó dường như hoạt động tốt cho các biểu mẫu thêm nút; Khi bạn nhấp vào nút gửi, nó sẽ bị ẩn và được thay thế bằng hình ảnh đang tải và thông báo 'Vui lòng đợi ...', trước khi biểu mẫu cuối cùng được gửi. Tôi đã không thử nó trên bất kỳ hình thức khác mặc dù.


Bất kỳ ý tưởng nào về cách làm cho mô-đun ẩn gửi hoạt động trên các biểu mẫu trong các mô-đun tùy chỉnh của riêng bạn? Tôi đã hy vọng nó sẽ được mở rộng trang web, nhưng dường như không phải vậy.
dùng785179

@ user785179 xem cách nó thực hiện hook_form_alter()- nếu nó đang sử dụng hook_form_FORMID_alter(), hãy chuyển nó thành chung chung hook_form_alter(). Nếu nó là chung hook_form_alter()với nếu bên trong, thêm một số ortrong này if.
Mołot

Hãy cẩn thận với giải pháp này - mô-đun ẩn gửi phá vỡ tải lên ajax, gây ra sự cố tự động hoàn thành và trong một số trường hợp khiến nút gửi không làm gì cả trong lần nhấp đầu tiên. Tôi chỉ phải gỡ cài đặt nó từ một trang web.
jenlampton

@Jen Lạ, tôi đã sử dụng nó trong hàng chục trang web trong nhiều năm mà không thấy bất kỳ vấn đề nào như vậy. Có lẽ bạn đã cài đặt một mô-đun khác can thiệp vào nó
Clive

10

Đây là giải pháp cho Drupal 7. Mã là phiên bản đơn giản của mô-đun Hide Gửi.

Mã này hoạt động tốt ngay cả với các nút "Thêm" và biểu mẫu AJAX.

Drupal.behaviors.hideSubmitButton = {
  attach: function(context) {
    $('form.node-form', context).once('hideSubmitButton', function () {
      var $form = $(this);
      $form.find('input.form-submit').click(function (e) {
        var el = $(this);
        el.after('<input type="hidden" name="' + el.attr('name') + '" value="' + el.attr('value') + '" />');
        return true;
      });
      $form.submit(function (e) {
        if (!e.isPropagationStopped()) {
          $('input.form-submit', $(this)).attr('disabled', 'disabled');
          return true;
        }  
      });
    });
  }
};

Tôi muốn thực hiện điều này trong chủ đề quản trị. Tạo một tập tin sitename.js và sao chép mã ở trên vào nó. Nó không làm việc. Tôi có nên điều chỉnh mọi thứ?
Justme

@Justme bạn đã đặt tập tin sitename.js ở đâu? Nếu trong một mô-đun hoặc chương trình con, bạn cần thêm nó vào tệp .info để nó được tải hoặc gọi drupal_add_js () ở một nơi khác để lấy nó trên trang. Bạn có thể thấy nó được thêm vào trong nguồn trang không?
jenlampton

Thxs đã giải quyết nó. Tôi không biết rằng cái này phải nằm giữa: (function ($) {và}) (jQuery); trong tập tin js. Hoạt động như một sharm !!
Justme

0

Cách dễ nhất là thực hiện một giải pháp javascript dựa trên chủ đề để vô hiệu hóa nút sau khi gửi biểu mẫu. Trong tệp theme.info, đặt tệp javascript của bạn để có thể được tải bởi api chủ đề.

scripts[] = js/themename-script.js

Bây giờ trong themename-script.js thêm vào phần Drupal.behaviors.themename để trông giống như sau:

Drupal.behaviors.themename = function()
{
  $('.node-form').submit(function(){
    $('#edit-submit').attr("disabled", "disabled");
    $('#edit-preview').attr("disabled", "disabled");
  });
}

Vì vậy, dòng chảy như sau:

  1. Chủ đề tải javascript
  2. Drupal.behaviors.themename được kích hoạt khi tải trang
  3. Trên biểu mẫu gửi biểu mẫu thêm nút (lớp dựa trên ví dụ trên, nó có thể được tùy chỉnh theo loại biểu mẫu) vô hiệu hóa các nút gửi (gửi và xem trước) để không thể nhấp lại vào nút

Tôi chắc chắn nếu có một số xử lý ajax rằng những điều trên có thể nguy hiểm và việc gửi biểu mẫu không bao giờ có thể được thực hiện lại nếu một lỗi được bắt gặp trong xác thực form_api, vì vậy hãy kiểm tra điều này và tùy chỉnh để đáp ứng nhu cầu của bạn. Tôi đã tắt cả hai nút vì bạn vẫn có thể nhấp vào nút xem trước trong khi nút gửi bị tắt. Rõ ràng là milage của bạn khác nhau của tôi.


2
Bạn đang sử dụng Drupal.behaviorskiểu khai báo cũ ; Nó sẽ không hoạt động cho Drupal 7. Nó sẽ cần phải như vậy Drupal.behaviors.themename = { attach: function (context, settings) { // .... Xem Quản lý JavaScript trong Drupal 7 để biết thêm thông tin
Clive

Đã sửa kiểu khai báo
Eugene Fidelin

Những giá trị nào nên được thay thế từ tập lệnh này 'dạng nút'?
pal4life

Tôi đã cố gắng để làm việc này trong chủ đề quản trị nhưng không có may mắn. Đổi tên họ bằng adminimal và sao chép mã hoàn chỉnh trong sitename.js và thêm mã này vào tệp thông tin chủ đề. Tôi vẫn dễ dàng nhận được nhiều bài nộp cùng hình thức.
Justme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.