2011-01-31 70 views
43

我正在寻找动态设置在我的应用程序中动态创建的HTML Input元素的ID属性。在IE中动态设置输入元素的id属性:替代setAttribute方法

我的实现可以在Firefox中使用setAttribute方法。任何想法或解决方案在IE中的工作实现将不胜感激。

var hiddenInput = document.createElement("input"); 
    hiddenInput.setAttribute("id", "uniqueIdentifier"); 
    hiddenInput.setAttribute("type", "hidden");      
    hiddenInput.setAttribute("value", ID); 
    hiddenInput.setAttribute("class", "ListItem"); 

我修改了一些与这个问题有关的博客示例代码,提示以下workround。再次,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");      

      } 

干杯。

+0

你测试哪个版本的IE? – gor 2011-01-31 15:14:42

+0

Internet Explorer 8 – Terman 2011-01-31 15:35:18

+1

什么不工作?是否有错误讯息?出了什么问题? – 2011-01-31 15:51:28

回答

60

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); 

也许问题别的地方?

4

我没有意识到在IE中setAttribute有问题吗?然而,你可以直接设置节点本身的expando属性:

hiddenInput.id = "uniqueIdentifier"; 
6

使用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" />'); 
2

documentation说:

当你需要设置也被映射到一个JavaScript点属性的属性(如href,style,src或event-handlers),而是支持该映射。

因此,只要改变ID分配,你应该做的。

58

忘记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()调用找不到它。

2

我有同样的问题!我无法更改/设置元素的ID属性。它适用于所有其他浏览器,但不适用于IE。这可能是不相关的问题,但这里是我落得这样做:

背景

我是建设一个MVC的网站使用jQuery的标签。我想动态创建选项卡,并执行AJAX回发到保存数据库中的选项卡的服务器。我想为标签使用一个唯一的标识符(以int的形式),所以如果用户创建了两个具有相同名称的标签,我不会遇到麻烦。然后我使用的唯一ID来标识类似的选项卡:

<ul> 
<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close'>Remove List</span></li> 
<ul> 

当我然后执行上回调使用该索引的选项卡的删除功能,女巫是基于0。然后我无法将唯一ID发送回服务器以垃圾回收数据库条目。 tabremove事件的回调给出了jquery事件和UI参数。用一行代码我可以得到范围的ID:

var dbIndex = event.currentTarget.id; 

问题是span标签没有任何ID。因此,在创建回调我试图设置ID购买从这样的A 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); 

可能不是最性感的解决方案,但嘿它解决了这个问题。如果有人有任何输入,请分享...