1

バックグラウンド

昔ながらの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>
4

2 に答える 2

0

HTCがページレディにカウントされるかどうかはわかりませんが、カウントされないのではないかと思います。

あなたが試みるかもしれないことは、HTCが終わった後にだけtruである何かをチェックすることです。

自分のスクリプトは、次のように開始する必要があります。

function MyFunction() {

 if(!HTCIsreadyTest()) {
    setTimeout(MyFunction, 100);
return;
}

//the rest of your code

}

これにより、基本的に、テストが成功するまで条件が満たされない場合、100ミリ秒で機能チェックと再起動が可能になります。

また、HTC sciprtsが2秒後にロードされなかった場合に、タイムアウトコードトリガーを試行するたびに1ずつ増やすカウンター引数を追加することもできます。

于 2012-07-12T23:06:36.880 に答える
0

私が見つけた最も簡単な回避策は、検証関数の呼び出しをjQueryready()コールバックから移動し、ページの最後に移動することでした。

...
    <script type="text/javascript">
        txtFiscalYearEndDay_Validate(document.getElementById('txtFiscalYearEndDay'));
    </script>
</body>
</html>

しかし、私はもっとエレガントな解決策を見つけました。すべてのページリソースが読み込まれるのを待つ必要があるように思われるため、関数呼び出しをjQueryready()コールバックから移動し、代わりにウィンドウload()コールバックに配置する必要がありました。

$(window).load(function() { // instead of $(function() {
    txtFiscalYearEndDay_Validate(document.getElementById('txtFiscalYearEndDay'));
});

私は後者を使用しているので、すべてのJSコードをまとめることができます。

于 2012-07-13T15:02:27.973 に答える