使用preventDefault覆盖tap事件

时间:2016-02-01 13:37:17

标签: javascript jquery

我有很多:

    @Autowired
    OAuth2ClientContext oauth2ClientContext;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http    .csrf().disable() 
                .logout().logoutSuccessUrl("/").permitAll() //logout logic handled by spring
                .and()
                .antMatcher("/**")
                .authorizeRequests()
                    .antMatchers("/", "/login**", "/webjars/**", "/user")
                    .permitAll()
                .anyRequest().authenticated()
                .and().exceptionHandling().authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"))
                .and()
                .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
    }


    @Bean
    public FilterRegistrationBean oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter);
        registration.setOrder(-100);
        return registration;
    }

    protected Filter ssoFilter() {
        CompositeFilter filter = new CompositeFilter();
        List<Filter> filters = new ArrayList<>();
        filters.add(constructFilter("/login/google", google(), googleResource()));
        filter.setFilters(filters);
        return filter;
    }

    private Filter constructFilter(String endpoint, OAuth2ProtectedResourceDetails clientDetails, ResourceServerProperties resourceDetails) {
        OAuth2ClientAuthenticationProcessingFilter filter = new CustomOauth2AuthFilter(endpoint); 
        OAuth2RestTemplate template = new OAuth2RestTemplate(clientDetails, oauth2ClientContext); 
        filter.setRestTemplate(template);
        filter.setTokenServices(new UserInfoTokenServices(resourceDetails.getUserInfoUri(), clientDetails.getClientId()));
        return filter;
    }


    /*
    /Returns a new AuthorizationCodeResourceDetails object configured with the properties from the application.yml file
     */
    @Bean
    @ConfigurationProperties("google.client")
    OAuth2ProtectedResourceDetails google() {
        return new AuthorizationCodeResourceDetails();
    }

    /*
    /Returns a new ResourceServerProperties object configured with the properties from the application.yml file
     */
    @Bean
    @ConfigurationProperties("google.resource")
    ResourceServerProperties googleResource() {
        return new ResourceServerProperties();
    }
}

我搜索了很多关于$('#element').on('tap', function(){ // some code .. }) 事件发生两次问题的问题,我使用tap解决了我的问题,现在我有很多:

e.preventDefault()

好的,但正如我所说的,我有很多这样的电话,而且每次$('#element').on('tap', function(e){ e.preventDefault(); // some code .. }) 都不会写很多,然后我在Chrome控制台上键入e.preventDefault()它告诉我:

$.fn.tap

我试图用这种方式覆盖它:

function (a){return a?this.bind(c,a):this.trigger(c)}

但它并没有像之前$.fn.tap = function (a) { a.preventDefault(); return a?this.bind(c,a):this.trigger(c) } 那样有效。

我没有看到任何显而易见的事情,而且我没有想到这一点。

感谢任何帮助或想法。提前谢谢。

4 个答案:

答案 0 :(得分:10)

这是您创建$.fn.tap: -

的方法
$.fn.tap = function(f) {
  $(this).on('tap', function(e) {
    e.preventDefault();
    f();
  });
  return this;
};

//usage
$('.selector').tap(function() {
  alert('foo bar')
})
  

@Washington Guedes - 覆盖默认的点按事件以始终使用e.preventDefault()   而不是从$(元素).on(&#39; tap&#39;,function(){})更改为   $(元件).tap(函数(){})

您可以为body添加委托事件tap,而无需指定目标。然后,这会触发正文中的所有tap个事件,然后您可以检查目标是否有自己的tap事件,然后您可以e.preventDefault();

注意:这对于委派的tap事件不起作用,如图所示。

&#13;
&#13;
// global tap handler
$('body').on('tap', function(e) {
  if ($._data(e.target, "events").tap)
    e.preventDefault();
});

// tap event
$('a.tap').on('tap', function(e) {
  $(this).css('color', 'red');
});

// delegated tap event
$('body').on('tap', 'a.delegate', function(e) {
  $(this).css('color', 'green');
});
&#13;
a {
  display: block;
  margin: 20px 0;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.js"></script>

<a class="tap" href="www.google.co.uk">tap event, prevented.</a>
<a class="delegate" href="www.google.co.uk">delegate tap event, not prevented.</a>
<a href="www.google.co.uk">no tap event, not prevented</a>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

jQuery的一个很酷的功能(我通常不会在一个句子中使用&#39; jQuery&#39;很酷&#39;)它允许你指定自定义行为事件,使用$.event.special对象。

关于这个主题有very little documentation,所以一个小例子就是有序的。 使用click事件的工作小提琴(因为这对我来说在我的笔记本电脑上写得更方便can be found here

转换为您的请求,让所有 tap事件在实际处理程序之前调用e.preventDefault(),如下所示:

$.event.special.tap.add = function(options) {
  var handler = options.handler;

  options.handler = function(e) {
    e.preventDefault();

    return handler.apply(this, arguments);
  }
}

这段代码做了什么(应该做什么,因为我还没有真正测试过上面的tap版本)告诉jQuery你想要对tab事件进行特殊处理,尤其是你想要提供一个包装处理程序&#39;这只是在调用提供的事件处理程序之前调用e.preventDefault()

更新:阻止默认tap - 设置被覆盖,以供将来的访问者

注意:在尝试更改事物的默认行为之前,您应该问自己为什么默认值不适合您。主要是因为更改默认(=预期)行为会在维护代码和添加功能的同时扰乱您未来的自我(或更糟糕的是,另一个人)。

为了在代码中创建可维护(且可预测)的流,创建特殊案例函数($.fn.tap)的建议解决方案实际上是一个非常可行的解决方案,因为它不会干扰默认值( =预期)事物的行为。

从我提供的链接中,您还应该能够创建自己的事件类型(例如tapOnly),并且更明显地涉及一些自定义工作。然后,这两个解决方案都需要您更改事件绑定,这是您要阻止的。

答案 2 :(得分:1)

我知道这可能是一个坏主意,但我刚刚在Chrome中对此进行了测试

$('*').on('tap',function(e){
    e.preventDefault();
});

$('#element').on('tap', function(){
    // some code ..
});

如果你不需要这个所有元素:

$('*').not('#aCertainElement').on('tap',function(e){
    e.preventDefault();
});

答案 3 :(得分:0)

我遇到了类似的问题,其中e.preventDefault()会对某些情况起作用,但对其他情况则不起作用。它没有显示错误,使用try-catch未显示catch alert。添加e.stopImmediatePropagation()可以解决问题,万一它可以帮助任何人