问题描述
我正在查看动态设置在我的应用程序中动态创建的 HTML Input 元素的 ID 属性。
我的实现在 Firefox 中使用 setAttribute 方法正常工作。对 IE 中的工作实现的任何想法或解决方案将不胜感激。
var hiddenInput = document.createElement("input");
hiddenInput.setAttribute("id", "uniqueIdentifier");
hiddenInput.setAttribute("type", "hidden");
hiddenInput.setAttribute("value", ID);
hiddenInput.setAttribute("class", "ListItem");
我修改了一些关于这个问题的博客的示例代码,提出以下的工作环境。 Firefox 位的工作原理很好,但是 IE 位不行
var hiddenInput = null;
try {
hiddenInput = document.createElement('<input name=''+"hiddenInputName"+'' />');
hiddenInput.id = "uniqueIdentifier";
//alert(document.getElementById("uniqueIdentifier"));
hiddenInput.type = "hidden";
} catch (e) { }
if (!hiddenInput || !hiddenInput.name) { // Not in IE, then
var hiddenInput = document.createElement("input");
hiddenInput.setAttribute("id", "uniqueIdentifier");
hiddenInput.setAttribute("type", "hidden");
}
干杯。
最佳解决方案
这个 code 在 IE7 和 Chrome 中工作:
var hiddenInput = document.createElement("input");
hiddenInput.setAttribute("id", "uniqueIdentifier");
hiddenInput.setAttribute("type", "hidden");
hiddenInput.setAttribute("value", 'ID');
hiddenInput.setAttribute("class", "ListItem");
$('body').append(hiddenInput);
也许在别的地方有问题?
次佳解决方案
忘记 setAttribute()
:它坏了,并不总是做你可能期望在旧的 IE(IE< = 8 和兼容性模式在以后的版本) 。改用元素的属性。这通常是一个好主意,不仅仅是为了这个特殊情况。将您的代码替换为以下内容,这将适用于所有主流浏览器:
var hiddenInput = document.createElement("input");
hiddenInput.id = "uniqueIdentifier";
hiddenInput.type = "hidden";
hiddenInput.value = ID;
hiddenInput.className = "ListItem";
更新
问题中第二个代码块中的恶意攻击是不必要的,上述代码在所有主流浏览器 (包括 IE 6) 中都可以正常工作。请参阅 http://www.jsfiddle.net/timdown/aEvUT/。您在 alert()
中获得 null
的原因是当它被调用时,新输入尚未在文档中,因此 document.getElementById()
调用找不到它。
第三种解决方案
使用 jquery attr 方法。它适用于所有浏览器。
var hiddenInput = document.createElement("input");
$(hiddenInput).attr({
'id':'uniqueIdentifier',
'type': 'hidden',
'value': ID,
'class': 'ListItem'
});
或者您可以使用以下代码:
var e = $('<input id = "uniqueIdentifier" type="hidden" value="' + ID + '" class="ListItem" />');
第四种方案
我不知道 IE 中的 setAttribute
有问题吗?但是,您可以直接在节点本身设置 expando 属性:
hiddenInput.id = "uniqueIdentifier";
第五种方案
When you need to set attributes that are also mapped to a JavaScript dot-property (such as href, style, src or event-handlers), favour that mapping instead.
所以,只要改变 id,值分配,你应该完成。
第六种方案
我遇到过同样的问题!我无法更改/设置元素的 ID 属性。它在所有其他浏览器中工作,但不是 IE 。这可能与您的问题无关,但这里是我最后所做的:
背景
我正在使用 jquery 选项卡构建一个 MVC 站点。我想动态创建选项卡,并对服务器执行 AJAX 回发,保存数据库中的选项卡。我想为标签使用一个 int 形式的唯一标识符,所以如果用户创建了两个具有相同名称的选项卡,我将不会遇到麻烦。然后,我使用唯一的 ID 来标识如下所示的选项卡:
<ul>
<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove List</span></li>
<ul>
当我在选项卡上实现删除功能时,回调使用索引,witch 为 0 。那么我无法将唯一的 ID 发送到服务器来垃圾 DB 条目。 tabremove 事件的回调给出了 jquery 事件和 ui 参数。使用一行代码,我可以得到跨度的 ID:
var dbIndex = event.currentTarget.id;
问题是 span 标签没有任何 ID 。所以在创建回调我试图设置 ID 购买从一个 href 提取的 ID 像这样:
ui.tab.parentNode.id = ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6);
这在 FireFox 中工作正常,但不在 IE 中。所以我尝试了另外几个:
//ui.tab.parentNode.setAttribute('id', ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6));
//$(ui.tab.parentNode).attr({'id':ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6)});
//ui.tab.parentNode.id.value = ui.tab.href.substring(ui.tab.href.indexOf('#list-') + 6);
他们都没有工作!所以经过几个小时的测试,Googeling 我放弃了并且得出结论,IE 不能动态地设置元素的 ID 属性。
我很伤心,这可能与你的问题无关,但我以为我会分享。
解
对于所有通过 Googleing 发现这个问题的人,我在这里的标签问题是我最终在 tabsremove 回调中解决问题的方法:
var dbIndex = event.currentTarget.offsetParent.childNodes[0].href.substring(event.currentTarget.offsetParent.childNodes[0].href.indexOf('#list-') + 6);
可能不是最性感的解决方案,但是它解决了这个问题。如果有任何人有任何意见请分享…
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。