如何在集合中的项上触发 jQuery 事件(意外的 jQuery 结果来自 $._data() 与集合的第一个元素)

How to Trigger jQuery event on item in set (unexpected jQuery results from $._data() with first element of set)

本文关键字:jQuery 集合 元素 第一个 结果 data 事件 意外      更新时间:2023-09-26

我正在尝试自动单击表列的标题,以便表在页面加载时自动排序。 (该表是由 Confluence 插件注入的,因此我们无法轻松控制其内容、排序或 CSS。

表中的每个<th>都有class="sortableHeader" 。 使用 jQuery 获取标头项集:

$('th.sortableHeader')

返回预期的 jQuery 对象数组,如果我这样做,获取与数组中第一项关联的事件就可以正常工作:

$._data( $('th.sortableHeader')[0], "events")
对象 {mousedown: Array[1]

, mouseup: Array[1]}鼠标向下: 数组[1]鼠标向上:数组[1]原型:对象

当然,我不能对那个家伙说.trigger(),因为他不是jQuery对象。 所以我试图使用.first().slice(0,1)来获取相同的对象(我认为),但这就是事情变得奇怪的地方:

$._data( $('th.sortableHeader').first(), "events")

定义

$._data( $('th.sortableHeader').slice(0,1), "events")

定义

我本以为底部的两个会产生与第一个相同的结果。 有人可以解释为什么事件没有出现吗? (显然,如果事件没有出现,那么我就无法.trigger()它们!

// trigger mouseup on all matching elements
$('th.sortableHeader').trigger('mouseup');
// trigger mouseup on first matching element
$('th.sortableHeader').first().trigger('mouseup'); 

要查找事件(和处理程序),您已经解决了:

$._data( $('th.sortableHeader')[0], "events");

这将返回保存在jQuery中的事件对象,但你不需要它们来触发它们,jQuery抽象了.trigger()中的部分。

如果你想真的很麻烦,试试这样的事情:

var ev = $._data( $('th.sortableHeader')[0], "events");
// ev is now an object of events
ev.mouseup.forEach(function(obj) {
    obj.handler();
});

演示:http://jsfiddle.net/YECr5/

为什么不等待您的插件完成加载,然后在您想要的任何元素上触发您想要的事件?

这将使用 sortableHeader 类选择所有元素,然后过滤掉除第一个元素之外的所有元素。 这将返回一个 jQuery 对象。

$('th.sortableHeader').first().trigger('click');

这样做相同,但返回一个 DOM 对象,因此要使其成为 jquery 对象,您可以将其包装在 jQuery 选择器中。

var mySelection = $('th.sortableHeader')[0];
$(mySelection).trigger('click');

http://jsfiddle.net/colbycallahan/uJusL/