Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) Динамическое назначение метода onclick / 16 сообщений из 16, страница 1 из 1
25.10.2008, 15:50
    #35615973
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Итак, требуется средствами JS трансформировать ссылки
Код: plaintext
<a href="http://mysite?key=value">link1</a>
в ссылки
Код: plaintext
<a href="http://mysite#key=value" onclick="AJAXRequest('','','key=value');">link1</a>

Для решения поставленной был написан следующий код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
for (i =  0 ; i < links.length; i ++)
{
	var tmp = links[i].href; 
	var page_param = tmp.split('?');
	links[i].onclick="AJAXRequest('','','"+page_param[ 1 ]+"');";
	links[i].href = page_param[ 0 ] + "#" + page_param[ 1 ];
}
Он справляется с своей задачей, но только в Opere.

Затем был этот код переписан для дальнейшей совместимости:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
for (i =  0 ; i < links.length; i ++)
{
	var tmp = links[i].href; 
	var page_param = tmp.split('?');
	links[i].setAttribute("onclick", "AJAXRequest('','','"+page_param[ 1 ]+"');");
	links[i].href = page_param[ 0 ] + "#" + page_param[ 1 ];
}
Теперь работает в Opere и Firefox.

Для ещё большей совместимости имеем такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
for (i =  0 ; i < links.length; i ++)
{
	var tmp = links[i].href; 
	var page_param = tmp.split('?');
	links[i].setAttribute("onclick", function() {AJAXRequest('','',page_param[ 1 ]);});
	links[i].href = page_param[ 0 ] + "#" + page_param[ 1 ];
}
Теперь AJAXRequest вызывается во всех браузерах (Opera, Firefox, Internet Exproler), но в качестве параметра на всех ссылках идет, то что было в последней ссылке.

Прошу помочь написать новый вариант кода, который бы работал во всех упомянутых браузерах.

А вообще задача сейчас свелась к тому, чтобы в последнем варианте кода для каждой ссылке был свой вариант функции AJAXRequest.
...
Рейтинг: 0 / 0
25.10.2008, 17:14
    #35616043
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
NT Man,
в первом случае не работает потому, что в событие onclick ты помещаешь строку вместо функции. В опере видимо срабатывает неявный eval, в других - нет. Можно было попробовать поработать с eval. Но выбран третий метод - это хорошо. Чтоб его реализовать, почитайте в тырнете про замыкания в js. Касательно данного случая:
Код: plaintext
1.
2.
3.
4.
5.
var link;
for (var i =  0 ; link = document.links[i]; i++)
{
	link.onclick=function(x){ return function(){alert(x); return false;} }(link.href.replace(/^.*?\?/,''));
	link.href = link.href.replace(/\?/,'#');
}
алерт(х) поставлен для тестов, его заменить на AJAXRequest('','',x). return false - оставить, чтобы после вызова AJAXRequest не происходило перехода по ссылке. Смысл действия если неочевиден - найдете в сети описание.
...
Рейтинг: 0 / 0
25.10.2008, 19:59
    #35616162
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Ну, или с помощью установки слушателя событий (не уверен, что проблему обойдет - 50 на 50, что передаст уже измененный параметр):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function addHandler(object, event, handler, capture) {
	if (object.addEventListener) object.addEventListener(event, handler, capture ? capture : false);
	else if (object.attachEvent) object.attachEvent('on' + event, handler);
}

for (var i =  0 , link; link = document.links[i]; i++) {
	addHandler(link, "click", function(event) {
		AJAXRequest('','', link.href.replace(/^.*?\?/,''));}
	);
	link.href = link.href.replace(/\?/,'#');
}

А вообще-то, конечно, используется в таких случаях замыкание. Если ты глубоко не изучал javascript и слабо знаком с некоторыми технологиями, то слудующий вариант с использованием замыкания выглядит немного проще для понимания, хотя вариант illion , конечно, наиболее лаконичен.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function setOnclick(invoker, value) {
	var handler = function() {
		AJAXRequest('','', value);
		return false;
	};
	invoker.onclick = handler;
}
for (var i =  0 , link; link = document.links[i]; i++) {
	setOnclick(link, link.href.replace(/^.*?\?/,''));
	link.href = link.href.replace(/\?/,'#');
}

P.S. Мелко плаваю в регулярных выражениях, поэтому просто скопировал выражения вычленения частей у illion .
...
Рейтинг: 0 / 0
25.10.2008, 22:59
    #35616257
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
IDVsbruckНу, или с помощью установки слушателя событий (не уверен, что проблему обойдет - 50 на 50, что передаст уже измененный параметр):

