【问题标题】:How to put a click function inside a callback function?如何将点击函数放在回调函数中?
【发布时间】:2009-10-12 17:35:54
【问题描述】:

我正在使用这个插件:http://www.fyneworks.com/jquery/star-rating/

是否可以将点击函数放在这样的回调函数中?

$('.auto-submit-star').rating({ 
  callback: function(value, link){ 
    $('.myclass').click(function(){
      alert($(this).attr('id'));
    });
    alert($(this).attr('id'));
  } 
});

添加点击函数后,回调函数将停止工作。我需要这样做,因为如果用户点击任何星星,我可以拿起星星的 id,但如果用户点击取消按钮,我无法以某种方式获得取消的 id。

假设您可以在回调中使用 click 函数,它仍然会触发它吗?因为你点击之后触发了回调,会不会还是触发我里面的点击函数?

如果我将 click 函数分开,仍然可以工作,但我必须在两个函数中重复一堆代码。

【问题讨论】:

  • 简短的回答是有可能。下面使用“实时”事件处理程序的两种解决方案都更适合 jQuery 1.3.x+

标签: jquery function callback click


【解决方案1】:

为防止在单击时发生多个操作,您需要在添加新事件之前销毁前一个事件(否则它们只会堆叠在一起)。为了销毁(即杀死)一个事件,您需要:

$('.auto-submit-star').rating({ 
  callback: function(value, link){ 
    $(".myclass").die("click").live("click", function(){
      alert($(this).attr('id'));
    });
  } 
});

或者(最好),不要在回调中附加点击事件...单独执行。

$(".myclass").live("click", function(){
    alert($(this).attr('id'));
});
$('.auto-submit-star').rating()

祝你的项目好运。

【讨论】:

  • 谢谢,这很有帮助。我将点击放在回调函数中的原因是在我获得 id 之后,我基本上会在每个函数中重复相同的代码,所以我试图减少重复的代码。
  • 嗯,其实很奇怪的是,放置在实时点击功能之外的代码在实时点击功能中的代码之前被处理。这是为什么呢?
  • @Roger:我认为您对live() 方法的作用感到困惑。基本上,我给出的第二个代码示例的前 3 行的作用是 (1) 查找类 myclass 的所有元素,并使其每当单击其中一个元素时,都会弹出一个带有 id 的警报框单击的元素。然后,每次将另一个具有类 myclass 的元素添加到 DOM 时,它都会重复相同的过程。因此,本质上,作为用户,您不会知道live() 方法已被处理,直到您单击匹配的元素。这有帮助吗?
  • 啊,我明白了。那时可能不是我想做的。 :p 基本上我需要这两个函数来运行相同的 ajax 请求,但我更愿意以一种不会重复相同代码的方式来执行它。没关系,虽然我猜。感谢您的帮助。
【解决方案2】:

尝试使用实时处理程序

$(".myclass").live("click", function(){
  alert($(this).attr('id'));
});

【讨论】:

  • 酷,这行得通。但是,有时在我对事物进行评分后,出于某种原因,我会收到多个警报,即使只是单击一下。知道为什么会这样吗?
【解决方案3】:

你有没有考虑过使用 jQuery 的 .live(type, fn) 事件而不是绑定点击回调?

http://docs.jquery.com/Events/live#typefn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多