【问题标题】:React only to .trigger() not to user input只对 .trigger() 作出反应,而不是对用户输入作出反应
【发布时间】:2013-05-03 21:48:19
【问题描述】:

有一个对链接点击事件的回调实现。我无法更改或删除此代码。

我想在有人单击按钮时调用该链接的单击事件回调(例如)。所以我决定使用.trigger('click')。它工作正常。

但是现在,当用户单击链接时,我不希望发生任何事情。我正在考虑使用.unbind(),但这样做会使.trigger('click') 不起作用,因为链接已解除绑定。

所以基本上,我想“重用”链接点击事件的回调,而无需复制粘贴代码。我该怎么做?

【问题讨论】:

  • 即使您无法更改或删除此代码,您也可以将其提供给我们以了解实际情况;)
  • 我从来没有试图找到一个已经附加的事件处理程序,但我想你可以做到。获取存储在某处的函数引用,然后取消绑定事件。您可以使用 jQuery data() 来“查找”现有的事件处理程序。 stackoverflow.com/questions/12214654/…
  • 没有使用 jQuery 完成此任务的文档化方法,我建议您更多地研究您正在使用的插件,看看您是否可以获得对定义它的事件处理程序的引用在插件中。
  • 如果不改变原来的点击事件处理程序,你不能让它与 trigger() 一起工作,而不是与用户点击一起工作。在点击事件处理程序中,您可以区分两者,但您也可以复制粘贴函数本身并使用它而不是触发点击。
  • 如果您可以在您尝试停止的事件之前将点击事件绑定到所述元素,您可以使用event.stopImmediatePropagation() api.jquery.com/event.stopImmediatePropagation 停止它,如果说不可更改的代码,这显然不起作用创建元素。 jsfiddle.net/K7Rgc/5

标签: jquery


【解决方案1】:

这应该适合你:

// Get the first click event on the link
var clickEvent = $._data( $("a.mylink")[0], "events" ).click[0];

// Unbind the click event on the link
$("a.mylink").unbind('click');

// Attach the click event to the button
$("button").click(clickEvent);

这是 jsFiddle

此代码获取第一个注册到 HTML 元素的单击事件并将其粘贴到变量中,然后解除绑定事件,并将事件附加到按钮。因此,如果在 HTML 元素中注册了多个事件,则您必须对 $._data( $("a.mylink")[0], "events" ).click 进行一些循环 - 它会返回所有已注册的点击事件 - 以找出要抓取的事件。

如下所述,第一行是使用非公开支持的内部 jQuery 接口,它可能会因版本而异。它适用于版本 1.8 到至少当前的 1.9 版本。

【讨论】:

  • 请让 OP 知道您正在使用未记录的 jQuery 功能。
【解决方案2】:

很抱歉错过了这部分:

我无法更改或删除此代码。

解除按钮的点击事件:

$("#mybutton").off("click");

如果按钮单击中的代码是匿名函数,则复制该代码并将其添加到页面中,这样您就可以在不触发事件的情况下调用它:

$("#mybutton").on("click",function(){
//copy this part and add it as a new function to be called.
});

如果按钮单击中的代码是函数调用,那么您可以调用该函数:

$("#mybutton").on("click",someFunction);

可以这样调用:

someFunction();

如果您有无法更改依赖于 $("#mybutton").trigger("click") 的现有代码,那么您可以将该按钮的显示设置为无,这样任何人都无法点击它,离开事件处理程序到位,并且(如果按钮需要在页面上)在页面上添加另一个按钮,该按钮没有用于单击的处理程序。

【讨论】:

  • 我不想复制代码。我想调用已经存在的回调。
  • 您可以复制它的html,创建并在其后插入一个html,然后隐藏原始。它看起来一样,但复制的 html 不响应点击。您可以触发点击,因此如果现有代码需要触发点击才能工作,它仍然可以工作。问题可能是现有代码将原始 html 元素设置为再次可见。
  • 复制它的html我的意思是$newEl.html($el.html())
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多