【问题标题】:IE6 not changing attributes (id and name) with jQuery attr call - any suggestions?IE6 不使用 jQuery attr 调用更改属性(id 和名称) - 有什么建议吗?
【发布时间】:2011-01-13 05:29:52
【问题描述】:

除了转储 IE6 之外的其他建议...我无法控制 :)

我正在尝试做的事情的简要概述:我有一个带有选择元素的表单。当用户在选择中选择特定选项(下面代码中的 id type2)时,我会显示一个包含新选择的 div 结构。我希望新的 div 结构及其子结构是现有结构 (id pdProgramDiv1) 的克隆,因为我使用 php 填充 div 中的选择。克隆选择后,我需要更改克隆的 id 和 div 的名称及其子标签并选择,因为表单信息正在传递给我的提交 php 脚本。如果它们没有唯一的 id,那么虽然它们被序列化为查询字符串,但 php 中的 $_POST 数组只包含给定 id 的最后一个值。

我已经包含了在 Firefox 中完美运行的代码sigh,并且无法更改 IE6 中的 ID 和名称。这段代码可能不像某些代码那么简洁;我对 jQuery 还是很陌生。

$('#type2').change(function() {
    if ($('#type2 option:selected').text() == 'Program Director') {
        $('#pdProgramDiv1').clone().attr({id: 'pdProgramDiv2', name: 'pdProgramDiv2'}).appendTo($('#type2Div'));

        $('#pdProgramDiv2 > #pdProgram1').attr({id: 'pdProgram2', name: 'pdProgram2'});

        $('#pdProgramDiv2 > label').attr('for', 'pdProgram2');
    } else {
        $('#pdProgramDiv2').hide();
    }
}); 

我环顾四周,尝试使用变量而不是链接,以及对 attr 的单独调用而不是使用对象文字(或映射),但没有任何帮助。所有变体在 FF 中都可以正常工作,但在 IE6 中没有任何乐趣。

这是一个已知问题吗,或者谁能告诉我如何进行更改?

如果我不能让它工作,我想我将不得不创建所有元素并隐藏它们,但这似乎不太好。

一如既往地提前致谢!

更新:已解决

非常感谢那些发现我的方式错误的人。我想发布最终解决问题的代码。正如我在对下面接受的答案的评论中所说,修复非常有意义。有点不好意思没看到,但有时候需要一双新鲜的眼睛!唯一的变化是选择子选择而不是选择 ID,并删除 div 上的名称 attr 分配,因为如上所述,它什么都不做。

$('#type2').change(function() {
    if ($('#type2 option:selected').text() == 'Program Director') {
        $('#pdProgramDiv1').clone()
            .attr('id', 'pdProgramDiv2')
            .appendTo($('#type2Div'));

        $('#pdProgramDiv2 > select').attr({
             id: 'pdProgram2', 
             name: 'pdProgram2'});

        $('#pdProgramDiv2 > label').attr('for', 'pdProgram2');
    } else {
        $('#pdProgramDiv2').hide();
    }
}); 

【问题讨论】:

  • 等等你在说什么?!? IE6 中的错误?
  • 感谢您修复我的代码格式。我仍然缺少一些东西。

标签: jquery internet-explorer-6 attr


【解决方案1】:

我认为你的问题在这里......

$('#type2').change(function() {
    /* snip */
        $('#pdProgramDiv1').clone().attr({id: 'pdProgramDiv2', name: 'pdProgramDiv2'}).appendTo($('#type2Div'));

        $('#pdProgramDiv2 > #pdProgram1').attr({id: 'pdProgram2', name: 'pdProgram2'});
    /* snip */
});

您正在克隆容器、切换它的 ID 并将其重新插入到页面中。容器很好,但页面现在包含两个 ID 为 #pdProgram1 的元素。 document.getElementById 不会喜欢这样的。

重构代码以通过标签而不是 ID 搜索选择元素。

【讨论】:

  • 我有点困惑。我认为在克隆调用之后但在 appendTo 之前调用 .attr 会在影响 Dom 之前更改 id 和 name。当我在萤火虫中调试时,这就是我所看到的。正如我所料,生成的 HTML 具有所有唯一的 id。您是否建议我因为 IE 而按标签选择?
  • 它改变了 div 的 ID 和名称,是的。 (但是,呃,div 没有名称,所以这不会做任何事情。)它不会更改 div 内的<select id="pdProgram1"> 的 ID。一旦你将它插入到文档中,你就会得到两个具有一个 ID 的元素,并且任何事情都可能发生。在将其放回文档之前,您需要更改所有 ID。
  • 抱歉。我想是明白你的意思。您认为我的第二行找不到选择,因为在那一刻有两个。所以我会 $('#pdProgramDiv > select').attr(...) 等第二行?我会试试看。抱歉,这是来自我的 iPhone。错别字见谅。
  • 漂亮!这完美无缺。非常感谢 bbonifield 和 bobince!这也是有道理的。鉴于修复对我来说非常有意义,我现在想知道为什么我的原始代码在 FF 中工作?如果我可以关闭他的循环,我明天会发布工作代码。再次感谢。
【解决方案2】:

我相信你刚刚遇到了 IE6 的问题,因为它处理节点克隆的能力很差,如果有的话。它在修复克隆元素的名称和 id 方面确实失败了......

更多信息here

【讨论】:

  • 所以没有 jQuery 方法让它工作?啊。我希望有人会得到其中一个“哦,你只需要这样做......”的答案:) 我想我唯一的选择是创建它们并隐藏它们。蛮力,但它必须这样做。我没有在链接网站上看到答案。也许我错过了它?
猜你喜欢
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2011-01-06
  • 2010-09-23
  • 2013-06-21
  • 2012-11-04
  • 2012-12-28
  • 2021-03-06
相关资源
最近更新 更多