dポイントプレゼントキャンペーン実施中!

JavaScriptのfunction内で、event.srcElementの値の上書きする方法についてご存知の方がいれば教えていただけないでしょうか?

普通に「event.srcElement = document.getElementById("a");」(※1)等と書くとスクリプトエラーが発生してしまいます。
※1 例えば事前に<input type="text" id="a" value="aval" />等をBody内に定義しています。


やりたいことは、IE6(SP2)で、JsUnitという(JUnitのJavaScript版)単体テストツールを使用した、JavaScriptの単体テストを行っているのですが、テスト対象のfunction内でevent.srcElementを参照しており、event.srcElementを入力条件の1つとして有効値、無効値の各種パターン(例えば、undefined、null、inputタグElement、selectタグElement等)を検証するために値を動的に設定することです。

プロジェクトの単体テストで可能な限りJsUnitを使用する方針があるのですが、無理なら例外的にJsUnitを使用せずにテストと思っているので、困り具合はそれほど高くありません。


よろしくお願いいたします。

A 回答 (2件)

document.getElementById("a").fireEvent("onclick") で #a を srcElement とする "click" が発火します。



また、elt.onclick のようなレガシープロパティではなく attachEvent() または HTML の onclick 属性を使っており、かつイベントハンドラがイベントオブジェクトを第一引数に受け取るようきちんと定義しているなら、

handleEvent({ type: 'click', srcElement: null })

のような疑似イベントオブジェクトを渡すだけで、テストとしては十分機能するのではないでしょうか。仮に外からイベントハンドラが見えないとしても、JScript には条件コンパイルがあるので、

//@cc_on@set@test=1
(function () {
 function handleEvent (e) {
  var se = e.srcElement;
 }
 
 //@if(@test)window.handleEvent = handleEvent;@end
}) ();

function testHoge() {
 handleEvent({ srcElement: undefined });
}

のようにテスト時だけ API を生やせば良い。テストが終わって @test=0 にすれば、その行は完全にコメントとして無視されます。これのおかげで、IE は非常にテスト・トレースしやすい環境のはずです。
    • good
    • 0
この回答へのお礼

「fireEvent」で解決しました。
引数なしのイベントハンドラであるため後者の方法は使えませんが、条件コンパイルについては知らなかったので、勉強になります。

ちょうどJsUnitによるテスト時のみ有効にしたいfunction等があったので、活用できそうなら活用してみます。

ありがとうございました。

お礼日時:2011/05/01 16:20

event.srcElement は読み込み専用です。

別の値を書き込むことは出来ません。
http://msdn.microsoft.com/ja-jp/library/cc410014 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!