2010-01-21 3 views
4

Я пытаюсь использовать селектора атрибутов и CSS для форматирования элементов.Селекторы атрибутов, JavaScript и IE8

HTML, выглядит следующим образом:

<div id="user" highlight="false">User Name</div> 

CSS-это:

[highlight=true] 
{ 
    background-color: red; 
} 

[highlight=false] 
{ 
    background-color: white; 
} 

И затем есть некоторые сопровождающие JavaScript:

if(foo) 
{ 
    node.setAttribute('highlight', true); 
} 
else 
{ 
    node.setAttribute('highlight', false); 
} 

Это работает в Firefox и Chrome. Когда атрибут выделения изменяется с помощью JavaScript, цвет фона элемента изменяется соответствующим образом. Однако в IE8 это совсем другая история. Элемент будет отображаться правильно в соответствии с значением выделения, которое первоначально было назначено в HTML, но при динамическом изменении атрибута отображение элемента не изменяется.

Это известная причуда, и есть ли известная работа?

Обновление Я просто изменил имя атрибута на «frob» со значениями «on» и «off». Это должно решить любую проблему с зарезервированными или интерпретируемыми значениями.

Другие примечания. Когда я включаю инструменты разработчика IE8 и использую инспектор HTML, он покажет стиль [frob = on] или [frob = off], как это применимо для любого значения frob, когда я начал инспектор документов. Однако атрибут frob больше не будет изменяться в представлении инспектора. Ни в коем случае значения в [frob = on/off] css никогда не применяются после первоначального рендеринга HTML.

Обновление: проблема решена Решение состоит в том, чтобы заставить перерисовать. Существуют различные способы сделать это, но, похоже, стандартным является переназначение имени класса самому себе.

ответ

1

Вы устанавливаете атрибут JavaScript true и false, а не строку "true" и "false". Это может быть интерпретировано браузером как 1 и 0 и приводит к нежелательным результатам.

Вы можете попробовать

node.setAttribute('highlight', 'true'); 

?

+0

Изменение JavaScript для использования строковые формы не делают трюк. Спасибо хоть. –

+0

Хорошо. Можете ли вы по-прежнему попробовать что-то отличное от истинного или ложного, просто чтобы убедиться, что в нем нет парсинга? Работает ли он с известным допустимым атрибутом типа 'rel'? –

2

Вы используете неизвестный атрибут hightlight. Это IE, поэтому он поддерживает атрибуты в соответствии с его именем (что кажется сложнее, чем поддержка каждого имени атрибута, но ... это IE).

Просто используйте class="hightlight" - проще в применении и иметь дело с.

+0

Я менее сумасшедший в этом подходе, потому что я уже применил класс к div (не показан в исходном образце кода). Применение нескольких классов к узлу является менее элегантным решением. Конечно, селектора атрибутов будут еще менее изящными, если они требуют обходных решений, специфичных для браузера. –

+0

Использование атрибута class - путь, даже если применяется более одного класса. Возможно, это не элегантно с вашей точки зрения, но это не исключение. (Разделяйте 2 класса с одним пространством) – ZippyV

+0

Я также использую классы, так как они также будут работать в браузерах, которые пока не поддерживают селектора атрибутов. –

0

, чтобы избежать неизбежной проблемы с совместимостью между браузерами с javascript/css. Я бы рекомендовал использовать jQuery.

Например, чтобы выделить элемент через фреймворк jQuery, это все, что требуется ...

$("div").click(function() { 
     $(this).effect("highlight", {}, 3000); 
}); 
0

Убедитесь, что DOCTYPE, определенный в верхней части страницы: Css attribute selector for input type="button" not working on IE7

+1

Спасибо за подсказку. Тем не менее, у меня всегда есть DOCTYPE. Моя проблема заключалась не в том, что IE не оценивал селектор, а в том, что IE не запускал переоценку CSS на основе изменений атрибута. –

Смежные вопросы