1

我有一堆 ajax 函数我正在触发事件(点击、dblclick、按键等)。在我的 events.js 文件的开头,我想定义一个变量,它代表用户点击的元素的 id上。目前是

$(this).parents('li').attr('data-id')

到目前为止,我尝试过这种方式:

var element_id = $(this).parents('li').attr('data-id');

var test = function(id)
{
    ajaxCall(id);
}

$('.js_btn_test').live('click', function()
{
    test(element_id);
}

不幸的是,它不起作用。我认为当我单击 .js_btn_test 并被评估为其父“li”时会解析 element_id var,然后获取 data-id。

谢谢你的帮助 !

EDIT1:基本 HTML 结构

看起来像这样

<li data-id="<?php echo $item->getId(); ?>">
    <button class="js_btn_test">Test</button>
</li>
4

4 回答 4

3

不,它不是那样工作的。和...

var element_id = $(this).parents('li').attr('data-id');

...您立即element_id为变量分配一个值,而不取决于您下次检查其值时的值。this

一种可能的解决方法是改用函数:

var getElementId = function(el) {
  return $(el).parents('li').attr('data-id');
};
...
$('.js_btn_test').live('click', function() {
   test(getElementId(this));
});

...this在事件处理程序中(您传递给的匿名函数live)是指触发事件的元素。

作为旁注,您可以交换.attr('data-id')为只是调用,如此.data('id')所示和此处描述。

于 2012-09-12T08:20:19.893 回答
2

如果我理解正确,您正在尝试做的是将id基于单击元素获取的逻辑放入变量中。这是不可能的,除非你把它变成一个函数(在这种情况下,根本不需要把它变成一个变量)。

例如:

function getIdFromElement(el) {
    return $(el).parents('li').attr('data-id');
}

$('.js_btn_test').live('click', function()
{
    test(getIdFromElement(this));
}
于 2012-09-12T08:17:20.310 回答
1

你不能得到this,因为它还没有在上下文中。

live最新版本的 jquery 中也不推荐使用。

这是jquery网站的摘录

从 jQuery 1.7 开始,该.live()方法已被弃用。用于.on()附加事件处理程序。旧版本 jQuery 的用户应该.delegate()优先使用.live().

var test = function(id)
{
    ajaxCall(id);
}

$('.js_btn_test').on('click', function()
{
    var element_id = $(this).parents('li').attr('data-id');
    test(element_id);
}
于 2012-09-12T08:25:33.240 回答
1

this在正确的上下文中执行之前,您无法正确解析。

var test = function(id)
{
    ajaxCall(id);
}

$('.js_btn_test').live('click', function()
{
    var element_id = $(this).parents('li').attr('data-id');
    test(element_id);

    func01(element_id);
    func02(element_id);
    // etc
}
于 2012-09-12T08:13:46.300 回答