2013-03-14 29 views
1

我不确定我是否理解IE正在工作的脚本中的行为。这是脚本的一部分,我用这似乎在ChromeInternet Explorer中的srcElement.readOnly和target.readOnly问题

$(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中,如果它的定义和“假”,如果它不是只读返回“true”。 IE给我一个错误,即使它仍然与nodeName一起工作。

从哪里获得真的很困惑的是,我可以把它改变的最后一行,以消除target.readOnly工作。因此,这似乎是在这两种浏览器工作...

var readonlycheck = event.srcElement.readOnly; 

任何人都可以解释为什么这表现不同对于只读?另外,我认为srcElement只是IE浏览器,那为什么Chrome仍然没有target.readOnly工作?

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

+1

你真的用争论'e'声明你的功能和使用'event'? – 2013-03-14 19:05:11

+0

你是对的。我的错在那里。我会在原文中进行更改。 – 2013-03-14 20:33:34

回答

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; 
}); 
+0

这对我来说很奇怪,因为我原本有 event.target || event.srcElement 但由于某些原因,IE 10不喜欢它,除非我切换它们。 我真的很喜欢在开始的时候发起目标事件。谢谢! – 2013-03-14 19:30:59

+0

我也将其更改为功能(事件) – 2013-03-14 20:34:44

+0

此解决方案非常适合我目前所做的工作。谢谢! – 2013-03-15 06:06:11

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

应将其更改为

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

你怎么写你的代码,即使srcElement.readOnly确实存在,当计算结果为假它试图event.target阅读,它打破IE。

+0

以上回答你的问题,但理想情况下,你应该做'var target = event.target || event.srcElement;'然后从那里出发 – psychobunny 2013-03-14 19:05:04

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; 
} 
+0

这实际上对我来说完全有意义。谢谢你解释。我觉得我应该知道,首先,但是,就像我说的,我对此非常陌生。 – 2013-03-14 19:33:48

+0

@ut_markle:我们都是从新开始的,被这样的东西困住了:-)不要忘了你可以将答案标记为已接受,并且一旦你达到15个代表就投票。 – 2013-03-14 22:11:49

+1

谢谢@Andy E:有一天我会明白这一切。 – 2013-03-15 14:50:39