【发布时间】:2017-05-26 09:00:23
【问题描述】:
我正在维护一个非常旧的 Web 窗体应用程序,它与 IE6 兼容的 javascript 粘合在一起。这意味着可以在 JS 中访问元素,而无需先初始化。
我的意思是使用它是“有效的”:
txtIngredient.value = 'potato';
为了让它在较新的浏览器(如 Chrome、Firefox 等)中运行,此代码变为:
document.getElementById('txtIngredient').value = 'potato';
很明显,Chrome、Firefox等在遇到前一条语句时会抛出一个未定义的错误,并且JS由于引发的异常而停止执行。
目前我正在运行代码并将其移植以使其看起来更像后者,但我想知道,我是否可以编写一个错误处理程序来处理未定义的错误,当这些情况发生时它会捕获,然后以某种方式返回该元素,如果它在 DOM 中找到它并重新尝试该语句?如果是这样,这将节省大量工作。
编辑:例如:
此代码不起作用:
function ShrinkDetails() {
document.Form1.btnExpand.value = "+ Dispense Details";
trDateDispensed.style.display = "none";
trDuration.style.display = "none";
trStartDate.style.display = "none";
trRepeats.style.display = "none";
trQuantity.style.display = "none";
}
Chrome 等在 document.Form1 上抛出未定义的错误。
此代码可以工作:
function ShrinkDetails() {
document.getElementById('btnExpand').value = "+ Dispense Details";
document.getElementById('trDateDispensed').style.display = "none";
document.getElementById('trDuration').style.display = "none";
document.getElementById('trStartDate').style.display = "none";
document.getElementById('trRepeats').style.display = "none";
document.getElementById('trQuantity').style.display = "none";
}
【问题讨论】:
-
如果在代码运行时该 ID 存在,为什么会抛出错误并不明显。提供minimal reproducible example
-
这取决于代码。您可以检查它是否等于 undefined 以及是否尝试在 dom 中查找元素并返回它。但是插入代码所花费的时间与重写代码所花费的时间大致相同。我想你可以做一些花哨的 try catch 块,但我必须查看更多代码才能提供帮助
-
@charlietfl “如果代码运行时该 ID 存在,为什么它会抛出错误并不明显” - 真的吗?我认为要访问 DOM 中的元素,您需要通过 document.getElementById 对其进行初始化。显然,在 IE6 中,您可以直接从 DOM 中取出东西而不使用它,但这是适当的,不再是东西了(这真的很好)。
-
真正的问题是元素为什么不存在?如果它们是在页面加载后插入的,您需要确保在它们确实存在之前不查询它们。此外,由于您使用
jQuery标记了它......使用它可以解决所有潜在的错误 -
@charlieftl 我认为我们彼此误解了:) DOM 中确实存在元素,但在 IE6 中,您可以通过它们的 ID 调用它们,这与使用 getElementById 相同(ish)。元素存在于 DOM 中,但在 JS 中没有被正确引用。这有意义吗?
标签: javascript jquery internet-explorer-6