バックグラウンド
昔ながらのHTC(HTMLコンポーネント)スクリプトで定義されたカスタム動作の入力コントロールを持つ古いWebアプリケーションを継承しました。例:
<input name="txtFiscalYearEndDay" type="text" value="30"
maxlength="2" size="5" id="txtFiscalYearEndDay" class="Text1"
style="behavior:url(/path/js/InFocus.htc);" />
この問題を説明するために、このHTCファイルの関連部分を次に示します。
<PUBLIC:COMPONENT tagName="InFocus">
<PUBLIC:METHOD NAME="setValid" />
<PUBLIC:ATTACH EVENT="ondocumentready" HANDLER="initialize" />
<SCRIPT LANGUAGE="javascript">
function initialize() {
// attaches events and adds CSS classes, nothing fancy
}
function setValid(bInternal) {
// checks some flags and changes a label
}
</SCRIPT>
</PUBLIC:COMPONENT>
したがって、これまでのところ、異常なことは何もありません。さらに、DOM対応で実行されるJSがいくつかあります。
$(function() {
txtFiscalYearEndDay_Validate(document.getElementById('txtFiscalYearEndDay'));
});
そして検証機能:
function txtFiscalYearEndDay_Validate(el) {
...
}
注:使用していないのは、要素$('#txtFiscalYearEndDay')
を実際に呼び出すことができないためです。setValid(true);
また、実行する必要もありません$('#txtFiscalYearEndDay')[0].setValid(true);
。
問題
検証関数のある時点で、HTCスクリプトによって追加された要素のメソッドを呼び出そうとしています。
el.setValid(true);
しかし、IEデバッガーは悲しくなりsetValid()
、関数ではないと文句を言います。デバッガーでそれを検査すると、これが確認されます。
typeof el.setValid // "unknown"
もちろん、ページのレンダリングが完了すると(または、ドキュメントが実際に準備できるまでに必要な期間が経過すると)、検証関数は期待どおりに機能します(変更イベントとぼかしイベントで同じ検証関数を呼び出しているため)良い)。つまり、関数がjQueryのオンDOM対応関数の外部で呼び出された場合、正常に機能します。
ここで何が起こっているのかについて何かアイデアはありますか?jQueryの「ondomready」はHTCスクリプトの「ondomready」の前に登録されていますか?どういうわけかその順序を変更できますか?
現在、IEのすべてのバージョンでこの動作が見られます。
編集:回避策
回避策を発見しました。jQueryready関数から関数呼び出しを取り出してページの最後にスローすると、機能します(つまり:)
...
<script type="text/javascript">
txtFiscalYearEndDay_Validate(document.getElementById('txtFiscalYearEndDay'));
</script>
</body>
</html>