如何在Javascript中动态创建在所有浏览器中都可以使用的单选按钮?
使用例如动态创建单选按钮
var radioInput = document.createElement('input');
radioInput.setAttribute('type', 'radio');
radioInput.setAttribute('name', name);
在Firefox中有效,但在IE中无效。为什么不?
解决方案
根据这篇文章及其评论:
http://cf-bill.blogspot.com/2006/03/another-ie-gotcha-dynamiclly-created.html
以下作品。显然问题是我们无法在IE中动态设置name属性。我还发现我们也不能动态设置checked属性。
function createRadioElement( name, checked ) {
var radioInput;
try {
var radioHtml = '<input type="radio" name="' + name + '"';
if ( checked ) {
radioHtml += ' checked="checked"';
}
radioHtml += '/>';
radioInput = document.createElement(radioHtml);
} catch( err ) {
radioInput = document.createElement('input');
radioInput.setAttribute('type', 'radio');
radioInput.setAttribute('name', name);
if ( checked ) {
radioInput.setAttribute('checked', 'checked');
}
}
return radioInput;
}
我的建议是不要使用document.Create()。更好的解决方案是构造将来的控件的实际HTML,然后将其像innerHTML一样分配给某个占位符,它允许浏览器呈现它自己,这比任何JS DOM操作都快得多。
干杯。
帕特里克(Patrick)的答案有效,或者我们也可以设置" defaultChecked"属性(这将在IE中用于单选或者复选框元素,并且不会在其他浏览器中引起错误。
PS这里列出了我们无法在IE中设置的属性的完整列表:
http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html
从Patrick的建议中走出一步,使用临时节点,我们可以摆脱try / catch的问题:
function createRadioElement(name, checked) {
var radioHtml = '<input type="radio" name="' + name + '"';
if ( checked ) {
radioHtml += ' checked="checked"';
}
radioHtml += '/>';
var radioFragment = document.createElement('div');
radioFragment.innerHTML = radioHtml;
return radioFragment.firstChild;
}
这是一个更通用的解决方案示例,它可以预先检测IE并处理从DOMBuilder中提取的IE也存在问题的其他属性:
var createElement = (function()
{
// Detect IE using conditional compilation
if (/*@cc_on @*//*@if (@_win32)!/*@end @*/false)
{
// Translations for attribute names which IE would otherwise choke on
var attrTranslations =
{
"class": "className",
"for": "htmlFor"
};
var setAttribute = function(element, attr, value)
{
if (attrTranslations.hasOwnProperty(attr))
{
element[attrTranslations[attr]] = value;
}
else if (attr == "style")
{
element.style.cssText = value;
}
else
{
element.setAttribute(attr, value);
}
};
return function(tagName, attributes)
{
attributes = attributes || {};
// See http://channel9.msdn.com/Wiki/InternetExplorerProgrammingBugs
if (attributes.hasOwnProperty("name") ||
attributes.hasOwnProperty("checked") ||
attributes.hasOwnProperty("multiple"))
{
var tagParts = ["<" + tagName];
if (attributes.hasOwnProperty("name"))
{
tagParts[tagParts.length] =
' name="' + attributes.name + '"';
delete attributes.name;
}
if (attributes.hasOwnProperty("checked") &&
"" + attributes.checked == "true")
{
tagParts[tagParts.length] = " checked";
delete attributes.checked;
}
if (attributes.hasOwnProperty("multiple") &&
"" + attributes.multiple == "true")
{
tagParts[tagParts.length] = " multiple";
delete attributes.multiple;
}
tagParts[tagParts.length] = ">";
var element =
document.createElement(tagParts.join(""));
}
else
{
var element = document.createElement(tagName);
}
for (var attr in attributes)
{
if (attributes.hasOwnProperty(attr))
{
setAttribute(element, attr, attributes[attr]);
}
}
return element;
};
}
// All other browsers
else
{
return function(tagName, attributes)
{
attributes = attributes || {};
var element = document.createElement(tagName);
for (var attr in attributes)
{
if (attributes.hasOwnProperty(attr))
{
element.setAttribute(attr, attributes[attr]);
}
}
return element;
};
}
})();
// Usage
var rb = createElement("input", {type: "radio", checked: true});
完整的DOMBuilder版本还处理事件侦听器注册和子节点规范。
为什么不创建输入,请将样式设置为显示:无,然后在需要时更改显示
这样,我们还可以更好地处理用户,而不是js。
我个人不会自己创建节点。我们已经注意到,存在太多针对浏览器的问题。通常我使用script.aculo.us中的Builder.node。使用它,代码将变成这样:
Builder.node('input', {type: 'radio', name: name})
快速回复旧帖子:
Roundcrisis的上述帖子很好,如果并且仅如果我们知道,我们将事先使用单选框/复选框控件的数量。在某些情况下,通过"动态创建单选按钮"这一主题解决了用户所需的控件数量未知。此外,我不建议"跳过"" try-catch"错误陷阱,因为这样可以方便地捕获将来可能不符合当前标准的浏览器实现。在这些解决方案中,我建议使用Patrick Wilkes在回答自己的问题时提出的解决方案。
为了避免混淆,在此重复此步骤:
function createRadioElement( name, checked ) {
var radioInput;
try {
var radioHtml = '<input type="radio" name="' + name + '"';
if ( checked ) {
radioHtml += ' checked="checked"';
}
radioHtml += '/>';
radioInput = document.createElement(radioHtml);
} catch( err ) {
radioInput = document.createElement('input');
radioInput.setAttribute('type', 'radio');
radioInput.setAttribute('name', name);
if ( checked ) {
radioInput.setAttribute('checked', 'checked');
}
}
return radioInput;}

