0

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

我正在使用 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.carltomasedwards.com/painting2.php

4

2 回答 2

2

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

改用它:

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

甚至更简单:

$('.thumb_target').click( runClick);
于 2013-09-06T23:59:19.340 回答
2

当浏览器执行runClick时,this上下文不会被保留。如果您在Chrome 调试器中暂停,您可以看到它this实际上WindowrunClick被调用的时间。

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

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

$('.thumb_target').click( function() {
  runClick(this);
});
于 2013-09-06T23:59:22.507 回答