<select> показывает только первый char выбранного параметра - программирование
Подтвердить что ты не робот

<select> показывает только первый char выбранного параметра

У меня есть стандартный блок выбора, который я заполняю с помощью jquery, добавляя параметры, но по какой-то причине IE9 показывает только первый символ выбранного параметра. Само собой разумеется, что он отлично работает в FireFox и Chrome, но я должен поддерживать IE9. Я пробовал режимы совместимости IE9, но это не имело никакого значения, и не стилизовало выбор или вариант.

Кто-нибудь видел эту проблему раньше. Что вызвало это? Как вы это исправили?

Example of problem in IE9

Упрощенный образец кода:

<select id="selectCCY" ValueColumn="ccyID" DisplayColumn="ccySymbol" ></select>



$.each(res.result, function (key, value) {  
    $('#selectCCY').append('<option value="' + value[$('#selectCCY').attr('ValueColumn')]+ '">' + value[$('#selectCCY').attr('DisplayColumn')] + '</option>');
});

res.result - это простой массив json, подобный этому:

[{"ccyID":1,"ccySymbol":"GBP"},{"ccyID":2,"ccySymbol":"AUD"},{"ccyID":3,"ccySymbol":"USD"}]

ОХОТНИК!!! он отлично работает в моем упрощенном примере, поэтому проблема находится где-то в другом месте. Сожалею. Исходный код длинный и сложный для вставки здесь, но сообщит вам, когда я найду ответ.

спустя некоторое время....

ОК, я получил проблему до вызова ajax внутри цикла $(selector).each(). Цикл проходит через все поля выбора и асинхронно заполняет параметры. Если я сделаю это синхронным вызовом, поля выбора имеют правильную ширину и будут отображаться правильно, но если его асинхронный вызов в блоках выбора показывает только первый char, как на изображении. все еще работая над этим, снова вернется к вам.

Я все еще хочу знать, что может вызвать неправильное отображение окна выбора. Я могу сделать обходные пути и получить его, чтобы показать правильно, но это не отвечает на вопрос. Это просто выбор с опциями в нем, он всегда должен работать, правильно?

после выходных, игнорируя проблему....

Правильно я нашел обходное решение. Перед выполнением вызова ajax для заполнения окна выбора я сначала установил свойство display css на "none" на нем, затем заполнил его, и, наконец, когда вызов ajax и заполнение будут завершены, я просто удалю свойство "none" css display.

Итак, я до сих пор не знаю, почему IE мне не нравится, но у нас есть решение хотя бы.

4b9b3361

Ответ 1

Это проблема только с IE. Сначала установите для свойства css display в поле выбора значение "нет", затем заполните его с помощью вашего вызова ajax, наконец, когда вызов ajax будет выполнен и поле выбора будет заполнено, удалите свойство "none" css display в поле выбора

Ответ 2

В моем случае у меня не было привязки к событию, чтобы скрыть выбор до запуска запроса ajax, поэтому мне пришлось принудительно выполнить перерисовку элемента select после факта. Повторное применение существующей ширины, похоже, работает:

$("select").width($("select").width());

Ответ 3

На основе ответа Джима я передаю раскрывающийся список в этот метод:

// force redraw to get around bug in IE.
// NOTE that this removes width from the style attribute.
function forceRedraw(jqueryObject) {
    jqueryObject.css('width', 0);
    jqueryObject.css('width', '');  // remove from style tag
}

Это работает вокруг ошибки в IE и оставляет ширину элемента, где он был до того, как был вызван метод, пока ширина указана в CSS, а не в атрибуте style.

Ответ 4

Я использую angularjs и также сталкиваюсь с этой проблемой в ie8/ie9 Этот подход/обходной путь работал на меня: например С html выглядит так:

<select ng-show="data.showSelect" ng-cloak ng-model="data.model" ng-options="l.id as l.name for l in data.items></select>

У меня этот код запускается после загрузки данных для выпадающего списка и устраняет проблему

$timeout(function(){$scope.data.showSelect = true;},100);

Я полагаю, вы могли бы также обернуть это в директиву, если у вас было несколько областей на сайте, нуждающихся в этом обходном пути.

Ответ 5

