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

HTML+CSS+JavaScript

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

 

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

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

тема: проблема с межбраузерной совместимостью для javascript
 
 автор: LikeThat   (10.09.2008 в 20:57)   письмо автору
 
 

Всем привет!
попытался собрать небольшой скрипт "слайдер" на javascript. когда закончил обнаружил что работает только в Opere и никак не хочет в IE и еще хуже в FF. вот весь код:


<head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
    <title>my</title>
    <link rel="stylesheet" href="style.css" type="text/css" />
    <script type="text/javascript" language="JavaScript">
        var selectorWidth = 11; 
        var sliderWidth = 200;
        var leftBorder = 0;
        var rightBorder = 200;
        var point = (sliderWidth-selectorWidth-3)/(rightBorder-leftBorder);  // point - количество пикселей на единицу значения
        var sliderOffset = 0;
        var step = 10;
        
        function sliderClick(e)  
        {  
            if (!e && window.event) e = window.event;            
            var x;
            x = e.clientX;
            setValue(x);  
        }
        function setValue(x)   
        {          
            var e = document.getElementById('info');
            var selector = document.getElementById('selector');
            if(x < 0) 
                selector.style.left = 0+'px';   
            else if(x > sliderWidth-selectorWidth-3) 
                selector.style.left = (sliderWidth-selectorWidth-3)+'px';  
            else   
            {  
                if(step == 0) 
                    selector.style.left = x+'px';           
                else 
                    selector.style.left = Math.ceil(x/(step*point))*step*point+'px';  
            }            
            e.value = getValue(selector); 
           
        }        
        function getValue(selector)   
        {
            return Math.ceil(parseInt(selector.style.left)/point)+leftBorder;
        }
        
        function start()
        {
            attachEvent("onmousemove", move);
        }
        
        function finish()
        {
            detachEvent("onmousemove", move);
        }
        
        function move(e)
        {
            if(!e && window.event) e = window.event;
            var x = e.clientX;  
            setValue(x);
        }
        
    </script>
</head>
<body>
    <h1>Slider</h1>
    <div class="classSlider" id="slider" onclick="sliderClick();">
    <img class="classSelector" id="selector" alt="" src="selector.gif" onmousedown="start();" onmouseup="finish();" /></div><br />
    <input id="info" type="text" value="" size="3" />
</body>


помомгите пожалуйста исправить его так что работало хотябы еще в IE и в FF...
Всем спасибо...

  Ответить  
 
 автор: xx77   (11.09.2008 в 00:54)   письмо автору
 
   для: LikeThat   (10.09.2008 в 20:57)
 

совсем не понял как должно работать , но что-бы в FF тоже менялись цифры в input
нужно передать event в функцию
<div class="classSlider" id="slider" onclick="sliderClick(event);">

  Ответить  
 
 автор: xx77   (11.09.2008 в 23:24)   письмо автору
 
   для: xx77   (11.09.2008 в 00:54)
 

_

  Ответить  
 
 автор: LikeThat   (11.09.2008 в 23:33)   письмо автору
 
   для: xx77   (11.09.2008 в 23:24)
 

Я немного изменил код вот так: http://nopaste.info/f34d14fa9f.html

но все равноостается глюк...не правильно отрабатывает removeEvent...
может так вам станет прозрачнее ситуация?

  Ответить  
 
 автор: PAT   (11.09.2008 в 05:18)   письмо автору
 
   для: LikeThat   (10.09.2008 в 20:57)
 

У вас не "слайдер" получился, а какой-то "коллайдер" :-)
Слава Богу, что не большой андронный :-)

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

По-любому, сразу скажу, что у вас некроссбраузерно прописаны функции start () и finish () - FF не понимает attachEvent и detachEvent.

  Ответить  
 
 автор: LikeThat   (11.09.2008 в 08:40)   письмо автору
1.7 Кб
 
   для: PAT   (11.09.2008 в 05:18)
 

То что получился коллайдер: очень может быть... :-) я вообще чуть ли не в первый раз с javascript имею дело... так что простите.... :-)
Вкладываю архивчик... там все есть...
заранее спасибо...

  Ответить  
 
 автор: PAT   (12.09.2008 в 04:59)   письмо автору
1.5 Кб
 
   для: LikeThat   (11.09.2008 в 08:40)
 

Забирайте свой слайдер-коллайдер :-)
Изменены три файла - html, css и один из gif'ов

PS. Посоветовал бы ещё дополнить <body> отменой событий ondrag="return false" onselectstart="return false" oncontextmenu="return false", если это, разумеется, не помешает ещё каким-то скриптам на странице.

