JavaScript 在 IE9 中随机失败/包含 DIV 的 FORM 标记在 IE9 中过早关闭

JavaScript Failing in IE9 Randomly / FORM Tag Containing DIV Closing Prematurely in IE9

问题的主要要点是随机命令似乎在 IE9 中不起作用,或者只是偶尔起作用。在其他页面上运行的命令就好了。

我已经排除了一些我不需要的东西,所以现在页面上只有两个 javascript。一个是jQuery 2.0.3,一个是页面主动作脚本:

$(function()
    {
    $("#lib").addClass("this_page");

    $(".output").each(convert_values);

    $("form .input_class").keyup(convert_values);
    $("form .input_class").change(convert_values);
    $(".swap").click(function($e)
        {
        var $form = $(this).closest("form");        
        var $input_value = $form.find(".input_units").val();
        var $output_value = $form.find(".output_units").val();
        $form.find(".input_units").val($output_value);
        $form.find(".output_units").val($input_value).change();
        $e.preventDefault();
        });
    });


function convert_values()
    {
    var $form = $(this).parent();
    var $input = $form.find(".input").val();
    $form.find(".input").removeClass("input_error");
    var $input_units = $form.find(".input_units").val();
    var $output_units = $form.find(".output_units").val();
    var $result = 0;

    if ($input == "") { $input = "0"; }

    console.log("data-type='"+$form.attr("data-type")+"'");
    if ( $form.attr("data-type") == "temp" )
        {
        switch ( String($input_units) + String($output_units) )
            {
            case "fc":
                $result = (Number($input) - 32) * (5/9); break;
            case "fk":
                $result = ((Number($input) - 32) * (5/9)) + 273.15; break;
            case "cf":
                $result = (Number($input) * 1.8) + 32; break;
            case "ck":
                $result = Number($input) + 273.15; break;
            case "kc":
                $result = Number($input) - 273.15; break;
            case "kf":
                $result = ((Number($input) - 273.15) * 1.8) + 32; break;
            default:
                $result = $input;
            }
        }
    else
        {
        console.log("("+$input+" / "+$output_units+") * "+$input_units);
        $result = (Number($input) / Number($output_units)) * Number($input_units);
        }

    if (isNaN($result))
        {
        //play_a_sound("snd_fail");
        $form.find(".input").addClass("input_error");
        $result = "Input Error";        
        }

    $form.find(".output").val($result);
    }

这个结果很奇怪。我的 convert_values( ) 函数在页面加载时被调用了几次,它似乎工作正常。但是当您在页面加载后通过单击选择来调用它时,它不起作用。

更具体地说,

var $input = $form.find(".input").val();
var $input_units = $form.find(".input_units").val();
var $output_units = $form.find(".output_units").val();

这三行在脚本加载后运行了几次。但稍后在脚本中, $output_units 在调用函数时未定义。这个函数和事件处理程序用于处理几个不同的单独 HTML 表单,这就是为什么没有特定的 ID,只有 类 和 $(this) 基于标识符的原因。但是为什么这些命令中的 2 个可以工作,而第三个却不行呢?为什么有时候能用,其他时候不行。

此外,可能在此之前,还有此检查:

if ( $form.attr("data-type") == "temp" )

大部分表格没有这个属性。并且处理正常。但是在页面的中间,一个表单确实有这个属性。但是IE9还是returns"undefined"从此。 IE9 确实支持 HTML5 数据属性,所以没有明显的原因说明它不起作用。

根据我当前登录到控制台的内容,您可以看到前三个值何时正常工作,以及其中一个何时中断且不起作用。当 IE9 错过 data-type="temp" 属性时,同样的调试日志记录也会向您显示,因为您最终在数学中得到了字符串,因为程序流没有针对这种特殊情况进行重定向。

如此随机、完全有效的命令似乎无缘无故地失败了。但该行为是 100% 可重复的。在目前的情况下,我在 IE9 的 JS 控制台中没有收到任何相关错误。好像我的代码中有什么东西导致 IE9 失控,但我不知道它是什么。

有问题的网页在这里: http://www.whatsmyip.org/lib/unit-converter/

该页面的 javascript 文件位于: http://www.whatsmyip.org/js/tools/lib/unit-converter.js

页面上的每个转换器都是它自己的 FORM 标签,"Temperature" 表单是带有数据类型属性的,IE9 似乎无法读取。在它无法读取之后,似乎 THEN 它也开始无法读取 $form.find(".output_units").val();虽然它以前可以很好地阅读。

尽管我讨厌所有 IE,但我还没有准备好放弃 IE9。我网站上几乎每个页面上都有很多脚本,但这是我遇到的唯一问题。所有其他页面都很好用。我在虚拟机中进行了大量的 Beta 测试。

P 标签不能包含块级项目。我原来的 HTML 包含很多这样的表格:

<p>
<form>
      blahblah
      <div>Divider</div>
      dfasdfasdf
</form>

尽管 FORM 是一个块标签,但此代码是有效的,因为 P 是自关闭标签,因此 FORM 关闭了 P。但是 在 IE9 中,具体而言,此设置会导致FORM 标记进入我将称之为 "function-like-shit-mode" 的位置,其中 FORM 内的任何块项目都将关闭 FORM,然后是 P.

这个错误,在我的特定代码中,导致我的一半表单元素呈现在表单的外部。这只有在我开始摆弄 CSS 的所有东西时才清楚。在我的表单周围画了一个边框,看看,只有一半的表单元素在边框内!

所有这一切的结果是,我的 Javascript 无法找到它需要的所有值,因为我通过在 FORM 中搜索特定的 类 来找到 SELECT。现在更奇怪的是,它可以正确处理大多数 onLoad 表单,但之后会失败。就好像 FORM 正确呈现了一秒钟,然后 "snapping" 回到有问题的版本,排除了一半的项目。

所以总而言之,我删除了每个FORM标签前面的P标签,现在IE9在功能上已经完全正常了。我的表单现在可以毫无问题地包含 DIV。