Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Не корректно работает Submit() через JS (https://javascript.ru/forum/dom-window/16201-ne-korrektno-rabotaet-submit-cherez-js.html)

Oparin 29.03.2011 22:31

Не корректно работает Submit() через JS
 
Приветствую.

Есть простенький скрипт, открывающий окно и передающий туда данные методом POST
function Open_W(U){
	document.forms.MyOpenForm.action=U;
	document.forms.MyOpenForm.submit();
}


К коду прилагается форма:
<form method=post name=MyOpenForm id=MyOpenForm target=_blank> 
</form>


и собственно кнопка, вызывающая данную функцию:
<input type=button value="google" onClick="Open_W('http://www.google.ru');" class=bt>


Важно! Страница с этим кодом подгружается во фрейме.


Проблема вот в чем:
в браузерах Chrome и Safari кнопка срабатывает только один раз, т.е. кликаешь на кнопку, открывается окно, передаются данные все ОК. А если кликать еще раз на кнопку, то вообще ничего не происходит!!!
Такая проблема только в указанных браузерах и ТОЛЬКО если страница вложена во фрейм
посмотреть пример полностью, можно здесь:
http://oparin.ru/test3.html

Друзья, помогите разобраться, что я напутал? :cray:

melky 29.03.2011 22:55

попробуй добавлять рандомное число в action формы

тогда отправляется.



function Open_W(U){

	document.forms.MyOpenForm.action=U*!*+'/?'+Math.random();*/!*
	document.forms.MyOpenForm.submit();
}

Oparin 30.03.2011 00:34

Да, такой вариант я пробовал, действительно работает.
Но как-то кривовато и не универсально получается. Может быть все-таки есть ошибка в моем коде и можно это же действие сделать "по умному"?

melky 30.03.2011 08:41

нажмите на кнопку с гуглом ( первый раз)

далее, через "просмотр кода элемента" отредактируйте html-код формы

добавьте input type="submit" value="go" и input type="hidden" value="q"

при нажатии на go в хроме тоже не отправляется

т.е. ошибка не в скрипте

goldserg 30.03.2011 10:08

Есть подозрение что это связано с "умностью" браузеров и в таких случаях кроме как хак, вариантов нет

dmitriymar 30.03.2011 11:51

скорее всего кешируется. и такая фигня будет в любом где кеш разрешен

goldserg 30.03.2011 12:23

И такого рода хак new Date().getTime()+Math.random() - это насильный сброс кеша.

Oparin 30.03.2011 13:43

Функция открытия окна методом POST.
 
Жаль, конечно, что приходится извращаться.

Накатал вот такую функцию открытия окна методом POST, может кому-то будет полезна.
Правда пока не тестил в работе, может есть баги...

/*
Открытие нового окна и передача в него параметров методом POST
action - адрес 
args - передаваемые аргументы, вида "a=111&b=222&c=333&..."
target - '_top', '_blank', или название окна. Если не указано, то '_blank'
*/
function OpenNewWinPost(action,args,target){

	var new_el = function(el,name,value){
		m_form_i = document.createElement('input');
		m_form_i.setAttribute("type","hidden");
		m_form_i.setAttribute("name",name);
		m_form_i.setAttribute("value",value);
		el.appendChild(m_form_i);
	}

	if(!target) target = '_blank';

	var m_form = document.createElement('form');
	// Без добавления а адрес случайной последовательности в Chrome и Safari
	// переход по адресу происходит только один, первый раз
	var r = new Date().getTime()+Math.random();

	// Обработка адресов с # или ?
	if(/\?/i.test(action)){
		var tmp = new Array();
		tmp = action.split('?');
		if(/#/i.test(tmp[1])){
			var tmp2 = new Array();
			tmp2 = tmp[1].split('#');
			action=tmp[0]+'?'+tmp2[0]+'&'+r+'#'+tmp2[1];
		}else action=tmp[0]+'?'+tmp[1]+'&'+r;
	}else{
		if(/#/i.test(action)){
			var tmp2 = new Array();
			tmp2 = action.split('#');
			action=tmp2[0]+'?'+r+'#'+tmp2[1];
			
		}else action=action+'?'+r;
	}

	m_form.setAttribute("action",action);
	m_form.setAttribute("method","POST");
	m_form.setAttribute("target",target);

	// разбор аргументов
	var tmp = new Array();
	var tmp2 = new Array();
	if(args != '') {
		tmp = args.split('&');	// разделяем переменные
		for(var i=0; i < tmp.length; i++) {
			tmp2 = tmp[i].split('=');		// массив param будет содержать
			new_el(m_form,tmp2[0],tmp2[1]);
		}
	}

	// добавим на страницу
	var body = document.getElementsByTagName('body')[0];
	body.appendChild(m_form);
	// переход
	m_form.submit();
	// и в конце удалим
	body.removeChild(m_form);
}

Oparin 30.03.2011 16:20

Не факт, что тут именно кэширование виновато. БЕЗ фреймов все работает как надо.
Поэтому, возможно сама функция после первого прохода ищется где-то в другом месте, как думаете?


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