Pull to refresh

Чем дальше в лес, тем партизанестее партизаны

Reading time3 min
Views570
Всё началось с того, что я решил заняться изучением Javascript, давно я смотрел на этот язык программирования. И вот наконец-то свершилось! Я читаю Флэнагана(довольно хорошая книга, стоит заметить).

Немного почитав, я решил заняться практикой, используя свою любимую IDE — Visual Studio, — несколько простых примеров, надо что-то поинтереснее. О drag`n`drop. Написал запустил(писал в Visual Studio, которая автоматически сгенерировала шаблонную htm страничку), под IE6(!) всё заработало с пол абарота. Каково же было моё удивление когда FireFox 3.5 наотрез отказался перетаскивать элемент.
Чтобы не быть голосновным приведу код, нехило пострадавший в результате ряда кастраций подгонов:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
  <title>Untitled Page</title>
<style>
.dragme{position:relative;}
</style>
</head>
<body>
  
<script language="JavaScript">

  var ie=document.all;
  var nn6=document.getElementById&&!document.all;
  
  var x,y;
  var dobj;
  
  function movemouse(e)
  {
   if (dobj)
   {
    dobj.style.left = nn6 ? tx + e.clientX - x : tx + event.clientX - x;
    dobj.style.top = nn6 ? ty + e.clientY - y : ty + event.clientY - y;
    return false;
   }
  }
  
  function selectmouse(e)
  {
   var fobj = nn6 ? e.target : event.srcElement;

   if (fobj.className=="dragme")
   {
    
    dobj = fobj;
    tx = parseInt(dobj.style.left+0);
    ty = parseInt(dobj.style.top+0);
    x = nn6 ? e.clientX : event.clientX;
    y = nn6 ? e.clientY : event.clientY;
    document.onmousemove=movemouse;
    dbg('x:', x, ' tx:', tx);
    return false;
   }
  }
  
  document.onmousedown=selectmouse;
  document.onmouseup=new Function("dobj=null");
  
</script>
  
  <div id="testDiv" style="background-color:Purple;width:50px;height:50px" class="dragme">
  </div>
  
</body>
</html>

* This source code was highlighted with Source Code Highlighter.


Значит надо идти от противного. Firebug в руки и дебажить.
Весело… почему-то в коде:
dobj.style.left = nn6? tx + e.clientX — x: tx + event.clientX — x;
dobj.style.top = nn6? ty + e.clientY — y: ty + event.clientY — y;


не устанавливается значение в dobj.style.left.
В общем в результате копаний и копи-пастингов, из-за чего внешний вид кода и пострадал, было выяснено, что во всё виновата строка:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" «www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>

стоит её убрать, и всё работает просто замечательно.
Хотя при её наличии браузер должен работать в «Almost Standards Mode» (Почти соответствует стандартам).

Чтоже это такое? Происки Майкрософт или партизанщина Firefox( и иже с ними). Я, к сожалению, не знаю.
Причина устранена, но корень зла так и не ясен
Надеюсь кому-то данный топик, когда-то поможет сохранить немного столь драгоценного времени.

ЗЫ «Если вы владеете необходимой информацией, буду крайне благодарен».

UPD
Ответ найден, благодаря пользователям @SilenIT:

Скорее второе. Ради доли рынка разработчики FF втихаря сделали в своем Quirks mode поддержку древних IEшных нестандартных фич, таких, как document.all, автодобавление «px» для размеров и координат без указания единиц в CSS и всякое прочее. Благодаря этому древние кривые страницы работают под ним без переделки. Но если указан любой нормальный доктайп, браузер резонно ожидает, что автор знал, что делал… :)


и Luge:
сами же написали, что FF должен стандартам следовать. Вот и добавьте px в размерность :)
Tags:
Hubs:
Total votes 18: ↑9 and ↓90
Comments7

Articles