#javascript #jquery
Есть следующая функция:
function SendDataToController(d) {
$.ajax({
url: "Index",
type: "POST",
datatype: "JSON",
contentType: "application/json; charset=utf-8",
data: d,
success: function(result) {
alert("Data was send to the controller");
},
error: function(err) {
alert("Error: data was not send to the controller");
}
});
alert(d);
}
Она расположена в файле SendDataToController.js и вызывается в другой функции (файл
SendPassportToService.js):
$(document).ready(function() {
$('tr').click(function() {
id = $(this).attr('id');
$.soap({
url: "http://localhost:8123/C_M_Service/",
method: "OrdersByPassport",
SOAPAction: "http://localhost:8123/C_M_Service/OrdersByPassport",
soap11: true,
data: '\
' + id + ' \
',
error: function (soapresponse) {
alert("Oh no is error: " + soapresponse.toString());
},
success: function (result) {
alert("OK " + result);
SendDataToController(result);
}
});
});
});
Добавил скрипты к странице следующим образом:
При срабатывании скрипта из SendPassportToService.js появляется ошибка "Недопустимый
вызывающий объект" в функции SendDataToController. Как исправить данную ошибку?
Обновление
Данные доходят до указанного адреса, так что обмен данными есть. Ошибка происходит
в файле jquery-2.1.3.js:
Необработанное исключение в строке 8453, столбце 4 в http://localhost:61327/jquery-2.1.3.js
Браузер IE10.
Ответы
Ответ 1
Точно сказать что именно падает без нормального респонса от сервера сложно, но судя по всему проблема в том, что вы берете результат вызова $.soap и пытаетесь передать его как json (вызовом $.ajax). Результат вызова $.soap - это скорее всего SOAPResponse с вложенным XMLDocument - т.е. достаточно сложный объект, с методами и прочим. А JQuery надо передать его как JSON - строку. JQuery преобразует объект в строку достаточно тупо - просто бежит по всем его свойствам, заходя во вложенные объекты. Если какое-то свойство - это функция, то JQuery вызывает ее и сериализует результат. Это делается как раз в строке 8453. Вот только вызывается функция не в контексте объекта, а просто в текущем контексте: add = function( key, value ) { // If value is a function, invoke it and return its value value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); }; вызов value() - это и есть проблемное место. В JS нельзя просто так взять и вызвать функцию. Если у вас есть объект obj и у него есть метод someMethod(), то вот такой вызов валиден: obj.someMethod(); Но если вы напишете в коде var m = obj.someMethod; m(); То на самом деле выполнится следующий код: var m = obj.someMethod; this.m(); т.е. метод полностью отрывается от первоначального контекста. и если у this не окажется метода m, то в IE9+ он упадет с ошибкой "Недопустимый вызывающий объект". Потому такой код скорее всего ошибочен - очень маловероятно что someMethod ожидает у себя внутри какой-то левый this вместо obj. Правильный способ вызывать такие методы - call или bind: m.call(obj); // или var m = obj.someMethod.bind(obj); m(); JQuery рассчитывает что если при сериализации в объекте и будут свойства, ссылающиеся на методы - то они будут прибайнджены к нужному контексту. В вашем случае код jquery править не стоит, нужно просто передавайть в ajax объект попроще, а не весь SOAPResponse.
Комментариев нет:
Отправить комментарий