Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Баг при использовании «  в innerHTML в некоторых браузерах
 
 автор: Микки   (20.10.2009 в 17:27)   письмо автору
 
 

Кто-нибудь может подсказать , как убрать такой баг innerHTML, как -то,возможно, некие "утечки памяти" в некоторых браузерах, связанных с его применением или возможно что-то ещё. Поясню на конкретном примере. При добавлении в код:

<a href='javascript: void(0);' onclick="switchVisibility(); this.innerHTML = this.innerHTML == 'Обычный поиск' ? 'Расширенный поиск' : 'Обычный поиск';">Расширенный поиск</a>


комбинации &laquo;&nbsp; перед словами Обычный поиск , т.е. вот так:

<a href='javascript: void(0);' onclick="switchVisibility(); this.innerHTML = this.innerHTML == '&laquo;&nbsp;Обычный поиск' ? 'Расширенный поиск' : '&laquo;&nbsp;Обычный поиск';">Расширенный поиск</a>


с целью получить « Обычный поиск, в браузерах IE и FF происходит следующее: при нажатии на Расширенный поиск открывается нужная форма и слова Расширенный поиск заменяются словами « Обычный поиск, всё как и должно быть, НО при следующем нажатии на « Обычный поиск, форма закрывается, а вот « Обычный поиск так и остаётся быть ссылкой « Обычный поиск, т.е. не заменяется на Расширенный поиск и так остаётся « Обычный поиск, сколько не нажимай. Надо ещё сказать что операция по внедрению комбинации &nbsp;&raquo; после слов Расширенный поиск (Расширенный поиск ») проходит всегда успешно. И ещё то, что браузер Опера всегда корректно отображает результаты обоих операций.

  Ответить  
 
 автор: АЯ   (20.10.2009 в 18:16)   письмо автору
 
   для: Микки   (20.10.2009 в 17:27)
 

Это не баг. Это - "дело вкуса".

Всем известно, что "о вкусах не спорят".
Даже если девяносто девяти из ста нравится творчество группы Битлз, это совсем не означает,
что у того единственного из сотни, которому битлы не нравятся, - плохой вкус. У него просто
ДРУГОЙ вкус. О которых не спорят.
А не спорят о вкусах потому, что каждый имеет собственный набор из пяти чувств и свое
собственное восприятие действительности при их помощи.

Браузеры делают люди. И люди вкладывают в программы браузеров свои собственные
представления.
Разработчики одних браузеров вложили в свои детища, что наличие &laquo; в тексте тега должно
возвращаться свойством innerHTML именно как &laquo; (т.е. как точная копия того, что написано).
А другие разработчики других браузеров запрограммировали, что innerHTML должно возвращать
реальное визуальное представление того, что написано в коде - пользователь же видит не
&laquo;, а символ « - именно его браузер MSIE и возвращает.
Даже если бы вместо &laquo; MSIE вернул бы &#171; - вот даже тогда это не было бы багом.
Это был бы просто "такой вкус" :-)

Решение простое - для кроссбраузерности вам надо сравнивать возвращаемое браузерами с тем,
что разными браузерами гарантированно интерпретируется ОДИНАКОВО, а именно вместо вашего
this.innerHTML = this.innerHTML == '&laquo;&nbsp;Обычный поиск' ? 'Расширенный поиск' : '&laquo;&nbsp;Обычный поиск';
пропишите
this.innerHTML = this.innerHTML == 'Расширенный поиск' ? '&laquo;&nbsp;Обычный поиск' : 'Расширенный поиск';
И это, кстати, на несколько символов кода покороче будет. И раз уж у нас образовалась экономия
байтов, то я бы посоветовал вам добавить ещё четыре символа:
this.innerHTML = ((this.innerHTML == 'Расширенный поиск') ? '&laquo;&nbsp;Обычный поиск' : 'Расширенный поиск');
Дело в том, что оператор условие ? вариант1 : вариант2 имеет самый низкий приоритет из всех
существующих операторов. В данном (вашем) случае скобки не нужны. Но если бы у вас до этого
оператора (или после него) была бы ещё использована конкатенация строки, то тогда скобки были
бы обязательными. Так что лучше всегда использовать в виде ((условие) ? вариант1 : вариант2).
Это позволит вам в будущем избежать глупых ошибок.

  Ответить  
 
 автор: Микки   (20.10.2009 в 18:42)   письмо автору
 
   для: АЯ   (20.10.2009 в 18:16)
 

Уважаемый АЯ! Благодарю Вас за отклик и помощь!!! Не судите пож-та меня строго в силу того , что я пока "чайник" в этих делах, но дело в том, что если я введу такой код:

this.innerHTML = this.innerHTML == 'Расширенный поиск' ? '&laquo;&nbsp;Обычный поиск' : 'Расширенный поиск';