ты бы какбэ мозг включал, чтобы уменьшить вероятность ошибки и не заниматься тестированием методом тыка, не обойдет 100%, можешь даже код не запускать
...
Рейтинг: 0 / 0
25.10.2008, 23:23
    #35616273
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
illion, спасибо я понял свою ошибку. У меня page_param[1], брался из [[scope]] функции, где page_param[1] менял свои значения всех ссылок, а когда внешняя функция заканчивала работу в page_param[1] осталось последнее значение. Обернув, функцию ещё одной функцией ты обеспечил сохранение каждого значения.
Прочитав http://javascript.ru/tutorial/basic/closure меня стало беспокоить что, замкнув функцию, в памяти держаться все значения внешней функции. А там у меня массив объектов.
Ниже полный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function setupNewLinks(obj)
{
	// все ссылки внутри объекта obj в которых разрешен AJAX
	var links = getElementsByAttr(obj, "a", "ajax", "true");
	// перебираем ссылки
	var link;
	for (var i =  0 ; link = links[i]; i++)
	{
		link.onclick=function(x){return function(){AJAXRequest('','',x);}}(link.href.replace(/^.*?\?/,''));
		link.href = link.href.replace(/\?/,'#');
	}
}
Следуя теории, получается массив links остается в памяти? Если это так это же не хорошо.
...
Рейтинг: 0 / 0
25.10.2008, 23:27
    #35616276
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Не остается, так как link у Вас только как параметр при вызове функции.
...
Рейтинг: 0 / 0
26.10.2008, 06:15
    #35616393
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
что-то не нравится мне новый SRC html - код стал совсем нечитаемым. Пойду в ОНС жаловаться.
...
Рейтинг: 0 / 0
05.11.2008, 21:29
    #35636137
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Теперь пытаюсь динамически менять формы. Требуеться все submit кнопки сделать простыми кнопками, и повесить на нах onclick, как и в первом случае. но не тут-то было. Даже не знаю в чём тут дело. Тону, help...

Вот многострадальный код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var form;
for (var i =  0 ; form = forms[i]; i++)
{
	for(var j =  0 ; j<form.elements.length; j++)
	{
		if (form.elements[j].type=="submit")
		{
			form.elements[j].type="button";
			form.elements[j].onclick=function(y,x){return function(){AJAXRequest(this.name+'='+this.value,y,x);}}(form.id,page_param[ 1 ])
		}
	}
}
...
Рейтинг: 0 / 0
05.11.2008, 21:42
    #35636150
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Так ведь ретурн фальсе и надо бы поюзать.
...
Рейтинг: 0 / 0
05.11.2008, 22:14
    #35636189
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Либо я не понял о чем ты, но:
Код: plaintext
function(){AJAXRequest(this.name+'='+this.value,y,x); return false;}
не помогает.
...
Рейтинг: 0 / 0
05.11.2008, 22:21
    #35636199
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Об этом как раз. Значит, не помогло. Надо думать.
...
Рейтинг: 0 / 0
05.11.2008, 22:34
    #35636213
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
ПС. Кстати, субмит на буттон не имеет смысла менять, т.к. буттон по умолчанию - тот же сабмит. Вся фигня в этом самом ретурн фальсе, но чего-то не особенно чего-то и заметно... . Попробуй-ка написать в своём function(y,x){return false}. Отсабмитится или нет. Если - нет - ищи ошыбку у себя в коде.
...
Рейтинг: 0 / 0
05.11.2008, 23:03
    #35636238
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Кажется нашел проблему.
Почему var page_param = form.getAttribute('action'); возвращает object, а не строку?
...
Рейтинг: 0 / 0
05.11.2008, 23:15
    #35636250
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Я такой конструкции не заметил. Заметил только, что page_param у тебя - массив чегото-там. А эта конструкция - нормально должна сработать. Даже в том случае, если раньше был массив. Может лучше написать:
var page_param = form.action; ?
...
Рейтинг: 0 / 0
05.11.2008, 23:59
    #35636293
NT Man
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Отвечу сам себе...
Оказывается и здесь меня подстерегал очередной глюк IE.
Подробности на английском здесь

Ниже полностью рабочий под всеми браузерами код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var forms = getElementsByAttr(obj, "form", "ajax", "true");
var form;
for (var i =  0 ; form = forms[i]; i++)
{
	var page_param = form.getAttributeNode("action").value.split('?');
	for(var j =  0 ; j<form.elements.length; j++)
	{
		if (form.elements[j].type=="submit")
		{
			form.elements[j].onclick=function(y,x){return function(){AJAXRequest(this.name+'='+this.value,y,x); return false;}}(form.id,page_param[ 1 ])
		}
	}
}
...
Рейтинг: 0 / 0
06.11.2008, 00:05
    #35636297
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(JavaScript) Динамическое назначение метода onclick
Фичка хорошая - может, пригодится ... (хотя отродясь формами не пользовался) :)
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / (JavaScript) Динамическое назначение метода onclick / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]