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 if (document.forms[0].onsubmit){
document.forms[0].onsubmit();
}
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 Oj, ingen aning. Lägg in en alert() i init- och cb-funktionerna för att se så att de verkligen körs.
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 Vad får du med
ondblclick="this.form.attempt.value = 'Apply'; AIM.submit(this.form, {'onStart' : initPasteContent, 'onComplete' : cbPasteContent})"
?
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 Om du testar att ha det i <form>:s onsubmit igen -- blir det fel även då?
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 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 Problemet ligger i vad du ger till iframe.src. Någonting annat än about : blank fixar biffen; varför används about : blank?
Yes, lade till this.form.submit() efter AIM.. som i ditt exempel och det funkade bra.
Tack för hjälpen!
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å.
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 Japp, det verkar som så :)
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 Ja, det kan du hoppa över då.