【问题标题】:javascript function breaks drop-down menus but just in Firefoxjavascript 函数会破坏下拉菜单,但仅在 Firefox 中
【发布时间】:2012-01-05 03:59:53
【问题描述】:

由于某种原因,这个函数在 Firefox 中做了一些奇怪的事情

function fadeOUT_sect(id) {
    if ( $("div#"+id).css("display")!="none") {
        $("div#"+id).fadeOut();
        $("div#"+id).find("ul").each(function() {
            var name = $(this).attr("id");
            $(this).find("input").removeAttr("checked");
            if ( $(this).find("select > option:first").val() != "-9" ) {
                $(this).find("select > option:first").attr({
                    value:"-9",
                    selected:"selected"
                }); // $.attr()
            } // if select

            // I've isolated the problem to this if-test
            if ( !($(this).find('input[value="-9"]').val()) ) {
            //   ^ I think the problem is here.
                $(this).find('input[type="text"]').val('');
                $(this).append('<input name="'+name+'" type="radio" value="-9" checked="checked" />');
            } // if

        }); // $.each()
    } // if
} // function

最初,出现问题的 HTML 如下所示:

<div id="2" style="display:none">
<ul id="state">
    <li>What state do you live in?</li>
    <li><select>
        <option value="-9" selected="selected"></option>
        <option value="AL">Alabama</option>
        …
    </select></li>
</ul>

fadeIn() 之后,div#2 可见,第一个&lt;option&gt; 变为&lt;option value=""&gt;&lt;/option&gt;,当我单击下拉菜单时,我会看到所有选项。现在麻烦开始了:

当我选择一个选项时,下拉菜单消失,但条/气泡是空白的(我没有选择空白选项)。我再次单击下拉菜单,我的选项在列表中突出显示;我点击离开,栏/气泡再次空白。我第三次单击下拉菜单,选择空白选项,单击离开,单击返回,然后选择非空白选项,突然我可以在条形/气泡中看到文本。

问题发生在Mac和Windows上的Firefox(可能仅适用于Mac)中。在 Windows 或 Mac 中,以下任何一种都没有问题:Safari/Chrome、Opera、IE7+(IE6 根本无法显示页面)。

编辑我在多台计算机上的 Firefox、Safari/Chrome 和 Opera 中对此进行了测试,得到了相同的结果(因此没有缓存/数据问题)。

EDIT 2这是在 jsfiddle 中重现的问题:http://jsfiddle.net/JakobJingleheimer/EkDdB/3/

EDIT 3:我刚刚测试了 Firefox 版本 5 到 9,这个问题出现在 Firefox 8+ 中。在阅读 v8 的发行说明时,他们似乎开始对 javascript 使用“类型推断”(但我不知道这会如何影响任何事情,或者如果确实如此,如何绕过它)。

谢谢!

Resolution:在 html 中删除 selected="selected",并在 javascript/jQuery 中从 .attr({…}).removeAttr("selected") 中删除 selected:"selected"

【问题讨论】:

  • 拜托哦,请缓存您选择的元素! var $div = $('#' + id); $div.css..., $div.fadeOut..., 等。现在我看看能不能找到你的问题。
  • 在 jsFiddle 中设置它,我会仔细看看。
  • 上面的函数怎么调用?此外,它不会破坏它,但为什么你说 $("div#"+id) 而不是 $("#"+id)? (鉴于 id 是唯一的,“div”部分根本没有帮助。)
  • "2" 不是 html 元素的合法 ID。我不确定这是否是您的问题,但鉴于这是特定于浏览器的问题,似乎有可能。 stackoverflow.com/questions/70579/…
  • @jacob 这似乎对我在 Firefox 中工作得很好。你用的是什么版本?

标签: javascript jquery html function firefox


【解决方案1】:

我可以在 Firefox 8.0.1 for Mac 上重现该错误。

问题出在我在下面注释掉的那一行。

function fadeIN_sect(id) {
    $("#" + id + ' > ul > input[value="9999"]').remove();
    //$("#" + id + " > ul > li > select > option:first").attr("value", "").removeAttr("selected");
    $("#" + id).fadeIn();
}

一旦我评论了这条线,它就可以正常工作。您可以尝试分隔行并一次调试每个操作。

编辑:测试似乎指向 removeAttr 调用。同样如上面的 cmets 所述,不要忘记缓存所有选择器。一直选择它们是非常低效的。

【讨论】:

  • 是的!那是selected="selected"。我不确定是 javascript removeAttr("selected") 还是 html 有 selected="selected",但是从 html 中删除硬编码属性后,我不需要 javascript。 (我已经硬编码了selected,所以我不必依赖浏览器选择默认选择哪个元素)。谢谢!! +50
  • 哦,顺便说一句,你知道我该怎么做吗?
  • @jacob 我很确定浏览器不会选择除第一个值以外的任何内容?你有其他证据吗?
  • 我的问题是我隐藏了select,我需要强制选择的选项回到第一个(以防用户选择了不同的选项)。
  • @jacob 只需将 selectedIndex 设置为 0。您可以使用 jQuery 执行此操作,如下所示 stackoverflow.com/questions/1314245/…
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 2013-09-03
  • 2023-03-14
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多