1

背景

我继承了一个古老的 Web 应用程序,该应用程序具有使用老式 HTC(HTML 组件)脚本定义的自定义行为的输入控件,例如:

<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>

所以,到目前为止,没有什么不寻常的。此外,我有一些 JS 可以在 DOM-ready 上运行:

$(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"

当然,一旦页面完成渲染(或者文档实际准备就绪所需的任何时间段),验证功能就会按预期工作(因为我在 change 和 blur 事件上调用相同的验证函数出色地)。也就是说,当在 jQuery 的 on-DOM-ready 函数之外调用该函数时,它工作得很好。

你们中有人对这里可能发生的事情有任何想法吗?jQuery 的“ondomready”是否在 HTC 脚本的“ondomready”之前注册?我可以以某种方式更改该顺序吗?

我目前在所有版本的 IE 中都看到了这种行为。

编辑:解决方法

我发现了一个解决方法。如果您将函数调用从 jQuery 就绪函数中取出并将其扔到页面末尾,它就可以工作(即:)

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

2 回答 2

0

我不知道 HTC 是否计入页面就绪,但我怀疑他们没有。

您可能会尝试在 HTC hase 完成后检查仅是 tru 的内容。

然后,您自己的脚本应该像这样开始:

function MyFunction() {

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

//the rest of your code

}

如果在测试成功之前不满足条件,这基本上可以让您在 100 毫秒内进行功能检查和重新启动。

如果 HTC sciprts 在 2 秒后未加载,您还可以添加一个计数器参数,每次尝试触发一些超时代码时将其增加一个

于 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 回答