1

我不确定我是否理解我正在工作的这个脚本中 IE 的行为。这是我正在使用的脚本的一部分,似乎在 Chrome 中运行良好

$(document).keydown(function (event) {
    var keyvalue = event.which || event.keyCode; 
    var eventtarget =  event.srcElement.nodeName || event.target.nodeName; 
    var readonlycheck = event.srcElement.readOnly || event.target.readOnly;
}); 

问题出现在 readonlycheck 变量上。在 IE 中,我收到“无法获取未定义或空引用的属性 'readOnly'”的错误。

在 Chrome 中,如果已定义,则 readOnly 返回“true”,如果未定义,则返回“false”。IE 给我一个错误,即使它仍然适用于 nodeName。

我真正感到困惑的是,我可以通过更改最后一行来消除 target.readOnly 来使其工作。所以这似乎适用于两种浏览器......

var readonlycheck = event.srcElement.readOnly;

谁能解释为什么 readOnly 的行为不同?另外,我认为 srcElement 只是 IE,那么为什么 Chrome 在没有 target.readOnly 的情况下仍然可以工作?

任何帮助,将不胜感激。我对 javascript 和 jquery 还是很陌生,所以我确定我错过了一些东西。

4

3 回答 3

2
var readonlycheck = event.srcElement.readOnly || event.target.readOnly;

应该将其更改为

var readonlycheck = (event.srcElement !== undefined) ? event.srcElement.readOnly : event.target.readOnly;

您如何编写代码,即使 srcElement.readOnly 确实存在,但当它评估为 false 时,它​​会尝试读取 event.target,这会破坏 IE。

于 2013-03-14T19:02:23.913 回答
0

在您的代码中,function(e)尽管您在函数中指定使用event而不是e.
此外,由于 event.target 和 event.srcElement 是同一件事,因此在开始时启动一次目标会更有意义。

    var target = event.target || event.srcElement;    

将您的代码更新为类似于以下内容应该可以工作:

$(document).keydown(function (event) {
    var target = event.target || event.srcElement;    

    var keyvalue = event.which || event.keyCode; 
    var eventtarget =  target.nodeName; 
    var readonlycheck = target.readOnly;
}); 
于 2013-03-14T19:04:52.980 回答
0

问题是短路||运算符。如果event.srcElement.readOnly计算结果为false,则将计算正确的操作数(应该是)e.target.readOnly。和写法一样,例如:

var readonlycheck = false || e.target.readOnly;

您可以改用大括号来解决此问题:

var readonlycheck = (e.target || event.srcElement).readOnly

请注意,我将符合标准的标准移至左侧,以便首先对其进行评估。它在这里并没有太大的区别,但是在更耗时的操作中它可以,所以我只是发现这是一个很好的实践。

当我需要事件对象和事件目标时,我使用以下代码启动大多数事件处理程序:

function evtHandler(evt) {
    evt = evt || window.event;
    var target = evt.target || evt.srcElement;
}
于 2013-03-14T19:06:34.573 回答