背景
我继承了一个古老的 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>