我在从事件目标元素中提取属性时遇到了一些麻烦。
我使用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();
});
答案 0 :(得分:2)
runClick
在全局范围内执行,因此this
引用全局对象(window
)。
请改用:
$('.thumb_target').click( function(event) {
runClick.apply(this);
});
甚至更简单:
$('.thumb_target').click( runClick);
答案 1 :(得分:2)
当浏览器执行runClick
时,不会保留this
上下文。如果您暂停Chrome debugger,则可以看到this
在调用Window
时实际为runClick
。
绕过问题的方法是将元素传递到runClick
:
function runClick(elem) {
alert($(elem).attr('id'));
...
}
和
$('.thumb_target').click( function() {
runClick(this);
});