Witam
Jestem początkującym ajax-owiczem i mam problem z przsłaniem za pomocą ajax-a pliku zawierającego kod html i java script.
Plik do przesłania - edytor wizualny + pole <textarea>:
<script language="javascript" type="text/javascript" src="../tiny_mce/tiny_mce.js"></script> <script language="javascript" type="text/javascript"> tinyMCE.init({
mode : "textareas",
theme : "advanced",
plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,z
om,flash,searchreplace,print,contextmenu",
theme_advanced_buttons1_add_before : "save,separator",
theme_advanced_buttons1_add : "fontselect,fontsizeselect",
theme_advanced_buttons2_add : "separator,insertdate,inserttime,preview,zoom,separator,forecolor,backcolor",
theme_advanced_buttons2_add_before: "cut,copy,paste,separator,search,replace,separator",
theme_advanced_buttons3_add_before : "tablecontrols,separator",
theme_advanced_buttons3_add : "emotions,iespell,flash,advhr,separator,print",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_path_location : "bottom",
plugin_insertdate_dateFormat : "%Y-%m-%d",
plugin_insertdate_timeFormat : "%H:%M:%S",
extended_valid_elements : "a[name|href|target|title|onclick],img[class|src|border=0|alt|title|hspace|v
space|width|height|align|onmouseover|on
ouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[clas
s|align|style]",
external_link_list_url : "example_data/example_link_list.js",
external_image_list_url : "example_data/example_image_list.js",
flash_external_list_url : "example_data/example_flash_list.js"
}) ;
plik HttpClient.js:
function HttpClient() {}
HttpClient.prototype = {
// typ get lub posr przekazany do metody open
requestType:'POST',
// jeśli ta zmienna ma wartość true wykonywane są wywołania asynchroniczne
isAsync:false,
// gdzie przechowywany jest egzemplarz obiektu XMLHttpRequest?
xmlhttp:false,
// jaka funkcja jest wywoływana po zakończonym powodzeniem wywołaniu asynchronicznym?
callback:false,
// jaka funkcja jest wywoływana po wykonaniu metody send obiektu XMLHttpRequest?
// Użyj własnej funkcji dla zdarzenia onSend, aby zastosować niestandardowy efekt wczytania.
onSend:function() {
document.getElementById('HttpClientStatus').style.display = 'block';
},
// Funkcja wywołana, kiedy readyState ma wartość 4; jest ona
// uruchamiana przed wywołaniem zwrotnym (callback).
onLoad:function() {
document.getElementById('HttpClientStatus').style.display = 'none';
},
// funkcja wywołana po wystąbłędu http.
onError:function(error) {
alert(error);
},
// metoda inicjiującobiekt XMLHttpRequest
init:function() {
try {
// Mozilla, Safari
this.xmlhttp = new XMLHttpRequest();
} catch (e) {
// Internet Explorer
var XMLHTTP_IDS = new Array('MSXML2.XMLHTTP.5.0',
'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP');
var success = false;
for(var i=0; i<XMLHTTP_IDS.length && !success; i++) {
try {
this.xmlhttp = new ActiveObject(XMLHTTP_IDS[i]);
success = true;
} catch (e) {}
}
if(!success) {
this.onError('Nie można utworzyć obiektu XMLHttpRequest.');
}
}
},
// Metoda zgłaszająca żądanie strony
// @param string url - strona, do której kierowane jest żądanie
// @param string payload - wysyłane dane, jęsli jest to żądanie typu POST
// @divId - identyfikator bloku, który ma zostać zmieniony (w którym mają pobrane dane)
makeRequest:function(url, payload, divId) {
if(!this.xmlhttp) {
this.init();
}
this.xmlhttp.open(this.requestType, url, this.isAsync);
this.xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// tu należy ustawić onreadystatechange, ponieważ w Mozilli stan zostanie wyzerowany
// po zakończeniu wywołania.
var self = this;
this.xmlhttp.onreadystatechange = function() {
self._readyStateChangeCallback(divId); }
this.xmlhttp.send(payload);
if(!this.isAsync) {
return this.xmlhttp.responseText;
}
},
// wewnętrzna metoda służąca do obsługi zmian stanu.
_readyStateChangeCallback:function(divId) {
switch(this.xmlhttp.readyState) {
case 2 :
this.onSend();
break;
case 4 :
this.onLoad();
if(this.xmlhttp.status == 200) {
this.callback(this.xmlhttp.responseText, divId);
} else {
this.onError('Błąd HTTP w czasie zgłaszania żądania: '+
'['+this.xmlhttp.status+']'+
''+this.xmlhttp.statusText);
}
break;
}
}
}
oraz plik funkcje.js ze skryptem odbierającym:
var client3 = new HttpClient();
client3.isAsync = true;
client3.callback = function(result, divId) {
eval(document.getElementById(divId).innerHTML = result);
}
function admin_str(link, divId, divId1, divId2) {
var myRand = parseInt(Math.random()*99999999);
var url = 'admin/include/test1.html?random='+myRand;
client3.makeRequest(url, null, divId1);
document.getElementById(divId).style.display = 'none';
}
wolne parametry funkcji "admin_str(link, divId, divId1, divId2)" choć częściowo nie wykorzystywane nie są problemem - sprwdzałem
Problem w tym, że po przekazaniu za pomocą ajax plikt html z kodem html i js wyświetla się jedynie pole <textarea>.
Przy próbie wyświetlenia samego pliku do przesłania (edytor+textarea) wszystko jest ok.
Być może coś jest nie tak z użyciem funkcji eval() a może coś innego.
Proszę o wskazówki i pomoć
Pozdrawiam
Ten post edytował Pretroch 10.08.2008, 19:12:13