PDA

View Full Version : onreadystatechange carrying variables


macinic
05-22-2009, 04:27 PM
right so here's my script:

var http_request = false;
function makePOSTRequest(url, parameters, ag) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// set type accordingly to anticipated content type
//http_request.overrideMimeType('text/xml');
http_request.overrideMimeType('text/html');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Cannot create XMLHTTP instance');
return false;
}

http_request.onreadystatechange = alertContents(ag);
http_request.open('POST', url, true);
http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http_request.setRequestHeader("Content-length", parameters.length);
http_request.setRequestHeader("Connection", "close");
http_request.send(parameters);
}

function alertContents(ag) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
//alert(http_request.responseText);
result = http_request.responseText;
var agg="myspanss"+ag;
document.getElementById(agg).innerHTML = result;
} else {
alert('There was a problem with the request.');
}
}
}

function get(obj,ag) {
var poststr = "answer=" + escape(encodeURI(
document.getElementById(ag).value )) + "&id=" + escape(encodeURI(
document.getElementById(ag).value ));

makePOSTRequest('answer.php', poststr, ag);
}

So i have a page (answer_stream.php), which has various textareas, each

is

<form id="boxID"> (ID replaced with their ID)
and same with a textarea called <textarea id="textareaID">

then I have a response box called <span id="responseID">

So what I'd like, is if i submit the form for each ID, that a response appears in the correct box.

So a solution I thought was on the post thing i have...

<input type=\"button\" onclick=\"javascript:get(this.parentNode,'$question[id]');\">

And i'd like to carry this ID variable through the javascript functions, so that I can put the reponse in the right box

function alertContents(ag) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
//alert(http_request.responseText);
result = http_request.responseText;
var agg="myspanss"+ag;
document.getElementById(agg).innerHTML = result;
} else {
alert('There was a problem with the request.');
}
}
}

See (ag) is supposed to be the id, carried through the functions, but for some reason it doesn't work.

Cheers for your help!

rnd me
05-22-2009, 07:44 PM
remove the formal argument from function alertContents(ag), making it function alertContents(), and then place the function inside of the other function:makePOSTRequest.

you won't need to pass anything to alertContents that way, and once inside, alertContents will be able to see the ag argument of makePOSTRequest.

macinic
05-23-2009, 12:03 PM
cheers! that nearly works, but just 1 or 2 things still don't.

Here's the code now:

var http_request = false;
function makePOSTRequest(url, parameters, ag) {

function alertContents() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
//alert(http_request.responseText);
result = http_request.responseText;
var agg = "response" + ag;
document.getElementById(agg).innerHTML = result;
} else {
alert('There was a problem with the request.');
}
}
}

http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// set type accordingly to anticipated content type
//http_request.overrideMimeType('text/xml');
http_request.overrideMimeType('text/html');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!http_request) {
alert('Cannot create XMLHTTP instance');
return false;
}

http_request.onreadystatechange = alertContents(ag);
http_request.open('POST', url, true);
http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http_request.setRequestHeader("Content-length", parameters.length);
http_request.setRequestHeader("Connection", "close");
http_request.send(parameters);
}



function get(obj,ag) {
var answer = "answer" + ag;
var poststr = "answer=" + escape(encodeURI(
document.getElementById(answer).value )) + "&id=" + ag;
makePOSTRequest('answer.php', poststr, ag);
}


Right. so the ID comes through fine, but the answer just comes out as 'undefined'. Each answer is in a <textarea id="answerID">

So there must be something wrong with this:

function get(obj,ag) {
var answer = "answer" + ag;
var poststr = "answer=" + escape(encodeURI(
document.getElementById(answer).value )) + "&id=" + ag;
makePOSTRequest('answer.php', poststr, ag);
}


Also, the response doesn't seem to come through even though there is a div box called <div id="responseID">

Though it does work as it does insert into the database (on answer.php), just those two things don't.

I appreciate the help, cheers :)

rnd me
05-23-2009, 10:47 PM
glad to get you closer with just a few sentences.

can you post the whole code, or at least the call that starts this whole thing in motion?

I am having a little trouble tracing it without seeing the HTML or function calls.

if you are doing more than one request, you should move the XmlHttpRequest variable inside of the dispatch function:
function makePOSTRequest(url, parameters, ag) {
var http_request = false;

right now, a second request would stomp out the first...
but again, without seeing the whole picture i can't say with any certainty what the problem is.