【问题标题】:jQuery event target element attribute retrievaljQuery事件目标元素属性检索
【发布时间】:2013-09-06 23:48:34
【问题描述】:

我在从事件目标元素中提取属性时遇到了一些问题。

我正在使用 php 访问 mysql 数据库。从查询中,我提取了一些图像文件名和它们各自的 id。然后,我将这些图像显示在一个表格中,其中包含以下行:

print '<td><img id="img_' . $row['paint_id'] . '" class="thumb_target" src="img/paint/thumb/' . $row['paint_thumb'] .'"></td>';

如您所见,这一行为每个图像提供了 id 'img_xx',其中 xx 是 sql 数据库中的图像数字 id。我还将每个图像都归类为“thumb_target”。在文档准备就绪时,我为 thumb_target 元素设置了一个 .click 事件。这会进行 AJAX 调用,该调用应将 img_xx id 作为数据传递。我使用

让它在 chrome 中工作
data: 'imgID=' + event.target.id

然而,几个小时后,我决定在 Firefox 中检查其他内容,发现它不适用于所有浏览器。使用jQuery的方法:

var id = $(this).attr('id');

我不能让 id 成为未定义的任何东西。 我定位的元素与我认为的元素不同吗?

这是相关的javascript:

function runClick() {
  var id = $(this).attr('id');
  alert(id);
  $.ajax({
    url: 'overlay.php',
    //~ data: 'imgID=' + event.target.id,
    //~ data: ({ imgID: id }),
    data: 'imgID=' + id,
    dataType: 'json',
    success: function(data, textStatus, jqXHR) {
        processJSON(data);
    },
    error: function(jqXHR, textStatus, errorThrown){
        alert("Failed to perform AJAX call! textStatus: (" + textStatus +
              ") and errorThrown: (" + errorThrown + ")");
    }
  });
}

$(document).ready( function() {
  $('.thumb_target').click( function() {
    runClick();
  });

  $('#overlay').hide();
});

这里是测试页面的链接:http://www.carlthomasedwards.com/painting2.php

【问题讨论】:

    标签: php javascript jquery this target


    【解决方案1】:

    runClick在全局范围内执行,所以this指的是全局对象(window)。

    改用它:

    $('.thumb_target').click( function(event) {
        runClick.apply(this);
      });
    

    甚至更简单:

    $('.thumb_target').click( runClick);
    

    【讨论】:

    • 这仍然给我未定义... $('.thumb_target').click( function(event) { runClick().apply(this); });
    • 不带括号,见上文(或使用其他变体)
    • 呵呵,第二个解决了。我想知道我是否没有正确通过事件。我认为 Rafi 的方法可能是通过它的正确方法,因为第一种方法不起作用。
    • 第一种方法也可以,它必须是runClick.apply 而不是runClick().apply
    • 啊,我的错,你是对的,它们都有效。感谢您的帮助!
    【解决方案2】:

    当浏览器执行runClick 时,this 上下文不会被保留。如果你在Chrome debugger 中暂停一下,你可以看到runClick 被调用时this 实际上是Window

    绕过问题的方法是将元素传入runClick

    function runClick(elem) {
      alert($(elem).attr('id'));
      ...
    }
    

    $('.thumb_target').click( function() {
      runClick(this);
    });
    

    【讨论】:

    • 另一个答案更好:(
    • 这也可以。我将接受另一个答案,但我测试了你的答案,它确实有效,所以赞成:)。
    猜你喜欢
    • 2020-09-05
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多