webForumDet fria alternativet

Posta formulär och kalla på funktion

17 svar · 733 visningar · startad av MickeA.com

MickeA.comMedlem sedan feb. 20034 441 inlägg
#1

Hej,

Använder webToolkit.AIM för att posta formulär med AJAX.
Koden ser ut såhär:

<form id="test" action="ajax.postmyform.php" method="post" onsubmit="return AIM.submit(this, {'onStart' : initPasteContent, 'onComplete' : cbPasteContent});">

</form>

I normala fall postar man formuläret med:

<input type="submit" value="submit" />

Men nu vill jag kunna posta det via en länk eller knapp som ligger utanför formuläret.
Jag försökt med bl.a. dessa:

document.forms[0].submit();
document.forms[0].submit();

Formuläret postas, men postas då "som vanligt", det som ligger i "onsubmit" sker inte, utan datan postas till en ny sida.

Finns det något sätt att "komma runt" det här?

Peter SMedlem sedan dec. 20025 483 inlägg
#2
if (document.forms[0].onsubmit){
  document.forms[0].onsubmit();
}
MickeA.comMedlem sedan feb. 20034 441 inlägg
#3

Tack ska du ha!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#4

Peter S skrev:

if (document.forms[0].onsubmit){
  document.forms[0].onsubmit();
}

Kör det här på en <select> som ligger i mitt formulär:

ondblclick="if(this.form.onsubmit){ this.form.attempt.value = 'Apply'; this.form.onsubmit(); }else{ alert('error'); }"

Den första funktionen med prefixet "init" körs, men någon response får jag aldrig.
Har jag missat något?

Peter SMedlem sedan dec. 20025 483 inlägg
#5

Oj, ingen aning. Lägg in en alert() i init- och cb-funktionerna för att se så att de verkligen körs.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#6

Peter S skrev:

Oj, ingen aning. Lägg in en alert() i init- och cb-funktionerna för att se så att de verkligen körs.

Har redan provat det och init körs, men inte cb.

Peter SMedlem sedan dec. 20025 483 inlägg
#7

Vad får du med

ondblclick="this.form.attempt.value = 'Apply'; AIM.submit(this.form, {'onStart' : initPasteContent, 'onComplete' : cbPasteContent})"

?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#8

Peter S skrev:

Vad får du med

ondblclick="this.form.attempt.value = 'Apply'; AIM.submit(this.form, {'onStart' : initPasteContent, 'onComplete' : cbPasteContent})"

?

Samma sak som tidigare, "init" körs, men inte "callback".

Undra hur man ska lösa det här...

Peter SMedlem sedan dec. 20025 483 inlägg
#9

Om du testar att ha det i <form>:s onsubmit igen -- blir det fel även då?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#10

Nej, det funkar, sålänge jag kör "this" istället för "this.form".
Såhär ser AIM Toolkit ut:

/**
*
*  AJAX IFRAME METHOD (AIM)
*  [url]http://www.webtoolkit.info/[/url]
*
**/

AIM = {

	frame : function(c) {

		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display: none;" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		d.style.css="border: 1px #000 solid;";
		document.body.appendChild(d);

		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function') {
			i.onComplete = c.onComplete;
		}

		return n;
	},

	form : function(f, name) {
		f.setAttribute('target', name);
	},

	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},

	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}

		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
}

Något man kan ändra för att saker och ting ska triggas rätt?

Peter SMedlem sedan dec. 20025 483 inlägg
#11

Det verkar som att formuläret måste postas för att onComplete skall fungera. Se följande exempel:

<script type="text/javascript">
/**
*
*  AJAX IFRAME METHOD (AIM)
*  [url]http://www.webtoolkit.info/[/url]
*
**/

AIM = {

	frame : function(c) {

		var n = 'f' + Math.floor(Math.random() * 99999);
		var d = document.createElement('DIV');
		d.innerHTML = '<iframe style="display: none;" src="about:blank" id="'+n+'" name="'+n+'" onload="AIM.loaded(\''+n+'\')"></iframe>';
		d.style.css="border: 1px #000 solid;";
		document.body.appendChild(d);

		var i = document.getElementById(n);
		if (c && typeof(c.onComplete) == 'function'){
			i.onComplete = c.onComplete;
		}

		return n;
	},

	form : function(f, name) {
		f.setAttribute('target', name);
	},

	submit : function(f, c) {
		AIM.form(f, AIM.frame(c));
		if (c && typeof(c.onStart) == 'function') {
			return c.onStart();
		} else {
			return true;
		}
	},

	loaded : function(id) {
		var i = document.getElementById(id);
		if (i.contentDocument) {
			var d = i.contentDocument;
		} else if (i.contentWindow) {
			var d = i.contentWindow.document;
		} else {
			var d = window.frames[id].document;
		}
		if (d.location.href == "about:blank") {
			return;
		}
		if (typeof(i.onComplete) == 'function') {
			i.onComplete(d.body.innerHTML);
		}
	}
}

function initPasteContent(s){ document.getElementById("foo").innerHTML = "Init!"; }
function cbPasteContent(s){ document.getElementById("bar").innerHTML = "Klar!"; }
</script>

<a href="javascript:void(0)" onclick="document.forms[0].onsubmit();document.forms[0].submit()">Submit!</a>
<form onsubmit="AIM.submit(this, {'onStart' : initPasteContent, 'onComplete' : cbPasteContent})">

</form>

<form>
 <select ondblclick="AIM.submit(this.form, {'onStart' : initPasteContent, 'onComplete' : cbPasteContent});this.form.submit()">
   <option>Click me!</option>
 </select>
</form>

<div style="border:1px solid" id="foo"></div>
<div style="border:1px solid red" id="bar"></div>
Peter SMedlem sedan dec. 20025 483 inlägg
#12

Problemet ligger i vad du ger till iframe.src. Någonting annat än about : blank fixar biffen; varför används about : blank?

MickeA.comMedlem sedan feb. 20034 441 inlägg
#13

Yes, lade till this.form.submit() efter AIM.. som i ditt exempel och det funkade bra.

Tack för hjälpen!

MickeA.comMedlem sedan feb. 20034 441 inlägg
#14

Peter S skrev:

Problemet ligger i vad du ger till iframe.src. Någonting annat än about : blank fixar biffen; varför används about : blank?

Jag vet inte varför det är så.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#15

Peter S skrev:

Problemet ligger i vad du ger till iframe.src. Någonting annat än about : blank fixar biffen; varför används about : blank?

Någonting annat? Alltså vad som helst? Är det vettigt att ha en "foo.htm" som laddas in i framen som default?

Peter SMedlem sedan dec. 20025 483 inlägg
#16

Japp, det verkar som så :)

MickeA.comMedlem sedan feb. 20034 441 inlägg
#17

Skumt, ska testa det imorrn.
Om jag nu lägger till något annat ist. för about:blank, kan jag skippa this.form.submit(); längst bak då?

Peter SMedlem sedan dec. 20025 483 inlägg
#18

Ja, det kan du hoppa över då.

144 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)