Как динамически создать переключатель в Javascript, который работает во всех браузерах?

Динамическое создание переключателя с использованием, например,

var radioInput = document.createElement('input');
radioInput.setAttribute('type', 'radio');
radioInput.setAttribute('name', name);

работает в Firefox, но не в IE. Почему нет?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
26
0
96 539
11

Ответы 11

На основе этого сообщения и его комментариев: http://cf-bill.blogspot.com/2006/03/another-ie-gotcha-dynamiclly-created.html

следующие работы. По-видимому, проблема в том, что вы не можете динамически установить свойство name в IE. Я также обнаружил, что вы также не можете динамически устанавливать атрибут 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.

Ваше здоровье.

Ответ Патрика работает, или вы также можете установить атрибут defaultChecked (это будет работать в IE для радио или элементов флажка и не вызовет ошибок в других браузерах.

PS Полный список атрибутов, которые нельзя установить в IE, приведен здесь:

http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html

Сделав шаг из того, что предлагает Патрик, используя временный узел, мы можем избавиться от 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 заранее и обрабатывает другие атрибуты, с которыми IE также имеет проблемы, извлеченные из DOMBuilder:

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 также обрабатывает регистрацию прослушивателя событий и спецификацию дочерних узлов.

почему бы не создать ввод, установить стиль на display: none, а затем при необходимости изменить отображение таким образом вы также, вероятно, сможете лучше справляться с пользователями без js.

Лично я бы сам не создавал ноды. Как вы заметили, существует слишком много проблем, связанных с конкретным браузером. Обычно я использую Builder.node от script.aculo.us. Используя это, ваш код станет примерно таким:

Builder.node('input', {type: 'radio', name: name})

Быстрый ответ на более старый пост:

Сообщение выше Roundcrisis в порядке, ЕСЛИ И ТОЛЬКО ЕСЛИ вы знаете количество переключателей / флажков, которые будут использоваться заранее. В некоторых ситуациях, рассматриваемых в этой теме «динамическое создание переключателей», количество элементов управления, которые потребуются пользователю, неизвестно. Кроме того, я не рекомендую «пропускать» перехват ошибок «try-catch», поскольку это позволяет упростить обнаружение будущих реализаций браузера, которые могут не соответствовать текущим стандартам. Из этих решений я рекомендую использовать решение, предложенное Патриком Уилксом в его ответе на свой вопрос.

Это повторяется здесь, чтобы избежать путаницы:

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

Мое решение:

html
    head
        script(type='text/javascript')
            function createRadioButton()
            {
               var newRadioButton
                 = document.createElement(input(type='radio',name='radio',value='1st'));
               document.body.insertBefore(newRadioButton);
            }
    body
        input(type='button',onclick='createRadioButton();',value='Create Radio Button')

Динамически создаваемый переключатель в javascript:

<%@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”RadioDemo.aspx.cs” Inherits=”JavascriptTutorial.RadioDemo” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title></title>
<script type=”text/javascript”>

/* Getting Id of Div in which radio button will be add*/
var containerDivClientId = “<%= containerDiv.ClientID %>”;

/*variable count uses for define unique Ids of radio buttons and group name*/
var count = 100;

/*This function call by button OnClientClick event and uses for create radio buttons*/
function dynamicRadioButton()
{
/* create a radio button */
var radioYes = document.createElement(“input”);
radioYes.setAttribute(“type”, “radio”);

/*Set id of new created radio button*/
radioYes.setAttribute(“id”, “radioYes” + count);

/*set unique group name for pair of Yes / No */
radioYes.setAttribute(“name”, “Boolean” + count);

/*creating label for Text to Radio button*/
var lblYes = document.createElement(“lable”);

/*create text node for label Text which display for Radio button*/
var textYes = document.createTextNode(“Yes”);

/*add text to new create lable*/
lblYes.appendChild(textYes);

/*add radio button to Div*/
containerDiv.appendChild(radioYes);

/*add label text for radio button to Div*/
containerDiv.appendChild(lblYes);

/*add space between two radio buttons*/
var space = document.createElement(“span”);
space.setAttribute(“innerHTML”, “&nbsp;&nbsp”);
containerDiv.appendChild(space);

var radioNo = document.createElement(“input”);
radioNo.setAttribute(“type”, “radio”);
radioNo.setAttribute(“id”, “radioNo” + count);
radioNo.setAttribute(“name”, “Boolean” + count);

var lblNo = document.createElement(“label”);
lblNo.innerHTML = “No”;
containerDiv.appendChild(radioNo);
containerDiv.appendChild(lblNo);

/*add new line for new pair of radio buttons*/
var spaceBr= document.createElement(“br”);
containerDiv.appendChild(spaceBr);

count++;
return false;
}
</script>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>
<asp:Button ID=”btnCreate” runat=”server” Text=”Click Me” OnClientClick=”return dynamicRadioButton();” />
<div id=”containerDiv” runat=”server”></div>
</div>
</form>
</body>
</html>

(источник)

Одинокая ссылка - считается плохим ответом, поскольку сама по себе бессмысленна, и не гарантируется, что целевой ресурс будет активен в будущем. Пожалуйста, постарайтесь включить хотя бы краткое изложение информации, на которую вы ссылаетесь.

j0k 12.09.2012 16:20

Привыкает ли containerDivClientId?

HeyWatchThis 14.11.2013 20:50

for(i=0;i<=10;i++){
   var selecttag1=document.createElement("input");
   selecttag1.setAttribute("type", "radio");
   selecttag1.setAttribute("name", "irrSelectNo"+i);
   selecttag1.setAttribute("value", "N");
   selecttag1.setAttribute("id","irrSelectNo"+i);

   var lbl1 = document.createElement("label");
   lbl1.innerHTML = "YES";
   cell3Div.appendChild(lbl);
   cell3Div.appendChild(selecttag1);
}

Добро пожаловать в stackoverflow. Вы можете добавить пояснение к своему ответу.

Olivier De Meulder 22.10.2015 16:14

Другие вопросы по теме