如何更改View中的Ajax加载行为?


34

我有一个视图,其中有一些裸露的滤镜。它使用AJAX和自动提交功能,因此一旦更改过滤器选项,便会重新加载视图。

在选择选项和重新加载视图之间的短暂延迟中,熟悉的蓝色AJAX th子显示在表单底部的某个位置(我认为隐藏的提交按钮当前位于何处)。

我知道我可以通过覆盖throbber元素的CSS来自定义此图像,但是我不希望完全不使用它。

我更想做的是使用jQuery动画暂时淡出暴露的滤镜形式(最好是主视图)。然后,当AJAX调用完成时,它们会逐渐消失。

失败的话,我想使用与Views UI模块更新时使用的方法相同的方法,即将此图标放在页面中间:

在此处输入图片说明

因为已经内置,所以我只是假设会有一个设置可以更改此加载行为的样式/位置。不过没有这种运气。

如何实现这两种方法?

我正在将Drupal 7与Views 7.x-3.3一起使用。


Mmmm ... morning project :)
Lester Peabody 2012年

您需要在什么时间完成?
Lester Peabody

@Lester我并不急于使用它,因为它不是我正在从事的任何项目的发布阻止程序...但是我必须承认它在困扰我!我很少使用Views,也没有时间(或坦率地说)将其“低调”地投入其中。但是随着我现在开始将我的电子商务工作移植到Drupal Commerce上,我需要能够做这种事情。如果我在7天的赏金期内得到一个好的答复,我将过月:)
Clive

嘿,我刚完成创建自己的自定义模块(带有“设置”管理页面)以设置视图样式。你还有兴趣吗?我可以在几天之内将其上传到drupal.org
ANDiTKO,2012年

1
#random-:-o我以为@Clive都是关于答案的,您甚至可以提出问题;):D
SGhosh 2014年

Answers:


42

如果您不介意使用一些jquery,则可以始终执行以下操作:

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

4
是的,我同意这种解决方案。请注意,jQuery ajaxSendajaxComplete可以与条件一起使用以if (settings.url == '/views/ajax') {//... }进行更多控制。
卡拉布罗2012年

哇,我真的太复杂了,现在看来是如此显而易见!我必须将事件附加到过滤器表单而不是视图(否则ajaxSuccess仅触发一次;我想是因为事件不会自动重新绑定到替换对象<div>),但除此之外,这是完美的,更不用说简单了。非常感谢
Clive

@kalabro再次感谢您的帮助,如果我能在这个和您的回答之间分配赏金,我会;但我必须真正去做这件事,因为这几乎是一个可以正常工作的例子:)
克莱夫(Clive

@Clive,我很高兴找到解决方案:)
kalabro,2012年

1
从jQuery 1.8开始,.ajaxSuccess()方法仅应附加到document。如上面的kalabro所建议的,比较设置值是正确的方法。来源:api.jquery.com/ajaxSuccess
cjoy

29

为了完整起见,这里是我最终使用的代码;它会在AJAX加载开始时使暴露的滤镜形式和视图淡出,并在完成时再次返回:

(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);

太棒了!很高兴为您解决。
机会G

在Drupal 6上如何完成?
瑞安·G

确实很棒,但仅适用一次:)
Kojo 2014年

10

您好,我创建了一个非常简单的模块,可以精确地执行您想做的事情。该模块具有配置页,您可以在其中控制跳动的样式,甚至上传自己的图像而不会受到任何黑客攻击。

这是沙盒链接:http : //drupal.org/sandbox/ANDiTKO/1556808

如果您觉得有用,请在此处重新获取,以便可以将其批准为官方项目:http : //drupal.org/node/1556114


非常感谢:)我将安装它,并在有机会的时候在评论中发表一些意见
Clive

6

我刚刚进行了研究。
throbber中的硬编码Drupal.views.ajaxView
的一个实例Drupal.views.ajaxView未存储在其中,Drupal.ajax并且周围 @todo没有。
这意味着我们无法进入对象并设置自己的参数。

视图如何工作?

简短的答案是CSS。
Views管理页面只是隐藏 throbber样式并为其父样式添加样式.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;
}

我可以对Drupal.ajax做些什么吗?

是的,我发现了一些可以覆盖AJAX元素(按钮,链接等)的方法。我在这里展示了一个示例:如何扩展或“挂钩” Drupal Form AJAX?。但是在这种情况下,它不会那么好。
进度元素正在显示中beforeSend,因此您可以在发生之前做一些事情。


非常感谢您提供的信息,但是我不确定如何使用它来解决问题。您是说无法在CSS之外添加/更改默认的View ajax加载行为,至少是不修改Views模块?
克莱夫(Clive)

我的意思是,您可以使用CSS,因为Views也使用CSS。只需隐藏.throbber并添加一些样式即可.ajax-progress-throbber
卡拉布罗2012年

好的,因此块中公开的过滤器形式和视图本身都获得.ajax-progress-throbber何时调用任何AJAX 的类?我必须承认我没有注意到这种情况,但我会检查。而且您认为我将能够在一个beforeSend函数中调用jQuery动画(基于您对其他问题的回答)?谢谢,我并没有真正使用过Views,也不会费心地一直深入到每一段代码中来查找正在发生的事情!我会让你知道我如何尝试
克莱夫(Clive

1
要记住要在表单元素上获得淡入淡出效果,您可以使用CSS Transitions代替jQuery动画,尽管jQuery动画仅在最新一代的浏览器和CSS Transitions上才有效。
Lester Peabody

感谢@Lester,我暂时想使用jQuery。不幸的是,@ kalabro的建议无效。无论是视图还是暴露的过滤器块,.ajax-progress-throbber都不会在任何时候将类应用于它们,因此您的方法将无法工作。感谢您的尝试
克莱夫(Clive)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.