*Внимательно прочтите

  Ответить  
 
 автор: LikeThat   (11.09.2008 в 13:54)   письмо автору
 
   для: PAT   (11.09.2008 в 05:18)
 

ну хоть кто-нибудь посоветуйте что-нибудь... очень надо... неужели никто не может помочь?

  Ответить  
 
 автор: xx77   (11.09.2008 в 23:29)   письмо автору
 
   для: LikeThat   (11.09.2008 в 13:54)
 

уже неактуальное Объясните пожалуйста функцию
    // Cross-browser addEventListener()/attachEvent() replacement.<?
function addEvent(eltnamehandleratEnd) {
  
name name.replace(/^(on)?/, 'on'); 
  var 
prev elt[name];
  var 
tmp '__tmp';
  
elt[name] = function(e) {
    if (!
ewindow.event;
    var 
result;
    if (!
atEnd) {
      
elt[tmp] = handlerresult elt[tmp](e); elt[tmp] = null// delete() does not work in IE 5.0 (???!!!)
      
if (result === false) return result;
    }
    if (
prev) {
      
elt[tmp] = prevresult elt[tmp](e); elt[tmp] = null;
    }
    if (
atEnd && result !== false) {
      
elt[tmp] = handlerresult elt[tmp](e); elt[tmp] = null;
    }
    return 
result;
  }
  return 
handler;
}

UPD// удалил листинг

  Ответить  
 
 автор: xx77   (14.09.2008 в 03:02)   письмо автору
2.2 Кб
 
   для: xx77   (11.09.2008 в 23:29)
 

интересный этот слайдер-колайдер,
сделал из него колорвайзер :)
может быть окажется полезным, можно подбирать цвета чем-то таким
, хотя не доводил свой код, как-бы неотшлифовано , и далеко до визуального редактора
и у меня вопросы

есть-ли в javascript стандартная встроенная функция перевода в шестнадцатиричные типа dec2hex()
?
и почему когда я объявляю переменную в глобальной зоне видимости
(если так называется , всмысле вне фукнкций)
то там внутри функций есть switch внутри которого переменная как-бы не определена
и приходится снова и снова писать document.getElementById('vis'), вместо vis
?
и ещё
создастся-ли какая-нибудь заметная нагрузка , если я в глобальной области видимости , создам много переменных таким путём, например больше 20и , или лучше создавать такие переменные по мере использования внутри функций ?

  Ответить  
 
 автор: PAT   (14.09.2008 в 04:37)   письмо автору
 
   для: xx77   (14.09.2008 в 03:02)
 

>есть-ли в javascript стандартная встроенная функция перевода в шестнадцатиричные

Есть такая.
var x = 212;
alert (x.toString (16))

>почему когда я объявляю переменную в глобальной зоне видимости
(если так называется , всмысле вне фукнкций)
то там внутри функций есть switch внутри которого переменная как-бы не определена
и приходится снова и снова писать document.getElementById('vis'), вместо vis


1. vis у вас имя идентификатора объекта на странице.
На мой взгляд, очень ГЛУПО создавать ещё и переменную (глобальную или локальную) с тем же именем var vis = document.getElementById ('vis');
Возьмите за правило - все РАЗНЫЕ объекты должны иметь РАЗНЫЕ имена.
Посмотрите недавний пример глупости с одинаковыми именами.

2. Если объявите какую-то переменную вне функции - var obj = document.getElementById ('vis'); , то в ЛЮБОМ месте внутри ЛЮБОГО оператора ЛЮБОЙ функции можете свободно работать с этой глобальной переменной.


>если я в глобальной области видимости , создам много переменных таким путём, например больше 20и , или лучше создавать такие переменные по мере использования внутри функций

Если вычисления незначительны, то принципиальной разницы нет.
Но ГРАМОТНЫЙ программист никогда без нужды не будет делать лишних глобальных переменных.

Это как в древних языках программирования - в Фортране-IV, в ПЛ-I, в Алголе... - каждый оператор писался на отдельной строке и каждый оператор должен был иметь МЕТКУ в виде номера строки. Соответственно, во всех этих языках имелся оператор безусловного перехода GO TO метка.
И всё прекрасно было с этим оператором - всё работало как надо...
Только вот НОРМАЛЬНЫЕ программисты считали СТЫДНЫМ для себя этот оператор использовать.

  Ответить  
 
 автор: LikeThat   (15.09.2008 в 17:48)   письмо автору
 
   для: PAT   (14.09.2008 в 04:37)
 

Думаю тему можно закрыть... :))
Всем большое спасибо а участие!

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

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