Javascript IE innerHTML <select> - PullRequest
       47

Javascript IE innerHTML <select>

4 голосов
/ 16 августа 2010

Я пытаюсь изменить innerHTML элемента на основе значения предыдущего элемента.

У меня есть JavaScript, правильно получающий текущее значение, и все работает правильно в Firefox, Safari, Chrome и Opera IE это боль.

пример кода:

<form action="soap.php" method="post">
    <select name="circuitproduct" id="circuitproduct" onchange="bandwidthfunction();">
        <option>Dedicated Voice</option>
        <option>Frame Relay</option>
        <option>ATM</option>
        <option>Dedicated Internet</option>
        <option>IP Solutions Private Port</option>
        <option>IP Solutions Enhanced Port</option>
        <option>Private Line – Domestic</option>
        <option>Int’l Private Line</option>
        <option>Qwest Metro Private Line (QMPL)</option>
        <option>Qwest Metro Ethernet Private Line (QMEPL)</option>
    </select><br />
    <select name="term" id="term">
        <option value="1-Year">1-Year</option>
        <option value="2-Year">2-Year</option>
        <option value="3-Year">3-Year</option>
    </select>
    <select id="bandwidth">
    </select>
    <select id="sublooptype">
    </select>
</form>

образец JavaScript:

function bandwidthfunction() {
var product = document.getElementById('circuitproduct').value;
    if (product == 'Dedicated Voice') {
        document.getElementById('bandwidth').innerHTML = ('<option value="DS-1">DS-1</option><option value="DS-3">DS-3</option><option value="OC-3">OC-3</option><option value="OC-12">OC-12</option>');
        document.getElementById('sublooptype').innerHTML = ('<option value="Special Access">Special Access</option><option>CO MtPt - Special Access</option><option>CPA Special Access</option>');
    }
    else if (product == 'Frame Relay') {
        document.getElementById('bandwidth').innerHTML = ('<option value="DS-1">DS-1</option><option value="DS-3">DS-3</option><option value="OC-3">OC-3</option><option value="OC-12">OC-12</option>');
        document.getElementById('sublooptype').innerHTML = ('<option value="Special Access">Special Access</option><option>CO MtPt - Special Access</option><option>CPA Special Access</option>');
}

Ответы [ 7 ]

10 голосов
/ 17 августа 2010

Ну, во-первых, у вас есть закрывающий тег для select, который вы пытаетесь вставить в элемент select, что делает код недействительным.

Тогда может возникнуть проблемаэлемент select относится к его содержимому.Когда HTML-код анализируется, элемент select не имеет дочерних элементов, как обычный элемент.Вместо этого опции - это элементы в его коллекции options.

Если вы хотите изменить элементы в элементе select, измените содержимое его коллекции option.Т.е. для добавления предметов создайте option объекты с использованием метода document.createElement и добавьте в коллекцию.Пример:

var opt = document.createElement('OPTION');
opt.text = 'Choose me';
opt.value = 42;
document.getElementById('bandwidth').options.add(opt);
3 голосов
/ 17 августа 2010

Вы должны удалить элемент «select» и конец установки свойства innerHTML.Это не часть innerHTML.Это конечный тег самого элемента bandwith.

document.getElementById('bandwidth').innerHTML = ('<option value="DS-1">DS-1</option><option value="DS-3">DS-3</option><option value="OC-3">OC-3</option><option value="OC-12">OC-12</option>');
2 голосов
/ 27 сентября 2012

Вот полезный хак, с которым я столкнулся и который работает как в FF, так и в IE, как обходной путь к невозможности изменить innerHTML на выбранных элементах.

document.getElementById('bandwidth').outerHTML = document.getElementById('bandwidth').outerHTML.replace( document.getElementById('bandwidth').innerHTML + '</select>' , '<option value="DS-1">DS-1</option><option value="DS-3">DS-3</option><option value="OC-3">OC-3</option><option value="OC-12">OC-12</option>' + '</select>' );

или как функция для удобочитаемости:

function swapInnerHTML(objID,newHTML) {
  var el=document.getElementById(objID);
  el.outerHTML=el.outerHTML.replace(el.innerHTML+'</select>',newHTML+'</select>');
}
1 голос
/ 12 августа 2015

Я недавно сталкивался с этой проблемой в IE. Я нашел готовое решение, которое работает с учетом следующих факторов:

  • Вы не хотите использовать jQuery
  • Нужно, чтобы он работал в IE <9 </li>
  • Вы хотите добавить (не заменять существующие опции) строковые опции в существующий элемент select
  • Выбор должен быть типом "select-one"
  • Обернуть выделенные элементы в их собственный родительский элемент

У нас много целевых страниц, запрашивающих одну и ту же информацию (возраст, продукты, страна, штат и т. Д.), Но с различными вариантами выбора. Реализация, которую я использую, добавляет новые опции выбора. Это было сделано для того, чтобы разрешить настраиваемую опцию по умолчанию для каждой начальной страницы. Одна страница может иметь первую опцию «выбрать элемент», другая может иметь «выбрать одну» и т. Д.

Выберите формат:

<div>  <!-- you MUST wrap the select in a tag without any siblings -->
    <select name="age" id="form-age">
        <option value="">Choose Age</option>
    </select>
</div>  <!-- you MUST wrap the select in a tag without any siblings -->

Вот функция для добавления / добавления значений:

function addOptions(el, options){
    // checks to make sure element exists and is a select
    if(el && el.type === "select-one"){
        el.innerHTML = el.innerHTML + options;
        el.parentNode.innerHTML = el.outerHTML; // needed for IE
    }
}

Теперь для выполнения функции передайте в select объект и строковые значения:

addOptions(
    document.getElementById("form-age"), 
    '<option value="1">18-25</option><option value="2">26-35</option><option value="3">36-45</option><option value="4">46-55</option><option value="5">56-65</option><option value="6">66-75</option><option value="7">76-85</option><option value="8">86+</option>'
);

Это создаст выбор с переданными параметрами, даже в IE!

<div>  <!-- you MUST wrap the select in a tag without any siblings -->
    <select name="age" id="form-age">
        <option value="">Choose Age</option>
        <option value="1">18-25</option><option value="2">26-35</option><option value="3">36-45</option><option value="4">46-55</option><option value="5">56-65</option><option value="6">66-75</option><option value="7">76-85</option><option value="8">86+</option>
    </select>
</div>  <!-- you MUST wrap the select in a tag without any siblings -->

Если вам нужен сценарий для ЗАМЕНЫ значений, используйте следующее:

function replaceOptions(el, options){
    if(el && el.type === "select-one"){
        el.innerHTML = options;
        el.parentNode.innerHTML = el.outerHTML; // needed for IE
    }
}

Надеюсь, это поможет кому-то еще!

0 голосов
/ 21 октября 2014

использовать Jquery

$('#bandwidth').html('<option value="DS-1">DS-1</option><option value="DS-3">DS-3</option><option value="OC-3">OC-3</option><option value="OC-12">OC-12</option>');

0 голосов
/ 31 мая 2014

Реальная причина проблемы заключается в том, что из-за проблемы анализа / обновления DOM IE не будет вставлять дочерние элементы option в элемент select. Даже IE9 все еще имеет эту проблему (более поздние версии не проверены).

Вы должны поместить select в div или span и заменить целое select. Ниже вы найдете пример, который показывает, что тогда IE тоже будет играть в мяч. Поскольку эта проблема innerHTML обычно возникает при динамическом генерировании выборок, я сделал пример с AJAX и PHP.

HTML-файл:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Chain(ed) select with AJAX and PHP</title>
<style>
    select {
    min-width: 170px;
    }
    option.toSelect {
    background: yellow;
    }
</style>
</head>
<body>
    <form action="whatever.php">
        <span>
            <select id="cities" onchange="getOptions(this.value,'airlinesContainer')">
                <option value="">Select a city:</option>
                <option value="boston_airlines">Boston</option>
                <option value="chicago_airlines" class="toSelect">Chicago</option>
                <option value="newyork_airlines">New York</option>
            </select>
        </span>
        <span id="airlinesContainer">
            <select>
            </select>
        </span>
        <span id="classesContainer">
            <select>
            </select>
        </span>
    </form>
    <script>
        function getOptions(qValue,containerId) {
            var ajaxRequest = new XMLHttpRequest();
            if ((qValue == "") || (containerId == "")) {
                alert('Invalid selection.');
                return;
            }
            ajaxRequest.onreadystatechange = function() {
                if ((ajaxRequest.readyState == 4) && (ajaxRequest.status == 200)) {
                    document.getElementById(containerId).innerHTML = ajaxRequest.responseText;
                }
            }
            ajaxRequest.open("GET","getoptions.php?q="+qValue,true);
            ajaxRequest.send();
        }
    </script>
</body>
</html>

.

И файл php, который должен называться 'getoptions.php' и должен быть помещен в ту же папку:

<?php
$q = $_GET['q'];

$chicago_airlines ='
            <select id="airlines" onchange="getOptions(this.value,\'classesContainer\')">
                <option value="">Select an airline:</option>
                <option value="delta_classes">Delta</option>
                <option value="klm_classes" class="toSelect">KLM</option>
                <option value="united_classes">United Airlines</option>
            </select>';

$klm_classes ='
            <select id="classes">
                <option value="business">World Business Class</option>
                <option value="comfort">Economy Comfort</option>
                <option value="economy">Economy</option>
            </select>';

if ($q == 'chicago_airlines') {
    echo $chicago_airlines;
}
elseif ($q == 'klm_classes') {
    echo $klm_classes;
}
else {
    echo '<select>
              <option>Invalid selection</option>
          </select>';
}
?>

.

Обязательно выберите только варианты с желтым фоном в этой демонстрации.

0 голосов
/ 17 августа 2010

Быстрый поиск показывает, что это известная ошибка в IE , по крайней мере, IE5 .Вы можете попытаться использовать createElement и сделать опции и добавить к объекту select, или использовать библиотеку, такую ​​как jQuery, и добавить HTML к узлу (который должен позаботиться о магии, необходимой для работы в IE).

...