Да, я думаю, что зарегистрировать обработчик ajax для одного канала - это хороший способ, потому что им легче управлять, у вас будет меньше избыточного кода и меньше эффектов загрузки. Если я смотрю на ваши комментарии к коду, кажется, что ответ не такой, как вы ожидаете. Я использую это для управления группой запросов AJAX, используя серверный скрипт. Я строю один объект запроса, как:
// myscript.js
var rqPHP = {
url:'php/dispatcher.php', type:'POST', dataType:'json',
success:function(json, status, jXHR){
//console.log('rqPHP.succes : ', json);
if(!json) return console.warn('[rqPHP.success] json is null');
if(!json.cmd) return console.warn('[rqPHP.success] json.cmd is null');
if(!json.res) return console.warn('[rqPHP.success] json.res is null');
if(json.err && json.err.length){ console.warn('[rqPHP.success errors cmd:'+json.cmd+'] '+json.err);}
// so if no errors, dispatch actions based on original command asked
switch(json.cmd){
case 'loadfile' :
// do whatever with response
break;
case 'savefile' :
// do whatever with response
break;
}
},
error:function(jXHR, status, err){
console.warn('[rqPHP.error] ', status,',',err,',',jXHR.responseText);
}
};
тогда, когда использование этого объекта затрагивает всю мою группу различных действий, я точно указываю, какое действие и аргументы я передаю. Я использую запрос данных JSON, чтобы получить простой ответ на анализ, чтобы я мог вернуть исходную запрашиваемую команду и некоторые подробности об ошибках, которые могут произойти, например, и когда мне нужно выполнить запрос:
// myscript.js
rqPHP.data = {'cmd':'loadfile', 'filename':'file.dat', 'arg2':'other argument'};
$.ajax(rqPHP);
Тогда пример одного серверного скрипта, который ответит:
// dispatcher.php
$pv = $_POST;
$res = '';
$err = array();
// you check the command asked for :
switch(strtolower($pv['cmd'])){
case 'savefile' :
// do whatever
break;
case 'loadfile' :
// do whatever
if(any error){
$err[] = $loadError;// push error with whatever details you'll retrieve in javascript
}else{
$res = ',"res":"'.$dataLoaded.'"';// format json response so you'll check the var exist
}
break;
}
$jsonRes = '{"cmd":"'.$pv['cmd'].'"'.$res.',"err":"'.implode('|', $err).'"}';// json result
print $jsonRes;
Это могут быть некоторые ошибки, это только для принципа, я надеюсь, что это поможет, только несколько последних советов:
- вам лучше использовать requestObject.data для передачи любых аргументов, а не устанавливать URL, как вы это сделали, это гораздо проще, потому что jQuery правильно выполняет кодирование
- вы можете использовать POST, чтобы URL оставался чистым, а почтовые переменные скрыты
- в вашем случае, поскольку вы можете захотеть централизовать действия сервера с помощью ОДНОГО серверного скрипта, вы должны использовать 'json' в качестве dataType, потому что гораздо проще получать подробности из ответа, например, таких ошибок. Вы должны различать ошибку ajax, которая возникает, когда URL-адрес не существует, или доступ запрещен, хорошо, когда сервер отвечает, что он просто не может ответить на этот запрос, и различать правильный ответ вашего серверного скрипта, я имею в виду Сценарий отвечает хорошо, но может произойти ошибка команды, например, для команды «loadfile», аргумент fileUrl может быть неправильным или нечитаемым, поэтому действие выполнено, но ответ не будет действительным для вас ...
Если вы планируете запускать много загрузок для разных частей (я имею в виду, что вы можете не ждать ответа для ajax перед загрузкой нового), лучше установить основные функции успеха и ошибок для сохранения централизации, а затем собрать один новый объект запроса каждый раз, когда вы делаете загрузку
function rqSuccess(json, status, jXHR){
// put same checking code as before, then you can also retrieve some particular variables
// here, 'this' should correspond to the request object used for the $.ajax so :
console.log('myTarget is : ', this.myTarget, ' , myVariable is : ', this.myVariable);
}
function rqError(jXHR, status, err){
// put same checking code
}
// then each time you want make one or many independant calls, build a new request object
var myRq = {url:'dispatcher.php',type:'POST',dataType:'json',
success:rqSuccess,
error:rqError,
myTarget:$('#myblock'),// any variable you want to retrieve in response functions
myVariable:'Hello !',// after all it is an object, you can store anything you may need, just be carefull of reserved variables of the ajax object (see jQuery $.ajax doc)
// the data object is sanitized and sended to your server script, so put only variables it will need
data : {'cmd':'loadfile',...}
}
$.ajax(myRq);
// you may load an other independant one without waiting for the response of the first
var myRq2 = {...myTarget:$('#anotherblock'), data:{'cmd':'anotheraction'}...}
$.ajax(myRq2);