Добрый вечер дорогие форумчане. Подскажите пожалуйста, почему при попытке отправить ajax запрос, у меня выскакивает alert из error??? Всю голову уже сломал, весь интернет уже перерыл.
2) И почему после того как я нажимаю ок в alert у меня перезагружается страница??
шаблон
{% extends "crm/main_struct.html" %}
{% load staticfiles %}
{% block content %}
<!--ОБЯЗАТЕЛЬНО СДЕЛАТЬ ФУНКЦИЮ НА JS КОТОРАЯ БУДЕТ ВЫЧИСЛЯТЬ ОТСТУПЫ И В НУЖНОЕ МЕСТО ПИХАТЬ КОНТЕНТ САЙТОВ-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script>
$(document).ready(function() {
$('ul.tabs_m_w').each(function() {
$(this).find('li').each(function(i) {
$(this).click(function() {
$(this).addClass('active').siblings().removeClass('active');
var p = $(this).parents('div.tabs_container_m_w');
p.find('div.tab_container_m_w').hide();
p.find('div.tab_container_m_w:eq(' + i + ')').show();
});
});
});
})
</script>
<a href="{{url}}/crm/my_work/new/" class="add_notebook_a">
<div class="add_notebook">Добавить</div>
</a>
<div class="tabs_container_m_w">
<ul class="tabs_m_w">
{% for notebook in notebookList %}
<li class="inl-bl_m_w">
<div class="m_w_list_head">{{notebook.name}}</div>
<div class="m_w_list_date">{{notebook.date_firstly}}</div>
<div class="m_w_list_kr_info">{{notebook.kr_info}}</div>
</li>
{% endfor %}
</ul>
{% for notebook in notebookList %}
<div class="tab_container_m_w">
<a href="" onclick="resend({{notebook.id}});" class="a_tab">
<div class="m_w_save">
Сохранить
</div>
</a>
<div class="m_w_info_head" id="name{{notebook.id}}" contentEditable="true">{{notebook.name}}</div>
<div class="m_w_info_info" id="info{{notebook.id}}" contentEditable="true">{{notebook.information}}</div>
</div>
{% endfor %}
</div>
<script>
function resend(pk){
var name = document.getElementById('name' + pk).innerHTML.trim().replace(/<.*?>/g, "");
var info = document.getElementById('info' + pk).innerHTML.trim().replace(/<.*?>/g, "");
edit(name, info, pk);
}
</script>
<script>
function edit(name, info, pk) {
// Если поля заполнены, отправляем их значения
$.ajax({
error: function() {
alert('Ошибка получения запроса');
},
// При успехе очищаем поля и меняем кнопочку
success: function(data) {
alert("Успех"); // для проверки, что скрипт работает
},
// CSRF механизм защиты Django
beforeSend: function(xhr, settings) {
console.log('-------------before send--');
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
}
}
});// ajax
return false;
};
</script>
{% endblock %}
urls.py
urlpatterns = patterns('',
url(r'^my_work/edit/$', views.NBEdit, name='crm_edit_NB'),
)
views.py
def NBEdit(request):
if request.is_ajax():
for i in MyDela.objects.filter(pk=request.POST.get("id", "")):
i.name = request.POST.get("name", "")[:250]
i.information = request.POST.get("info", "")
i.save()
# return HttpResponse("ok")
return HttpResponseRedirect('/crm/sites/')
else:
# return HttpResponse("bad")
return HttpResponseRedirect('/crm/zayvki/')
Прошу не кидаться помидорами, я только учусь кодить))
This is a tutorial on how to handle errors when making Ajax requests via the jQuery library. A lot of developers seem to assume that their Ajax requests will always succeed. However, in certain cases, the request may fail and you will need to inform the user.
Here is some sample JavaScript code where I use the jQuery library to send an Ajax request to a PHP script that does not exist:
$.ajax({ url: 'does-not-exist.php', success: function(returnData){ var res = JSON.parse(returnData); }, error: function(xhr, status, error){ var errorMessage = xhr.status + ': ' + xhr.statusText alert('Error - ' + errorMessage); } });
If you look at the code above, you will notice that I have two functions:
- success: The success function is called if the Ajax request is completed successfully. i.e. If the server returns a HTTP status of 200 OK. If our request fails because the server responded with an error, then the success function will not be executed.
- error: The error function is executed if the server responds with a HTTP error. In the example above, I am sending an Ajax request to a script that I know does not exist. If I run the code above, the error function will be executed and a JavaScript alert message will pop up and display information about the error.
The Ajax error function has three parameters:
- jqXHR
- textStatus
- errorThrown
In truth, the jqXHR object will give you all of the information that you need to know about the error that just occurred. This object will contain two important properties:
- status: This is the HTTP status code that the server returned. If you run the code above, you will see that this is 404. If an Internal Server Error occurs, then the status property will be 500.
- statusText: If the Ajax request fails, then this property will contain a textual representation of the error that just occurred. If the server encounters an error, then this will contain the text “Internal Server Error”.
Obviously, in most cases, you will not want to use an ugly JavaScript alert message. Instead, you would create an error message and display it above the Ajax form that the user is trying to submit.
JQuery 3.0: The error, success and complete callbacks are deprecated.
Update: As of JQuery 3.0, the success, error and complete callbacks have all been removed. As a result, you will have to use the done, fail and always callbacks instead.
An example of done and fail being used:
$.ajax("submit.php") .done(function(data) { //Ajax request was successful. }) .fail(function(xhr, status, error) { //Ajax request failed. var errorMessage = xhr.status + ': ' + xhr.statusText alert('Error - ' + errorMessage); })
Note that always is like complete, in the sense that it will always be called, regardless of whether the request was successful or not.
Hopefully, you found this tutorial to be useful.
Can you post the signature of your method that is supposed to accept this post?
Additionally I get the same error message, possibly for a different reason. My YSOD talked about the dictionary not containing a value for the non-nullable value.
The way I got the YSOD information was to put a breakpoint in the $.ajax function that handled an error return as follows:
<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
$.ajax({
type:'POST',
url:url,
data:message,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success:successFunc,
error:errorFunc
});
};
Then my errorFunc javascript is like this:
function(request, textStatus, errorThrown) {
$("#install").text("Error doing auto-installer search, proceed with ticket submissionn"
+request.statusText); }
Using IE I went to view menu -> script debugger -> break at next statement.
Then went to trigger the code that would launch my post. This usually took me somewhere deep inside jQuery’s library instead of where I wanted, because the select drop down opening triggered jQuery. So I hit StepOver, then the actual next line also would break, which was where I wanted to be. Then VS goes into client side(dynamic) mode for that page, and I put in a break on the $("#install")
line so I could see (using mouse over debugging) what was in request, textStatus, errorThrown. request. In request.ResponseText there was an html message where I saw:
<title>The parameters dictionary contains a null entry for parameter 'appId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ContentResult CheckForInstaller(Int32)' in 'HLIT_TicketingMVC.Controllers.TicketController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>
so check all that, and post your controller method signature in case that’s part of the issue
Can you post the signature of your method that is supposed to accept this post?
Additionally I get the same error message, possibly for a different reason. My YSOD talked about the dictionary not containing a value for the non-nullable value.
The way I got the YSOD information was to put a breakpoint in the $.ajax function that handled an error return as follows:
<script type="text/javascript" language="javascript">
function SubmitAjax(url, message, successFunc, errorFunc) {
$.ajax({
type:'POST',
url:url,
data:message,
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success:successFunc,
error:errorFunc
});
};
Then my errorFunc javascript is like this:
function(request, textStatus, errorThrown) {
$("#install").text("Error doing auto-installer search, proceed with ticket submissionn"
+request.statusText); }
Using IE I went to view menu -> script debugger -> break at next statement.
Then went to trigger the code that would launch my post. This usually took me somewhere deep inside jQuery’s library instead of where I wanted, because the select drop down opening triggered jQuery. So I hit StepOver, then the actual next line also would break, which was where I wanted to be. Then VS goes into client side(dynamic) mode for that page, and I put in a break on the $("#install")
line so I could see (using mouse over debugging) what was in request, textStatus, errorThrown. request. In request.ResponseText there was an html message where I saw:
<title>The parameters dictionary contains a null entry for parameter 'appId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ContentResult CheckForInstaller(Int32)' in 'HLIT_TicketingMVC.Controllers.TicketController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.<br>Parameter name: parameters</title>
so check all that, and post your controller method signature in case that’s part of the issue
By Rod McBride
jQuery has a lot of methods to define and process AJAX requests in a convenient fashion, but one useful feature added to jQuery in version 1.0 is often overlooked by developers.
The ajaxError() method is a method that can serve as a centralized place for AJAX request error handling. In general, unexpected server responses are handled similarly as on a web page, such as when a notification or a modal dialogue appears to tell the user that something unexpected happened and the operation has failed.
By looking at the jQuery documentation for the AJAX convenience methods, like $.post and $.get, we notice that we can attach callback methods to successful and failed AJAX calls.
$.post(«/api/sendStuff», function () {
//… handle success
}).fail(function () {
//… handle failure and display notification
});
Having a way to handle errors on individual AJAX calls is a great way to fine-tune your JavaScript and deal with specific error scenarios close to their occurrences. However, being aware of a centralized AJAX error-handling routine could avoid scenarios similar to this:
$.post(«/api/operationA», function(){
//…
}).fail(function(jqXHR, textStatus, error){
handleError(error);
});
$.post(«/api/operationB», function(){
//…
}).fail(function(jqXHR, textStatus, error){
handleError(error);
});
$.post(«/api/operationC», function(){
//…
}).fail(function(jqXHR, textStatus, error){
handleError(error);
});
…
In this scenario, the developer created a sophisticated, dynamic, single-page application driven by a collection of AJAX requests and wrote a method that processes errors thrown by those AJAX requests. Technically, there isn’t anything wrong with this solution. However, it isn’t the most elegant approach and causes a lot of repeated code fragments.
We can get rid of all the redundant fail callbacks by defining the default behavior of the page in case an AJAX exception occurs with ajaxError(). The method needs to be attached to the document object and will serve as a centralized processing place for those types of AJAX scenarios:
$(document).ajaxError(function( event, jqxhr, settings, thrownError ) {
handleError(error);
});
This global handler will always fire upon an error situation regardless if there is a defined local fail callback. Consequently, the following code fragment will display both error notifications at the same time:
$(document).ajaxError(function( event, jqxhr, settings, thrownError ) {
showErrorNotificationA(error);
});
$.post(«/api/operationA», function(){
//…
}).fail(function(jqXHR, textStatus, error){
showErrorNotificationB(error);
});
To suppress the global error handler and prevent duplicate notifications requires adding some additional logic that gives more control over it.
One way to accomplish this is to define a flag in the settings of the AJAX request that determines whether the global error handler should fire.
The biggest disadvantage of this approach is that you can’t use $.post() and $.get() anymore for these kinds of requests, and we need to fall back to $.ajax() that gives more granular control over the request. Here is an example:
$(document).ajaxError(function( event, jqxhr, settings, thrownError ) {
if(!settings.suppressGlobalErrorHandler){
handleError(error);
}
});
$.ajax(«/api/operationA», {
suppressGlobalErrorHandler: true,
success: function(){
//…
},
error: function(jqXHR, textStatus, error){
//…
}
});
If you’d like to learn more about the AJAX error handling or have other jQuery or JavaScript questions, contact the technology consultants at Wipfli. You can also keep reading more of our technology-focused articles here.
SanychBY 39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
||||
1 |
||||
04.06.2013, 19:48. Показов 5404. Ответов 17 Метки нет (Все метки)
Здравствуйте. Есть код
Но по странным причинам срабатывает функция ошибки хотя сам запрос успешно передается(я уверен в это, потому что происходит запись в базу данных)
__________________
0 |
странник 810 / 481 / 108 Регистрация: 28.05.2012 Сообщений: 1,518 Записей в блоге: 2 |
|
04.06.2013, 20:30 |
2 |
ну так может в самом articlejs.php какие-то ошибки? в результате ответ не приходит от сервера и ajax обрбатывает запрос как ошибку.
0 |
SanychBY 39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
||||
04.06.2013, 20:36 [ТС] |
3 |
|||
ну так может в самом articlejs.php какие-то ошибки? в результате ответ не приходит от сервера и ajax обрбатывает запрос как ошибку. Сервер отвечает
0 |
Donald28 странник 810 / 481 / 108 Регистрация: 28.05.2012 Сообщений: 1,518 Записей в блоге: 2 |
||||
04.06.2013, 20:39 |
4 |
|||
посмотрите через хром ответ сервера: правой клавишей «просмотреть код элемента» и далее вкладка Network, после это сделайте действие которое вызывает ваш ajax запрос и если вы отправляете в формате json, то надо получать его так:
1 |
39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
|
04.06.2013, 20:44 [ТС] |
5 |
посмотрите через хром ответ сервера: правой клавишей «просмотреть код элемента» и далее вкладка Network, после это сделайте действие которое вызывает ваш ajax запрос посмотрел Что странно что type text/html
0 |
странник 810 / 481 / 108 Регистрация: 28.05.2012 Сообщений: 1,518 Записей в блоге: 2 |
|
04.06.2013, 20:46 |
6 |
ну все пришло. значит должно работать. Что пишется в алерте?
1 |
SanychBY 39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
||||
04.06.2013, 20:48 [ТС] |
7 |
|||
сделал как Вы сказали но функция ошибки по прежнему срабатывает
0 |
странник 810 / 481 / 108 Регистрация: 28.05.2012 Сообщений: 1,518 Записей в блоге: 2 |
|
04.06.2013, 20:53 |
8 |
Что пишется в алерте? и также посмотрите через браузер что пришло от сервера (кликните по articlejs.php)
1 |
39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
|
04.06.2013, 21:01 [ТС] |
9 |
Что пишется в алерте? Алерт «ошибки»
и также посмотрите через браузер что пришло от сервера (кликните по articlejs.php)
0 |
Soldado 901 / 833 / 198 Регистрация: 28.06.2012 Сообщений: 1,607 Записей в блоге: 4 |
||||||||||||
04.06.2013, 21:19 |
10 |
|||||||||||
В строке 5 — что за а? Выдаёт синтаксическую ошибку и не число и не строка
XMLHttpRequest — это объект, зачем помещать его val ? Если
Всё работает.
0 |
SanychBY 39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
||||
04.06.2013, 21:22 [ТС] |
11 |
|||
В строке 5 — что за а?
XMLHttpRequest — это объект, зачем помещать его val ? Просто такЯ же только учусь
0 |
Soldado 901 / 833 / 198 Регистрация: 28.06.2012 Сообщений: 1,607 Записей в блоге: 4 |
||||||||
04.06.2013, 21:27 |
12 |
|||||||
Почему не делаете как Вам говорят, а упорно гнёте свою линию
articlejs.php
1 |
SanychBY 39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
||||
04.06.2013, 21:42 [ТС] |
13 |
|||
data:{text:text,a:’a’} Зачем a в кавычках??? Добавлено через 3 минуты
Почему не делаете как Вам говорят, а упорно гнёте свою линию А Вы объясните где ошибка в моем коде, а потом уже предлагайте свой. Моя ошибка мне более интересна. Тем более что у Вас то же скорее всего ошибка
Не работает
0 |
Soldado 901 / 833 / 198 Регистрация: 28.06.2012 Сообщений: 1,607 Записей в блоге: 4 |
||||
04.06.2013, 21:43 |
14 |
|||
В том коде, что Вы выложили, нет изначально
Чтобы небыло ошибки я передаю букву ‘a’ — это, в данном случае не суть важно, данные всё равно не обрабатываются в articlejs.php
0 |
39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
|
04.06.2013, 21:46 [ТС] |
15 |
В том коде, что Вы выложили, нет изначально Просто думал что это не столь важно
данные всё равно не обрабатываются в articlejs.php Они обрабатываются и записываются в базу данных на сервере(articlejs.php я тоже не весь код выложил) только вот что то с ajaxом наверно
0 |
Soldado 901 / 833 / 198 Регистрация: 28.06.2012 Сообщений: 1,607 Записей в блоге: 4 |
||||||||
04.06.2013, 22:00 |
16 |
|||||||
alert(data.rez);
Не работает Работает
Вот тоже самое, но PHP уже такой:
А Вы объясните где ошибка в моем коде, Так объяснили вроде
1 |
39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
|
04.06.2013, 22:42 [ТС] |
17 |
И вы хотите сказать что проблемы из за ответа сервера? Добавлено через 11 минут
Вот тоже самое, но PHP уже такой: если PHP такое то нужно добавить обработчик который разберет строку JSON например JSON.parse()
0 |
SanychBY 39 / 46 / 3 Регистрация: 04.06.2013 Сообщений: 1,532 |
||||
05.06.2013, 23:55 [ТС] |
18 |
|||
Вот весь PHP. МОжет это как то поможет
0 |