Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Invalid argument в IE (https://javascript.ru/forum/misc/30208-invalid-argument-v-ie.html)

FoxTrix 27.07.2012 19:43

Invalid argument в IE
 
Написал функцию передвижения дива мышкой, во всех браузерах всё работает отлично, но в IE проблема =(
ругается на 29 строку
function move(div) 
{
	document.onmousedown = function() {return false}
	div.style.cursor = 'move';
	document.onmousemove = function(e)
	{
		
		if(event.pageX == null) 
		{ 
    			var html = document.documentElement
    			var body = document.body

    			event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0)
		}
		x = event.pageX;
		left = div.offsetLeft;
		left = x - left;
		var shelf = document.getElementById('shelf');
		var slide = div.offsetWidth / 2;
		var id = 0;
		var bookId;
		var tmp = 0;
		var move = 0;
		document.onmousemove = function(e)
		{
			div.style.zIndex = 100;
			x = event.pageX;
			div.style.left = x - left + 'px';
			toolTip();
			var book1 = document.getElementById('book1').offsetLeft;
			var book2 = document.getElementById('book2').offsetLeft;
			var book3 = document.getElementById('book3').offsetLeft;
			var book4 = document.getElementById('book4').offsetLeft;

Deff 27.07.2012 19:45

div.style.left = (x - left) + 'px';

FoxTrix 27.07.2012 19:46

пробовал, не помогает

Deff 27.07.2012 19:48

alert(typeof(toolTip)); - вместо - чо говорит ?
Ксать выложите эту функцию

FoxTrix 27.07.2012 19:51

алерт говорит function
function toolTip(msg) 
{
	floatTipStyle = document.getElementById("floatTip").style;
	if (msg) 
	{
    	document.getElementById("floatTip").innerHTML = msg;
    	floatTipStyle.display = "block";
	} 
  	else 
	{ 
    	floatTipStyle.display = "none";
	} 
	
}

vadim5june 27.07.2012 19:54

так аргумент то не передали
попробуйте
toolTip(0)

FoxTrix 27.07.2012 19:57

так мне и нужно чтобы когда move(div) работает, toolTip(msg) Не работала

vadim5june 27.07.2012 19:58

Цитата:

Сообщение от FoxTrix (Сообщение 192162)
так мне и нужно чтобы когда move(div) работает, toolTip(msg) Не работала

0 и передайте
toolTip(0)

FoxTrix 27.07.2012 19:59

тоже не помогает

vadim5june 27.07.2012 20:05

какой тогда смысл в этой функции-уберите отсюда 29 строку
или я что то не понимаю

FoxTrix 27.07.2012 20:06

смысл в этой функции есть, убирать её не нужно, нужно чтобы IE перестал к ней предираться

FoxTrix 27.07.2012 20:19

ругается он на
div.style.left = (x - left) + 'px';

vadim5june 27.07.2012 20:32

Цитата:

Сообщение от FoxTrix (Сообщение 192172)
ругается он на
div.style.left = (x - left) + 'px';

а где left определен?

FoxTrix 27.07.2012 20:33

выше
left = div.offsetLeft;
left = x - left;

FoxTrix 27.07.2012 20:47

может ему + 'px' не нравится?

vadim5june 27.07.2012 20:51

Цитата:

Сообщение от FoxTrix (Сообщение 192191)
может ему + 'px' не нравится?

я думаю с left какие то проблемы-попробуйте вывести чему left равно

FoxTrix 27.07.2012 20:55

кажется нашёл в чём проблема, после
event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);

и
x = event.pageX;

алерт х всё равно undefined =(

vadim5june 27.07.2012 20:59

а где у Вас традиционные
e=e||window.event;
а у Вас просто event

bes 27.07.2012 21:19

Попробуйте так
if(event.pageX == null) 
		{ 
    			var html = document.documentElement
    			var body = document.body

    			x = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0)
		} else
		x = event.pageX;

FoxTrix 27.07.2012 21:30

исправил, получилось вот так
function move(div) 
{
	document.onmousedown = function() {return false}
	div.style.cursor = 'move';
	document.onmousemove = function(e)
	{
		e=e||window.event;
		if(e.pageX == null) 
		{ 
    			var html = document.documentElement
    			var body = document.body

    			e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
		}
		x = e.pageX;
		left = div.offsetLeft;
		left = x - left;
		var shelf = document.getElementById('shelf');
		var slide = div.offsetWidth / 2;
		var id = 0;
		var bookId;
		var tmp = 0;
		var move = 0;
		document.onmousemove = function(e)
		{
			e=e||window.event;
			if(e.pageX == null) 
			{ 
    				var html = document.documentElement
    				var body = document.body

    				e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
			}
			div.style.zIndex = 100;
			x = e.pageX;
			div.style.left = x - left + 'px';

теперь див двигается, но не отпускается >_< как я ненавижу IE

bes 27.07.2012 21:36

в исходном примере с 8 по 15 строку замените тем, что я написал

FoxTrix 27.07.2012 21:45

в этом фрагменте теперь проблем нет, теперь проблемы в другом месте =(

bes 27.07.2012 21:47

а теперь дорабатывайте e = e || event

FoxTrix 27.07.2012 21:48

сейчас проблема тут в строке 1-3 "Требуется объект"
var book = document.getElementById(bookId).offsetLeft;
			if(move == 1)
			{
				if(tmp == 1)
				{
					var i = book;
					if(book - shelf.offsetLeft + 5 >= div.offsetWidth + 20)
						var j = book - div.offsetWidth + 20;
					else
					{
						if(book - shelf.offsetLeft + 5 < div.offsetWidth + 20)
							var j = shelf.offsetLeft + 4;
					}
				}
				else
				{
					if(tmp == 2)
					{
						var i = book;
						if(shelf.offsetLeft + shelf.offsetWidth - book - 5 >= div.offsetWidth + 20)
							var j = book + div.offsetWidth - 20;
						else
						{
							if(shelf.offsetLeft + shelf.offsetWidth - book - 5 < div.offsetWidth + 20)
								var j = shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 4;
						}
					}
				}
				if(j > shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 4)
					j = shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 4;
				t1A = new Tween(document.getElementById(bookId).style,'left',Tween.strongEaseOut,i,j,0.5,'px');
				t1A.start();
				tmp = 0;
				move = 0;
			}
		}
	}
}

bes 27.07.2012 21:55

Были только книги, теперь шкафы полки подключились :)
PS: при отсутствии полного кода примера смотреть не айс

FoxTrix 27.07.2012 21:58

у меня книжная полка, по которой я двигаю книги(дивы)
сейчас напишу полный код функции, он просто довольно длинный

FoxTrix 27.07.2012 22:00

function move(div) 
{
	document.onmousedown = function() {return false}
	div.style.cursor = 'move';
	document.onmousemove = function(e)
	{
		e=e||window.event;
		if(e.pageX == null) 
		{ 
    			var html = document.documentElement
    			var body = document.body

    			e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
		}
		x = e.pageX;
		left = div.offsetLeft;
		left = x - left;
		var shelf = document.getElementById('shelf');
		var slide = div.offsetWidth / 2;
		var id = 0;
		var bookId;
		var tmp = 0;
		var move = 0;
		document.onmousemove = function(e)
		{
			e=e||window.event;
			if(e.pageX == null) 
			{ 
    				var html = document.documentElement
    				var body = document.body

    				e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
			}
			div.style.zIndex = 100;
			x = e.pageX;
			div.style.left = x - left + 'px';
			toolTip(0);
			var book1 = document.getElementById('book1').offsetLeft;
			var book2 = document.getElementById('book2').offsetLeft;
			var book3 = document.getElementById('book3').offsetLeft;
			var book4 = document.getElementById('book4').offsetLeft;
			if(div.offsetLeft <= shelf.offsetLeft + 5)
				div.style.left = shelf.offsetLeft + 5 + 'px';
				
			if(div.offsetLeft + div.offsetWidth >= shelf.offsetLeft + shelf.offsetWidth - 5)
				div.style.left = shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 5 + 'px';
//book1////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(div.offsetLeft + slide > book1 + slide && div.offsetLeft + slide < book1 + slide + 5) tmp = 1;
			
			if(div.offsetLeft + slide < book1 + slide && div.offsetLeft + slide > book1 + slide - 5) tmp = 2;
					
			if(div.offsetLeft + slide > book1 + slide + 5 && div.offsetLeft + slide < book1 + slide + 10 && tmp == 1)
			{id = 1; bookId = 'book'+id; move = 1;}
				
			if(div.offsetLeft + slide < book1 + slide - 5 && div.offsetLeft + slide > book1 + slide - 10 && tmp == 2)
			{id = 1; bookId = 'book'+id; move = 1;}
//book2////////////////////////////////////////////////////////////////////////////////////////////////////////////////			
			if(div.offsetLeft + slide > book2 + slide && div.offsetLeft + slide < book2 + slide + 5) tmp = 1;
			
			if(div.offsetLeft + slide < book2 + slide && div.offsetLeft + slide > book2 + slide - 5) tmp = 2;
					
			if(div.offsetLeft + slide > book2 + slide + 5 && div.offsetLeft + slide < book2 + slide + 10 && tmp == 1)
			{id = 2; bookId = 'book'+id; move = 1;}
				
			if(div.offsetLeft + slide < book2 + slide - 5 && div.offsetLeft + slide > book2 + slide - 10 && tmp == 2)
			{id = 2; bookId = 'book'+id; move = 1;}
//book3////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(div.offsetLeft + slide > book3 + slide && div.offsetLeft + slide < book3 + slide + 5) tmp = 1;
			
			if(div.offsetLeft + slide < book3 + slide && div.offsetLeft + slide > book3 + slide - 5) tmp = 2;
					
			if(div.offsetLeft + slide > book3 + slide + 5 && div.offsetLeft + slide < book3 + slide + 10 && tmp == 1)
			{id = 3; bookId = 'book'+id; move = 1;}
				
			if(div.offsetLeft + slide < book3 + slide - 5 && div.offsetLeft + slide > book3 + slide - 10 && tmp == 2)
			{id = 3; bookId = 'book'+id; move = 1;}
//book4////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(div.offsetLeft + slide > book4 + slide && div.offsetLeft + slide < book4 + slide + 5) tmp = 1;
			
			if(div.offsetLeft + slide < book4 + slide && div.offsetLeft + slide > book4 + slide - 5) tmp = 2;
					
			if(div.offsetLeft + slide > book4 + slide + 5 && div.offsetLeft + slide < book4 + slide + 10 && tmp == 1)
			{id = 4; bookId = 'book'+id; move = 1;}
				
			if(div.offsetLeft + slide < book4 + slide - 5 && div.offsetLeft + slide > book4 + slide - 10 && tmp == 2)
			{id = 4; bookId = 'book'+id; move = 1;}


			var book = document.getElementById(bookId).offsetLeft;
			if(move == 1)
			{
				if(tmp == 1)
				{
					var i = book;
					if(book - shelf.offsetLeft + 5 >= div.offsetWidth + 20)
						var j = book - div.offsetWidth + 20;
					else
					{
						if(book - shelf.offsetLeft + 5 < div.offsetWidth + 20)
							var j = shelf.offsetLeft + 4;
					}
				}
				else
				{
					if(tmp == 2)
					{
						var i = book;
						if(shelf.offsetLeft + shelf.offsetWidth - book - 5 >= div.offsetWidth + 20)
							var j = book + div.offsetWidth - 20;
						else
						{
							if(shelf.offsetLeft + shelf.offsetWidth - book - 5 < div.offsetWidth + 20)
								var j = shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 4;
						}
					}
				}
				if(j > shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 4)
					j = shelf.offsetLeft + shelf.offsetWidth - div.offsetWidth - 4;
				t1A = new Tween(document.getElementById(bookId).style,'left',Tween.strongEaseOut,i,j,0.5,'px');
				t1A.start();
				tmp = 0;
				move = 0;
			}
		}
	}
}

FoxTrix 27.07.2012 22:01

проблема насколько я понял в 89 строке, но какой объект ему нужен?

bes 27.07.2012 22:13

Ну потестируйте alert-ом какие параметры на каком шаге получаются (я именно так проверил какое значение получает event.pageX в первой ситуации), получает ли book нужное значение или нет и т.п.
PS: и не забудьте доработать последний пример на предмет первой ситуации

FoxTrix 27.07.2012 22:19

и book и bookId и move получают нужные значения

bes 27.07.2012 22:21

тогда проблема не в 89 строке, смотрим дальше (проверьте полки)

bes 27.07.2012 22:29

Кстати, откуда вообще сведения об ошибках получаете?

FoxTrix 27.07.2012 22:39

bes,
в IE начинаю двигать книгу, в левом нижнем углу появляется иконка Error on page.
при нажатии на неё показываются детали

bes 27.07.2012 22:49

Потестите в хроме (нажмёте F12, там разберетесь, где смотреть (смотреть console)), покажет тип ошибки, на ссылку справа в строке ошибки нажмёте кинет на строку с ошибкой (если сможет определить)

FoxTrix 27.07.2012 22:55

в хроме ошибок нету, там всё отлично работает, ошибки только в IE ниже 9й версии

bes 27.07.2012 23:10

В IE похуже будет, если полки получаются, то вроде только Tween остаётся проверьте его.

FoxTrix 27.07.2012 23:29

по функционалу вся функция работает, но по идее когда срабатывает onMouseUp функция должна прекращаться, но она работает дальше...

FoxTrix 28.07.2012 00:42

Всем большое спасибо!
проблему решил, мешал div.style.zIndex = 'auto'; в другой функции


Часовой пояс GMT +3, время: 02:05.