Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";这";onclick事件的引用不起作用_Javascript_This - Fatal编程技术网

Javascript";这";onclick事件的引用不起作用

Javascript";这";onclick事件的引用不起作用,javascript,this,Javascript,This,我尝试调用带有“onclick”事件的函数,如下所示: <td id="A1" onclick="move()" class="white"></td> <td id="A2" onclick="move()" class="painted bp"></td> <td id="A3" onclick="move()" class="white"></td> 当我运行整个程序时,警报显示“未定义”。当我尝试alert(thi

我尝试调用带有“onclick”事件的函数,如下所示:

<td id="A1" onclick="move()" class="white"></td>
<td id="A2" onclick="move()" class="painted bp"></td>
<td id="A3" onclick="move()" class="white"></td>
当我运行整个程序时,警报显示“未定义”。当我尝试
alert(this)
时,我得到[object window]。 顺便说一句,我在IE9工作。
谢谢

这是代码中的
窗口
对象

您可以将此
作为参数传递

<td id="A1" onclick="move(this)" class="white"></td>

尝试使用事件目标来获取您要查找的dom元素:

function move(e) {
  alert(e.target);
}


现在
this
将引用
move
函数中的
td
元素。

当从事件处理程序调用函数时,它的
this
不是由处理程序设置的(尽管您可以根据Xdazz的答案从处理程序传递
this
,或者根据Kyle的答案设置
this
)。另一种方法是从与事件关联的事件对象中提取sender元素:

function move(e) {
    if (!e)
        e = window.event;
    var sender = e.srcElement || e.target;

    //maybe some nested element.. find the actual table cell parent.
    while (sender && sender.nodeName.toLowerCase() != "td")
        sender = sender.parentNode;

    var myId = sender.id;
    alert(myId);
}
​
您还必须显式传递事件:

onclick="move(event)"
请注意,当表格单元格具有嵌套元素时,它们将是“发送者”,因此要获取所需元素(即表格单元格),必须向上遍历。要避免所有这些麻烦,请参见下面如何通过代码附加处理程序

也就是说,更好的做法是通过代码而不是内联绑定click事件——不要将HTML与JavaScript混合使用。要实现这一点,请使用以下代码:

window.onload = function() {
    var arrCells = document.getElementsByTagName("td");
    for (var i = 0; i < arrCells.length; i++) {
        var oCell = arrCells[i];
        if (oCell.id && oCell.id.substr(0, 1) == "A") {
            oCell.onclick = move;
        }
    }
}
window.onload=function(){
var arrCells=document.getElementsByTagName(“td”);
对于(var i=0;i
有了上面的代码,您可以从HTML中删除内联的
onclick=
调用,并保留原始函数-
this
将指向单击的表格单元格


.

这就是它的工作原理,
这个
窗口
取代,而没有提供其他内容。您希望得到什么?仅供参考,
引用元素的函数位于引号内。基本上,
onclick=“move()”
.onclick=function(event){move();}
相同,您希望它的行为类似于
。onclick=move
实际上这给了我一个错误:
无法获取属性“target”的值:对象为null或未定义
这是IE9Ok当我按照@Shadow向导的建议显式传递事件时,错误消失了。谢谢
e.target
不一定与OP所针对的元素相同。@Tomcatom看到我更新的答案,并且-当单元格得到嵌套元素时,这样的代码将“失败”,并返回错误的ID。(顺便说一句,不是我的否决票-我认为这个答案没有错)@Tomcatom不,这是错误的<代码>oCell.onclick=move
是正确的方法,您可以在函数中使用
this
就可以了。
e.target
e.srcElement
不一定是具有处理程序的元素。它们表示接收事件的嵌套最深的元素。(我假设
元素有一些内容。)@user1689607可能是这样,但到目前为止它一直对我有效,在这种情况下它也应该可以正常工作。当然,如果
元素从来没有子代元素,它就可以工作。@user1689607哦,天哪。。(单击第一个单元格A1将显示D1)-需要编辑我的帖子。@Tomcatom:将首先调用
img
的处理程序。然后事件通过其祖先“冒泡”,并调用它在过程中找到的任何
onclick
事件。因此,
上的处理程序也将被调用。但是,如果需要的话,有一些方法可以在
处停止冒泡。现在就是这样做的方法+1如果将
事件
作为第二个参数传递给
.call()
,则可以使它变得更好。这样,即使是旧的IE也会像普通的处理程序一样在函数中获取事件对象!我不想通过添加
事件来混淆OP。我正在尝试一个超级简单的解决方案。你救了我一天;)谢谢!!
function move(e) {
    if (!e)
        e = window.event;
    var sender = e.srcElement || e.target;

    //maybe some nested element.. find the actual table cell parent.
    while (sender && sender.nodeName.toLowerCase() != "td")
        sender = sender.parentNode;

    var myId = sender.id;
    alert(myId);
}
​
onclick="move(event)"
window.onload = function() {
    var arrCells = document.getElementsByTagName("td");
    for (var i = 0; i < arrCells.length; i++) {
        var oCell = arrCells[i];
        if (oCell.id && oCell.id.substr(0, 1) == "A") {
            oCell.onclick = move;
        }
    }
}