Làm cách nào để thay đổi hành vi tải ajax trong Chế độ xem?


34

Tôi có một cái nhìn với một số bộ lọc tiếp xúc trong một khối; nó sử dụng AJAX và tính năng tự động gửi để chế độ xem được tải lại ngay sau khi tùy chọn bộ lọc được thay đổi.

Trong độ trễ ngắn giữa việc chọn một tùy chọn và chế độ xem được tải lại, trình điều khiển AJAX màu xanh lam quen thuộc được hiển thị ở đâu đó ở dưới cùng của biểu mẫu (Tôi nghĩ vị trí nút gửi ẩn hiện đang nằm ở đâu).

Tôi biết tôi có thể tùy chỉnh hình ảnh này bằng cách ghi đè CSS cho phần tử throbber, nhưng tôi hoàn toàn không muốn sử dụng nó.

Điều tôi muốn làm hơn là tạm thời làm mờ hình thức bộ lọc bị phơi bày (và lý tưởng nhất là chế độ xem chính), bằng cách sử dụng hoạt hình jQuery. Sau đó, chúng sẽ mờ dần trở lại khi cuộc gọi AJAX hoàn tất.

Không thể, tôi muốn sử dụng cùng một phương thức mà mô-đun Giao diện người dùng sử dụng khi cập nhật, cụ thể là đặt biểu tượng này ở giữa trang:

nhập mô tả hình ảnh ở đây

Vì nó đã được xây dựng nên tôi chỉ cho rằng sẽ có một cài đặt ở đâu đó để thay đổi kiểu / vị trí của hành vi tải này; không có may mắn như vậy mặc dù.

Làm thế nào để tôi thực hiện một trong hai phương pháp này?

Tôi đang sử dụng Drupal 7 với Lượt xem 7.x-3.3.


Mmmm ... dự án buổi sáng :)
Lester Peabody

Khoảng thời gian mà bạn cần điều này được thực hiện trong?
Lester Peabody

@Lester Tôi không vội vã vì nó không phải là công cụ chặn phát hành cho bất kỳ dự án nào tôi đang thực hiện ... nhưng tôi phải thừa nhận rằng nó đang làm phiền tôi! Tôi hiếm khi sử dụng Lượt xem và tôi không có thời gian (hoặc năng lượng thẳng thắn) để 'tham gia' với nó ở cấp độ thấp hơn; nhưng hiện tại tôi đang bắt đầu chuyển những nỗ lực thương mại điện tử của mình sang Drupal Commerce, tôi cần có khả năng thực hiện những điều này. Nếu tôi nhận được câu trả lời tốt trong thời gian 7 ngày tiền thưởng, tôi sẽ ở trên mặt trăng :)
Clive

Xin chào, tôi vừa hoàn thành việc tạo mô-đun tùy chỉnh của mình (với trang quản trị cài đặt) để tạo kiểu cho trình xem. Bạn vẫn quan tâm chứ? Tôi có thể tải nó lên trong vòng vài ngày trong drupal.org
ANDiTKO

1
#random -: -o tôi nghĩ @Clive là tất cả về câu trả lời, thậm chí bạn còn đặt câu hỏi;): D
SGhosh

Câu trả lời:


42

Nếu bạn không phiền khi sử dụng một chút jquery, bạn luôn có thể làm một cái gì đó như:

$('#view-id').ajaxStart(function(){
   $('#view-filters-id').fadeTo(300, 0.5);
});
$('#view-id').ajaxSuccess(function(){
   $('#view-filters-id').fadeTo(300, 1.0);
});

4
Vâng, tôi đồng ý với giải pháp này. Chỉ cần lưu ý, rằng jQuery ajaxSendajaxCompletecó thể được sử dụng với điều kiện if (settings.url == '/views/ajax') {//... }để kiểm soát nhiều hơn.
kalabro

Wow tôi thực sự quá phức tạp mọi thứ dường như quá rõ ràng bây giờ! Tôi đã phải đính kèm các sự kiện vào biểu mẫu bộ lọc thay vì chế độ xem (nếu không ajaxSuccesschỉ được kích hoạt một lần; tôi đoán vì sự kiện này không tự động bị ràng buộc lại với sự thay thế <div>) nhưng khác với điều này là hoàn hảo, không đề cập đến đơn giản đẹp mắt . Cảm ơn rất nhiều
Clive

@kalabro Cảm ơn một lần nữa vì sự giúp đỡ của bạn với điều này, nếu tôi có thể chia tiền thưởng giữa điều này và câu trả lời của bạn, tôi sẽ làm; nhưng tôi phải thực hiện điều này vì đây gần như là một ví dụ hoạt động đầy đủ :)
Clive

@Clive, tôi rất vui khi tìm thấy giải pháp :)
kalabro

1
Kể từ jQuery 1.8, phương thức .ajaxSuccess () chỉ nên được đính kèm vào tài liệu . So sánh giá trị cài đặt, như được đề xuất bởi kalabro ở trên, là cách để đi. nguồn: api.jquery.com/ajaxSuccess
cjoy

29

Để hoàn thiện đây là mã tôi đã sử dụng; nó mờ dần cả hình thức bộ lọc bị lộ và chế độ xem khi tải AJAX bắt đầu và quay lại lần nữa khi kết thúc:

(function($) {
  Drupal.behaviors.events = {
    attach: function(context, settings) {
      $('#views-exposed-form-events-page', context).ajaxStart(function(){
        $('#views-exposed-form-events-page,div.view-id-events', context).fadeTo(300, 0.5);
      });
      $('#views-exposed-form-events-page', context).ajaxSuccess(function(){
         $('#views-exposed-form-events-page', context).fadeTo(300, 1.0);
         $('div.view-id-events', context).css('opacity', 0.5).fadeTo(300, 1.0);
      });
    }
  };
})(jQuery);

Tuyệt vời! Tôi rất vui vì đã làm việc cho bạn.
Cơ hội G

Làm thế nào điều này được thực hiện trên Drupal 6?
Ryan G

thực sự tuyệt vời, nhưng chỉ áp dụng một lần :)
Kojo

10

Xin chào tôi đã tạo ra một mô-đun rất đơn giản với liều lượng chính xác những gì bạn muốn làm. Mô-đun này có trang cấu hình nơi bạn có thể kiểm soát phong cách của throbber và thậm chí tải lên hình ảnh của riêng bạn mà không cần hack.

Đây là liên kết hộp cát: http://drupal.org/sandbox/ANDiTKO/1556808

Nếu bạn thấy nó hữu ích, vui lòng reveiw nó ở đây để nó có thể được phê duyệt là dự án chính thức: http://drupal.org/node/1556114


Điều đó có vẻ rất tốt cảm ơn rất nhiều :) Tôi sẽ cài đặt nó và đăng một số nhận xét về đánh giá khi tôi có cơ hội
Clive

6

Tôi vừa thực hiện một nghiên cứu.
Cái throbbernày được mã hóa cứng ở đây trong hàm tạo của Drupal.views.ajaxView.
Một thể hiện của Drupal.views.ajaxViewkhông được lưu trữ trong đóDrupal.ajax @todo về nó.
Điều đó có nghĩa là chúng ta không thể đi vào đối tượng và thiết lập các thông số riêng.

Làm thế nào để xem nó làm gì?

Câu trả lời ngắn gọn là CSS.
Xem trang quản trị chỉ cần ẩn throbber và thêm kiểu cho trang đó .ajax-progress-throbber.

.ajax-progress-throbber {
  background-color: #232323;
  background-image: url("../images/loading-small.gif");
  background-position: center center;
  background-repeat: no-repeat;
  -moz-border-radius: 7px;
  -webkit-border-radius: 7px;
  border-radius: 7px;
  height: 24px;
  opacity: .9;
  padding: 4px;
  width: 24px;
}

Tôi có thể làm gì với Drupal.ajax không?

Có, tôi đã tìm thấy một số phương pháp bạn có thể ghi đè lên các phần tử AJAX (nút, liên kết, v.v.). Tôi đã đưa ra một ví dụ ở đây: Làm thế nào để mở rộng hoặc ra móc móc hình thức Drupal AJAX? . Nhưng trong trường hợp này nó sẽ không tốt như vậy.
Yếu tố tiến bộ đang hiển thị ở beforeSendgiai đoạn, vì vậy bạn có thể làm điều gì đó trước khi nó xảy ra.


Cảm ơn rất nhiều về thông tin, nhưng tôi không chắc mình sẽ sử dụng nó như thế nào để giải quyết vấn đề của mình; bạn có nói rằng không thể thêm / thay đổi hành vi tải Chế độ xem ajax mặc định ngoài CSS, ít nhất là không hack mô-đun Lượt xem không?
Clive

Ý tôi là, bạn có thể sử dụng CSS, vì Lượt xem cũng sử dụng nó. Chỉ cần ẩn .throbbervà thêm một số kiểu vào.ajax-progress-throbber
kalabro

OK, vậy cả hình thức bộ lọc được hiển thị trong khối và chế độ xem, có nhận được một lớp .ajax-progress-throbberkhi bất kỳ AJAX nào được gọi không? Tôi phải thừa nhận tôi đã không nhận thấy điều đó xảy ra nhưng tôi sẽ kiểm tra. Và bạn nghĩ tôi sẽ có thể gọi hoạt hình jQuery trong một beforeSendhàm (dựa trên câu trả lời cho câu hỏi khác của bạn)? Cảm ơn, tôi không thực sự sử dụng Lượt xem và tôi không thể bận tâm tìm hiểu từng đoạn mã để tìm hiểu điều gì đang xảy ra! Tôi sẽ cho bạn biết làm thế nào tôi tiếp tục thử điều đó
Clive

1
Cần lưu ý để đạt được hiệu ứng mờ dần mà bạn muốn trên các thành phần của biểu mẫu, bạn cũng có thể sử dụng Chuyển tiếp CSS thay vì hoạt hình jQuery, mặc dù hoạt ảnh jQuery sẽ chỉ hoạt động trên tất cả các trình duyệt và Chuyển tiếp CSS trên thế hệ mới nhất.
Lester Peabody

Cảm ơn @Lester, tôi muốn sử dụng jQuery trong thời gian này. @kalabro không may đề xuất của bạn không hoạt động; không phải khung nhìn, cũng không phải khối bộ lọc bị lộ, khiến .ajax-progress-throbberlớp được áp dụng cho chúng tại bất kỳ thời điểm nào để phương thức của bạn không hoạt động. Cảm ơn bạn đã thử mặc dù
Clive
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.