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 では、「未定義または null 参照のプロパティ 'readOnly' を取得できません」というエラーが表示されます。

Chrome では、readOnly は、定義されている場合は「true」を返し、定義されていない場合は「false」を返します。IE は nodeName で動作しますが、エラーが発生します。

私が本当に混乱するのは、最後の行を変更して target.readOnly を削除することで機能させることができるということです。したがって、これは両方のブラウザで機能するようです...

var readonlycheck = event.srcElement.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

問題は短絡||オペレーターです。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 に答える
0

コードでは指定function(e)しますが、関数ではeventの代わりに使用しますe
さらに、event.target と event.srcElement は同じものであるため、最初にターゲットを 1 回開始する方が理にかなっています。

    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 に答える