Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

“Недопустимый вызывающий объект” при вызове функции

#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.

Комментариев нет:

Отправить комментарий