#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: '\ ', 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.' + id + ' \
Ответы
Ответ 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.
Комментариев нет:
Отправить комментарий