1

Тема: JS Скрипт не работает если контейнер TD

Во всех нормальных браузерах работает, но они меня не интересуют, потом это будет HTA.
Не работает в ИЕ и только если контейнером служит таблица. XP SP2 IE6 и XP SP3 IE8.
Вот готовый файл, кому не лень посмотрите, что происходит с верхней кнопкой.
Вариант с картинками предлагать не нужно.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title>Кто не дружит с головой</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<style type="text/css"><!--
.R0, .R1, .R2, .R3, .R4, .R5, .R6, .R7, .U2, .U3, .U4, .U5, .U6, .U7 {border-style:solid; overflow:hidden; height:1px; border-color:blue;}
.R0, .R1 {margin:0 6px;}
.R2, .R3, .U2, .U3 {margin:0 5px;}
.R4, .U4 {margin:0 4px;}
.R5, .U5 {margin:0 2px;}
.R0, .R1 {background:green;}
.R2, .R3, .R4, .R5, .R6, .R7, .R8 {background:gainsboro;}
.U2, .U3, .U4, .U5, .U6, .U7, .U8 {background:bisque;}
.R0, .R1, .R3, .R8, .U3, .U8 {border-width:0 2px 0 2px;}
.R2, .R4, .R7, .U2, .U4, .U7 {border-width:0 3px 0 3px;}
.R5, .U5 {border-width:0 4px 0 4px;}
.R6, .U6 {border-width:0 5px 0 5px;}
.R8, .U8 {color:#800000; font:italic 600 100% "Courier New", Monospace; border-color:green; border-style:solid; text-align:center;}
.curP {cursor:pointer; margin:0 5px;}
--></style>
<script type="text/javascript"><!--
function mousOver(){
var obj, l=2, i=7;
obj=this.getElementsByTagName("div")
while(l!=9){obj[l].className='U'+l; l++;};
while(l!=15){obj[l].className='U'+i; i--; l++;};
 };//
//
onload=function(){
var obj, el, el1, l, i, s;
obj=document.getElementsByTagName("div");
l=obj.length;
while(l--){
if(obj[l].className.indexOf("R8")==0){
el=obj[l].parentNode;
s=el.innerHTML;
el.innerHTML="";
el=el.appendChild(document.createElement("div"));
el.className="curP";
el.onmouseover=mousOver;
i=0;
while(i!=8){el.appendChild(document.createElement("div")).className='R'+i; i++;};
el.innerHTML+=s;
while(i--){el.appendChild(document.createElement("div")).className='R'+i;}}};
 };//
--></script>
</head>

<body>

<br><br><br>
<table border="0" width="100%" cellpadding="0" cellspacing="0"><tr><td>
<div><div class="R8">Ввод</div></div>
</td></tr></table>
<br>
<div><div class="R8">Ввод</div></div>
<br>
<div><div class="R8">Ввод</div></div>



</body>
</html>

2

Re: JS Скрипт не работает если контейнер TD

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

( 2 * b ) || ! ( 2 * b )

3

Re: JS Скрипт не работает если контейнер TD

Rumata пишет:

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

Вы видимо не запускали. У него проблема с кнопкой первой.

Нас невозможно сбить с пути, нам пофигу куда идти.

4

Re: JS Скрипт не работает если контейнер TD

Если брать в общем, то проблема получается там, где в качестве контейнера таблица.
Кнопок в реальности больше десятка, и все они в таблицах, по другому просто не получается эти кнопки разложить как надо.

И что ни кто не знает?

5

Re: JS Скрипт не работает если контейнер TD

DnsIs
Я не спроста спросил. Важнее знать что ожидается в результате, вместо исправлений в том, что уже есть. Смысл? Очень вероятно, что есть лучшее, более оптимальное решение.

Любитель
Читая код, я не понял, что он делает, а подробное объяснение помогло бы понять замысел. Я испробовал тестовый код. К сожалению, мне по прежнему не понятно.

Верно ли, что Вам необходимо имитировать "переливающиеся кнопки" при перемещении указателя мыши поверх текста? Количество изменяемых объектов значения не имеет. Реальный рабочий код должен работать с любым количеством объектов. Дайте пожалуйста, подробное объяснение. Только в таком случае Вы получите быструю помощь.

( 2 * b ) || ! ( 2 * b )

6 (изменено: DnsIs, 2011-09-06 21:11:25)

Re: JS Скрипт не работает если контейнер TD

2Rumata, загадка какая то. Пощупал код, пришел к моменту. Берем HTA:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<title>Кто не дружит с головой</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<style type="text/css">
.R0, .R1, {border-style:solid; overflow:hidden; height:1px; border-color:red; margin:0 6px;}
.R0, .R1 {background:green;}
.R8, .U8 {background:gainsboro;}
.R0, .R1, .R3, .R8, .U3, .U8 {border-width:0 2px 0 2px;}
.R8, .U8 {color:#800000; font:italic 600 100% "Courier New", Monospace; border-color:green; border-style:solid; text-align:center;}
.curP {cursor:pointer; margin:0 5px;}
</style>
<script type="text/javascript">
onload=function(){
    obj=document.getElementsByTagName("div");
    l=obj.length;
    while(l--){
        if(obj[l].className.indexOf("R8")==0){
            el=obj[l].parentNode;
            s=el.innerHTML;el.innerHTML="";
            i=0;
            while(i!=2){el.appendChild(document.createElement("div")).className='R'+i; i++;};
            el.innerHTML+=s;
            while(i--){el.appendChild(document.createElement("div")).className='R'+i;}
        }
    };
 };
</script>
</head>

<body>

<br>
<table border=0 width="100%" cellpadding=0 cellspacing="0"><tr><td>
    <div><div class="R8">Ввод1</div></div>
</td></tr></table>
<br>
<table border=0 width="100%" cellpadding=0 cellspacing="0"><tr><td>
<div>
    <div class="R0"></div>
    <div class="R1"></div>
    <div class="U8">Ввод2</div>
    <div class="R1"></div>
    <div class="R0"></div>
</div>
</td></tr></table>

<br>
<div><div class="R8">Ввод3</div></div>
<br>
</body>
</html>

2 блок, глючит. Добавим, казалось бы неважный alert('');

.....
    while(i--){el.appendChild(document.createElement("div")).className='R'+i;}
    alert('');
.....

и все отрабатывает по другому. Я сломал голову.

Нас невозможно сбить с пути, нам пофигу куда идти.

7

Re: JS Скрипт не работает если контейнер TD

Верно ли, что Вам необходимо имитировать "переливающиеся кнопки" при перемещении указателя мыши поверх текста? Количество изменяемых объектов значения не имеет. Реальный рабочий код должен работать с любым количеством объектов. Дайте пожалуйста, подробное объяснение. Только в таком случае Вы получите быструю помощь.

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


DnsIs, спасибо за попытку.


загадка какая то.

Я день потратил чтобы понять, что не работает именно в таблице и это понимание пришло совершенно случайно. Просто в таком поведении браузера нет логики.
Ндааа, только почему то разработчики ИЕ со мной не согласны.:D

8

Re: JS Скрипт не работает если контейнер TD

Почитайте эту статью - http://www.xiper.net/collect/html-and-c … r-fix.html. Это - то, что Вам нужно в данном случае. Вот пример, написанный по мотивам темы. Полагаю, этого будет достаточно, чтобы реализовать требуемое. Если возникнут вопросы - задавайте.


<html>
<head>

<style type="text/css">

.hover, 
h1.hoverable:hover, 
h2.hoverable:hover	{
	background-color: #999;
}

</style>

<!--[if IE]>
<style type="text/css">

.hoverable	{

behavior: expression(
	onmouseover = function()
	{
		this.className += ' hover';
	}, 
	onmouseout = function()
	{
		this.className = this.className.replace(' hover', '');
	}
);

}

</style>
<![endif]-->

</head>
<body>

<h1 class="hoverable">H1 (Hoverable)</h1>
<h1>H1 (Normal)</h1>
<h2 class="hoverable">H2 (Hoverable)</h2>
<h2>H2 (Normal)</h2>

</body>
</html>
( 2 * b ) || ! ( 2 * b )

9

Re: JS Скрипт не работает если контейнер TD

2Rumata, Вопросы возникли.

Я с вами полностью согласен и никогда бы так не писал код. ИМХО дурацкие костыли, ради сомнительного эффекта.

Но я подошел к решению с другой стороны. Не "нафига тебе все это надо, сделай проще". Меня заинтересовало то, почему IE так странно реагирует, как простой код.

Вы пробовали запускать мой пример?
Вопрос: Как "alert();", влияет на отображение элемента? Я не пойму.
Запустите пожалуйста, не поленитесь. Мне действительно стало интересно.

Нас невозможно сбить с пути, нам пофигу куда идти.

10

Re: JS Скрипт не работает если контейнер TD

Да, я пробовал. У меня МСИЕ 7. С Вашим примером проблем не было. Пример автора темы вызывает проблемы - mouseover над блоком в таблице "расширяет" ячейку. Здесь скорее проблема с CSS, чем JavaScript. Надо посмотреть еще.

( 2 * b ) || ! ( 2 * b )

11

Re: JS Скрипт не работает если контейнер TD

Если Вам необходимо создать что-то с закругленными углами без использования картинок, то обратите внимание на этот раздел - http://htmlbook.ru/faq/theme/skruglennye-ugolki. Там есть несколько подходящих статей по теме.

( 2 * b ) || ! ( 2 * b )

12

Re: JS Скрипт не работает если контейнер TD

Rumata, спасибо.
Статью на xiper знаю, тут я сильно пролетел. Вечно  про этот ховер забываю. Код забрал, буду пробовать.

Статья на htmlbook делает то же самое теми же средствами. Только у меня углы обратные и радиус больше. Вот и вся разница.


Меня заинтересовало то, почему IE так странно реагирует

Именно это и спрашивал. Надеюсь что получил немного больше.

Всем спасибо.

13

Re: JS Скрипт не работает если контейнер TD

Rumata, всё это хорошо, но моих знаний не хватило прицепить предоставленный код к моим кнопкам.
Стили то менять нужно не одному ДИВу.

14

Re: JS Скрипт не работает если контейнер TD

Любитель пишет:

Rumata, всё это хорошо, но моих знаний не хватило прицепить предоставленный код к моим кнопкам.
Стили то менять нужно не одному ДИВу.

А зачем вам, простите, такой дурацкий стиль? Старайтесь делать проще.

Нас невозможно сбить с пути, нам пофигу куда идти.

15

Re: JS Скрипт не работает если контейнер TD

Если честно, то Ваше желание - эмулировать кнопки с помощью div - странно. Кнопка функциональна и проста. Неужели вся игра затеяна лишь для того, чтобы отобразить кнопку с "впуклыми" уголками? Добейтесь вначале нормального функционирования приложения, красивостями займетесь позже. Да и всяческие украшательства излишни - нестандартные дизайнерские изыски лишь ухудшают пользование приложением, дизайн должен быть максимально прост и стандартен.

Любитель пишет:

... но моих знаний не хватило ...

Я бы рекомендовал Вам освоить и закрепить базовые знания. В дальнейшем Вы сможете с легкостью решить, задачи подобные этой.

Любитель пишет:

Стили то менять нужно не одному ДИВу.

Стили менять вообще не нужно. Надо просто менять (добавить/удалить) класс одного и только одного элемента.

( 2 * b ) || ! ( 2 * b )

16

Re: JS Скрипт не работает если контейнер TD

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

К сожалению, название темы не отражает проблему, которая заключается не в том, что JS не работает для элементов внутри таблицы. Проблема заключается в том, что МСИЕ по своему, отлично от стандартов, интерпретирует стилевые правила.

( 2 * b ) || ! ( 2 * b )

17

Re: JS Скрипт не работает если контейнер TD

подписка на последний пост не пришла почему то.

Rumata, в правильном направлении мыслите. Это вообще не сайт, это программа, где в одном стиле сделаны и элементы управления(кнопки) и рабочие окошки.
Если мне подскажут как картинку вставить, сделаю скриншот(если это кому то интересно), не понял как тег IMG использовать.


Проблема заключается в том, что МСИЕ по своему, отлично от стандартов, интерпретирует стилевые правила.

Тоже так думаю.
Картинки принципиально не хочу использовать, умею, но не хочу.

18

Re: JS Скрипт не работает если контейнер TD

Любитель пишет:

Если мне подскажут как картинку вставить, сделаю скриншот(если это кому то интересно), не понял как тег IMG использовать.

Например, так.

19

Re: JS Скрипт не работает если контейнер TD

Вот так это в реали. Программа переписывается с нуля уже не первый раз, поэтому база набита.


http://img26.imageshack.us/img26/4679/morda.gif

Uploaded with ImageShack.us


alexii, использовал это imageshack.us.

20

Re: JS Скрипт не работает если контейнер TD

Любитель пишет:

alexii, использовал это imageshack.us.

Вполне нормально. Этот сервер почти что стандартом стал на Западе.

Только, если размеры оригинала будут большими — лучше вместо оригинала вставлять preview изображения со ссылкой на оригинал.