【问题标题】:Can I make javascript run a function when it encounters an undefined element?当遇到未定义的元素时,我可以让javascript运行一个函数吗?
【发布时间】: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


【解决方案1】:

听起来你需要为你会得到的参考错误做一个 try/catch 吗?

try {
   var myVar = txtIngredient;
} catch (e) {
  if (e instanceof ReferenceError) {
  // code here
}

【讨论】:

  • 虽然这可能会奏效,但从查看对我的问题的编辑来看,将每个语句包装在 try catch 块中将是巨大的......我想基本上让专有代码失败,然后在错误处理程序,使用 getElementById 找到元素并重试失败。
  • 可怕的想法:尝试篡改 ReferenceError :)
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多