то "ломается" логика, т.е. там, где расширенный поиск- там обычный и наоборот. Ну т.е. при открытой форме красуется ссылка расширенный поиск, а должна обычный. Не соображу что-то ,как, учитывая Ваши наставления, мне сделать всё корректно. Ведь честно говоря по моей задумке, я хотел бы чтобы не только у Обычный поиск были символы « , но и у Расширенный поиск были » вот такие знаки.

  Ответить  
 
 автор: АЯ   (20.10.2009 в 19:16)   письмо автору
 
   для: Микки   (20.10.2009 в 18:42)
 

Во-первых, условие будет работать ВНЕ ЗАВИСИМОСТИ от того, что написано у вас в HТML-коде
изначально. Так что вы сначала ПОПРОБУЙТЕ, а потом утверждайте глупости.
Если вам говорят - "Оденьте на голову шляпу, если она на вас есть. А если она у вас на голову одета,
то снимите её" - то вы в любом случае сделаете что-то (оденете или снимите). Вне зависимости -
была у вас в самом начале шляпа на голове, или её не было.

Во-вторых, можно сравнивать не ВСЮ строку, а лишь её часть.
Строка "Обычный поиск" с ЛЮБЫМИ символами до и после этих двух слов отличается от строки
"Расширенный поиск" с ЛЮБЫМИ символами до и после этих двух слов довольно многим.
Например, можно спросить - а есть ли буква "О". Если есть, то это однозначно "Обычный поиск".
То же самое будет с буквами "б", "ы", "ч", а также с любыми буквосочетаниями, имеющими в своем
составе любые из перечисленных четырех букв. Например, по обрывку "чн" вы сможете
идентифицировать, что это именно "Обычный поиск", а не "Расширенный"? Сможете. И компьютер
сможет, не сомневайтесь.

Так что в общем виде:
this.innerHTML = ((this.innerHTML.indexOf ('чн') < 0) ? 'QQQ Обычный поиск ZZZ' : 'SSS Расширенный поиск WWW');
где вместо жирных букв может быть ВСЁ, что вам угодно.

  Ответить  
 
 автор: Микки   (20.10.2009 в 19:21)   письмо автору
 
   для: АЯ   (20.10.2009 в 19:16)
 

Я прошу прощения, но дело в том, что, я как раз попробовал Ваш код на деле, прежде чем писать Вам сообщение.

нужна вот такая последовательность :

Обычный поиск - Расширенный поиск - Обычный поиск

а Вы предлагаете:

Расширенный поиск - Обычный поиск - Расширенный поиск

Отсюда ломается логика отображаемого

  Ответить  
 
 автор: АЯ   (20.10.2009 в 19:27)   письмо автору
 
   для: Микки   (20.10.2009 в 19:21)
 

Напишите в HTML-коде то, что вам нужно изначально.
И напишите в onclick мой код.
Напишете "Обычный поиск", то будет последовательность "Обычный--Расширенный--Обычный--"
Напишете "Расширенный поиск", то будет "Расширенный--Обычный----Расширенный"

[поправлено модератором]

  Ответить  
 
 автор: Микки   (20.10.2009 в 19:28)   письмо автору
 
   для: АЯ   (20.10.2009 в 19:27)
 

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

  Ответить  
 
 автор: Микки   (20.10.2009 в 19:40)   письмо автору
 
   для: АЯ   (20.10.2009 в 19:27)
 

А где в html мне нужно прописать то что мне нужно изначально?

у меня есть таблица, которая выскакивает с присвоенным ID <table id="net" style="display: none;"
есть onclick который я уже приводил

и скрипт

<script language="javascript" type="text/javascript"> function hxs(id) {
t=document.getElementById(id);


if(t.style.display=='none')t.style.display="";
else t.style.display='none'
return false;
}
</script>

Млин...мне всего-то нужно чтобы были эти проклятые символы » и « . Ваш способ НЕ ПОДХОДИТ, т.к. во-первых ломает логику, а во вторых пригоден только для отображения этих символов только у тех слов что находтся посередине Я так понимаю что Ваш способ подходит только для отображения только какого-то одного вида этих символов, Я же предупреждал чтобы ВЫ не судили меня строго. Я только начал этим заниматься...Вы написали тут целую научную диссертацию, а по сути не помогли.

  Ответить  
 
 автор: АЯ   (20.10.2009 в 20:04)   письмо автору
 
   для: Микки   (20.10.2009 в 19:40)
 

>"А где в html мне нужно прописать то что мне нужно изначально?"

Там, где выделено жирно:
<a href='javascript: void(0);' onclick="switchVisibility(); this.innerHTML = ((this.innerHTML.indexOf ('чн') < 0) ? 'QQQ Обычный поиск ZZZ' : 'SSS Расширенный поиск WWW');">QQQ Обычный поиск ZZZ</a>

И на всякий случай проверьте:
<a href='javascript: void(0);' onclick="switchVisibility(); this.innerHTML = ((this.innerHTML.indexOf ('чн') < 0) ? 'QQQ Обычный поиск ZZZ' : 'SSS Расширенный поиск WWW');">Я идиот</a>

  Ответить  
 
 автор: Микки   (20.10.2009 в 20:28)   письмо автору
 
   для: АЯ   (20.10.2009 в 20:04)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования