Проблема с ScriptManager. RegisterClientScriptBlock и jQuery в Internet Explorer 8

Вы можете явно использовать тип enum в качестве аргумента функции или конструктора, ограничивая вызывающую сторону использованием этого перечисления. То, что вы не можете сделать тривиально, это объединить несколько определений перечислений так, как вы предлагали.

Вы можете написать несколько конструкторов, по одному для каждого из перечислений Европа, Азия и т. Д., Но это будет работать, особенно если у вас есть ряд функций, которые должны принимать эти перечисления в качестве аргументов.

- ИЛИ -

Вы можете определить одно большое перечисление и определить разделители с фиксированными значениями для каждой подгруппы, чтобы вы могли сравнить значение перечисления с этими защитными значениями, чтобы идентифицировать подгруппу. Вы потеряете подгруппу, если вы это сделаете. Вы могли бы использовать инициализаторы константного перечисления c ++ 11 для конструирования членов-значений перечисления в подклассах для каждого континента - но учтите, что они доступны только для enum class из c ++ 17 (поэтому я использую трюк с вложенным классом для предоставления пространства имен члена принудительное выполнение - в c ++ 17 вы могли бы иметь enum class Location - вы можете написать это в c ++ 11, но тогда вы не сможете выполнить инициализаторы const). Значения следуют приведенному выше правилу разделителей, но для получения имен вызывающие должны косвенно обращаться через подклассы.

class Country
{
  class Location {
    enum Value { 
      None =0,
      Europe = 0x0100,
      Asia =   0x0200,
      //etc
    };
  };

  struct Asia {
    const Location::Value Japan { Location::Asia + 1 };
    //etc
  };
  struct Europe {
    const Location::Value UnitedKingdom { Location::Europe + 1 };
    //etc
  };
  // etc
};

Тогда вы можете получить

class myClass {
public:
  myClass(Country::Location::Value v);
};

И позвонить с помощью

myClass instance(Country::Asia::Japan);

- ИЛИ -

Вы можете определить другой Структура, единственная цель которой состоит в том, чтобы взять различные перечисления и преобразовать их в пару значений для индекса континента и страны. Затем вы можете использовать эту структуру в качестве параметра функции и разрешить автоматическое преобразование из этой структуры. Это означает, что вы выполняете преобразование только один раз, и вызывающие к вашему коду не влияют. Вы можете использовать защитные диапазоны так, что вам не нужно явно хранить код континента, просто необработанный номер страны будет уникальным для всех ваших перечислений.

8
задан Stefan Filip 9 May 2009 в 20:34
поделиться

1 ответ

Эта проблема возникает из-за того, что IE8 ожидает, что все элементы DOM будут загружены до того, как будут внесены изменения в DOM. Мне удалось продублировать описанную вами проблему с помощью jGrowl.

Чтобы исправить это, я просто изменил ваш сценарий так, чтобы вызов jGrowl происходил после того, как документ будет готов. Вот обновленный код:

ScriptManager.RegisterClientScriptBlock(this, typeof(Page), 
     Guid.NewGuid().ToString(),
     "$(function(){$.jGrowl('" + message + "');});", true);
12
ответ дан 5 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: