【问题标题】:Why do textfields become disabled in IE6 for no reason?为什么文本字段在 IE6 中无缘无故被禁用?
【发布时间】:2010-01-06 17:56:49
【问题描述】:

我对这个巨大的 JSF 页面进行了一些更改,该页面也充满了 Javascript。我不知道是哪个更改导致问题发生。

问题是:在执行一些 Javascript 后,页面中的所有文本字段都变为只读。该问题在 IE7 和 Firefox 中均未发生。我已经调试了所有的javascript,没有抛出错误!并且没有什么告诉这些字段变成只读的,因为它在 IE7 中正常工作。

不确定是什么问题,可能与 CSS 相关吗?还是Javascript?为什么它只发生在 IE6 上?

注意:“不支持 IE6 不是一个选项”

【问题讨论】:

  • 听起来您需要“取消”您的更改并将它们一一添加回来,直到找到破坏它的那个。
  • 并祈祷它不会被两个变化的组合破坏。

标签: javascript internet-explorer-6


【解决方案1】:

虽然 IE 在某些情况下可能会出现问题,但我很确定这不是 IE 错误。

你怎么知道这些字段是只读的?您是否得到任何光学确认,或者只是您无法再单击它们?在这种情况下,我敢打赌,它是某种不可见的 DIV 或其他布局元素,由于某些 CSS 设置,它会挤在输入字段上方。

试试IE developer toolbar 看看是否是布局问题。

如果它们真的像<input disabled> 那样被禁用,则需要显示一些 JavaScript 或(更好)链接。

【讨论】:

  • 你有什么解释为什么它在 IE7 和 FF 上运行良好吗?将检查不可见的 div,但我无法共享代码,对不起,它是一个 Intranet 应用程序。
  • 输入是否被禁用(= 变灰)或不可点击?
【解决方案2】:

仍然不确定那个构建发生了什么,但我可以肯定的是我所做的所有 Ajax 修改都是导致问题的原因。

场景是这样的:

  1. 填充 textfield1(点击 getValues1,然后点击 validate Ajax)
  2. 填充 textfield2(点击 getValues2 ,然后同时点击 validate 两个值)
  3. 填充 textfield3(点击 getValues3 ,然后点击 validate 对所有三个值)

第四次再次出现同样的情况。该页面是由 JSF 新手构建的,非常庞大。我花了很长时间重构它。但现在好多了,每个文本字段仍然有一个 getValues Ajax,但不是在获取所有值后验证它们,而是通过发送选择的条件过滤服务器上允许的值

现在的情景:

  1. 填充 textfield1(点击 getValues1 Ajax)
  2. 填充 textfield2(使用值为 1 的 getValues2 Ajax,并且只获取允许的值)
  3. ...等

问题似乎是 Ajax 竞速条件,在某些时候 IE6 挂起或陷入僵局,我不确定。

经验教训,“重构一次可能需要一周时间,但没有每个问题会花费更长的时间”

【讨论】:

    【解决方案3】:

    嗯...不支持IE6??? ;)

    建议禁用 CSS 并查看问题是否消失。不过,我不知道任何可以禁用字段的 CSS 标记。

    除此之外,调试是您唯一的选择。删除所有 .js 并逐行添加,直到出现问题。

    如果不看一些代码,我们可能很难为您提供帮助。

    【讨论】:

    • 您的字段是默认启用(在 html 中)还是禁用?如果您使用脚本手动启用这些字段,那应该是您开始搜索的好地方。查找和禁用页面上的每个控件并不是偶然发生的事情——尤其是偶然发生的事情。
    • 这个页面真的很大很复杂,一半的字段开始禁用,其他的启用。但是,随着页面中的许多 Ajax 命中,一切都可能发生变化。
    【解决方案4】:

    查看页面的 HTML 是否在这些 INPUT 元素上设置了“禁用”属性。如果是这样,则在页面加载后使用 javascript 启用 元素。这是一种常见的技术,可以防止用户在所有脚本加载之前过早地尝试与页面交互。

    如果发生了这种情况,那么您可能所做的就是破坏脚本识别需要启用哪些元素的方式。由于这只发生在 IE6 上,听起来脚本可能正在执行一些深奥的 DOM 导航,由于标记或 CSS 的更改而中断。

    不幸的是,您必须通过恢复到以前的版本进行调试,直到您确定您所做的更改破坏了页面。

    【讨论】:

      【解决方案5】:

      根据此处的其他答案以及您对他们的一些 cmets,您的页面中似乎有一个 JavaScript 函数可以将元素设置为启用或禁用。

      为了提供帮助,我们必须查看您的代码。不过,您可以自己做以下事情来解决您的问题:

      1. 找到将页面中的元素设置为禁用或启用的函数(或任何函数)。
      2. 根据您的开发环境,有不同的方法可以执行此操作,但会以某种方式在函数处添加断点。
      3. 加载页面。
      4. 无论何时调用该函数,代码执行都会在该函数处停止。每当它停止时,请确保它应该被调用(并观察调用堆栈)。

      最终,您会在不应该到达的点处到达断点。查看调用堆栈以了解导致它的原因(哪个函数导致调用此函数)。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多