У меня были обратные вызовы в моем случае, поэтому установка отображения на none при заполнении не была для меня вариантом, однако я смог подробно рассказать о ответе @Daniel Brinks, чтобы исправить мою проблему. Оказывается, когда какой-либо элемент добавлен, и отображение изменено ни от одного на один, все будущие добавленные элементы будут в порядке.. с использованием jquery и в виджетах. Поэтому, если вы пытаетесь исправить виджет для работы в IE, это может быть полезно для вас..

в функции _create виджета:

this.availableFields = $("<select multiple='multiple' name='AvailableFields'></select>")
                                .addClass("ui-fieldselector-available-select")
                                .css("display", "none")
                                .appendTo( this.element );

в _init функции виджета:

buildAvailableItem - добавляет к выбору

затем добавьте в массив, который отслеживает состояние виджетов

var $this = this;
                //IE HACK Part 1--
                $this.buildAvailableItem("Loading...", "Loading..." );
                $this.availableList.push("Loading...");
                //----------------
    //do stuff, here I initialize some functionality, like drag and drop, add click events, etc.
                //IE HACK Part 2--
                $($this.availableFields).css("display", "");
                $this.removeAvailableOption("Loading...");
                //----------------
    // AJAX adding

Обычно я использую функцию addAvailableItem, которая обрабатывает создание элемента и добавление его в список, но также вызывает событие, и я не хотел, чтобы событие было инициировано для элемента "Загрузка...".

Если по какой-то причине кто-то использует очень медленный браузер, они будут видеть "Загрузка..." до его удаления и добавляются элементы ajax..

Если кто-то хочет получить более полную версию для копирования и вставки, сообщите мне

для справки здесь: элемент сборки:

buildAvailableItem: function (display, value)
        {
            $("<option>" + display + "</option>").val(value).appendTo(this.availableFields);
        },

Ответ 6

Добавив пару строк, следующие места (выделенные жирным шрифтом как **) в функции рендеринга selectDirective в angular.js отлично работали для меня. Я смотрю, есть ли какое-либо другое возможное решение, кроме исправления угловых значений JS или forEach ниже?

if (existingOption.label !== option.label) {
  lastElement.text(existingOption.label = option.label);
  **lastElement.attr('label', existingOption.label);**
}

и

  (element = optionTemplate.clone())
      .val(option.id)
      .attr('selected', option.selected)
      .text(option.label);
  **element.attr('label', option.label);**

Проблема заключалась в атрибуте метки HTMLOptionElement, который не совпадает с текстовым атрибутом, если в IE нет метки.

Это можно проверить, добавив следующий код после загрузки экрана и просмотрев веб-консоль FF и IE, чтобы увидеть разницу. Если вы раскомментируете последнюю строку, где метка установлена ​​в текст, она отлично работает. Альтернативно патч angular.js, как указано выше.

// This is an IE fix for not updating the section of dropdowns which has ng-options with filters
angular.forEach($("select"), function (currSelect) {
    console.log("1.text ", currSelect.options[currSelect.selectedIndex].text);
    console.log("1.label ", currSelect.options[currSelect.selectedIndex].label);
    //console.log("1.innerHTML ", currSelect.options[currSelect.selectedIndex].innerHTML);
    //console.log("1.textContent ", currSelect.options[currSelect.selectedIndex].textContent);
    //console.log("1.cN.data ", currSelect.options[currSelect.selectedIndex].childNodes[0].data);
    //console.log("1.cN.nodeValue ", currSelect.options[currSelect.selectedIndex].childNodes[0].nodeValue);
    //console.log("1.cN.textContent ", currSelect.options[currSelect.selectedIndex].childNodes[0].textContent);
    //console.log("1.cN.wholeText ", currSelect.options[currSelect.selectedIndex].childNodes[0].wholeText);
    //console.log("1. ", currSelect.options[currSelect.selectedIndex], "\n");

    //currSelect.options[currSelect.selectedIndex].label = "xyz";
    //currSelect.options[currSelect.selectedIndex].label = currSelect.options[currSelect.selectedIndex].text;
});

Ответ 7

Я только что исправил ту же проблему, изменив способ инициализации элемента select (динамически созданного в виджетах jQuery).

Пример A

Это не работает:

var select = $('<select size=7>') // IE9 'first character' bug

Это делает:

var select = $('<select>').attr('size', 7) // Yay

Пример B

Аналогично, следующее не работает:

self.element.append('<select name="mySelect">'); // IE9 'first character' bug

В то время как это будет:

var mySelect = $('<select>').attr('name', 'mySelect');
self.element.append(mySelect);

Заключение

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