Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как передать объект в функцию. (https://javascript.ru/forum/jquery/52876-kak-peredat-obekt-v-funkciyu.html)

Dtri 11.01.2015 06:09

Как передать объект в функцию.
 
Здравствуйте.

function f( type, url, data, arr)    {
       
        $.ajax({
                type: type,
                url: url,
                data: data,
                success: function (jsonVars) {
                    varForID = arr;   // при вызове должно быть: varForID = jsonVars.doctor;
                    alert(varForID);
                },
                complete: function()    {
                    $('#'+id).trigger('dropDownLoaded');
                }
        });
        return  varForID;
    }


вызываю функцию:
autocomleteRemovedArrWatcher('doctor', 'GET', '/getSecondParams', sendFormAb($('#serviceType_1').val()), arr);


не знаю что нужно написать в "arr", чтобы обратиться внутри объекта, который получаю от сервера, к элементу doctor.

при подстановке arr в
varForID = arr;

должно получиться
varForID = jsonVars.doctor;

danik.js 11.01.2015 09:31

Че сказал? Сам хоть понял?
Одно можно сказать - у тебя ошибка логическая:
Цитата:

Сообщение от Dtri
return varForID;

Ты пытаешься из функции вернуть значение, которое еще не успело придти с сервера (запрос к серверу идет очень долго, и поток исполнения кода не блокирует (асинхронно выполняется то есть), поэтому функция success выполняется позже функции f() )

nerv_ 11.01.2015 11:18

Цитата:

Сообщение от danik.js
Одно можно сказать - у тебя ошибка логическая

Наверно, раз в день этот вопрос задают. Надоели уже :)
http://javascript.ru/forum/misc/9459...tml#post174893

bes 11.01.2015 12:52

Цитата:

Сообщение от nerv_
Наверно, раз в день этот вопрос задают. Надоели уже

каждый в своей жизни должен создать тему с этим вопросом :D

Цитата:

Сообщение от nerv_
ЧаВО - часто задаваемые вопросы (faq)

если Gozar добавит этот вопрос в первый пост, то есть небольшая вероятность, что количество вопросов уменьшится,
а так там уже 8 страниц накапало (у меня по 20 постов на страницу), я бы не стал читать, вообще непонятна логика создания факов с х-евой тучей страниц без оглавления, по мне так любому должно быть влом хотя бы перелистать эти все страницы, даже не читая

Dtri 11.01.2015 17:09

вы не на то обратили внимание в посте. Но да ладно. Зато вы указали на ошибку в коде ту которую проглядел.
Вопрос был изначально в другом. Но уже нашёл решение.

jsonVars.doctor
можно заменить на
jsonVars['doctor']


и тогда 'doctor' можно передавать в функцию как строку.

function (Str) {
 jsionVars[Str]
}

Dtri 11.01.2015 19:47

function autocomleteRemovedArrWatcher(id, type, url, data, arr)  {
    var varForID;
    var arrObj;
    function f( type, url, data, arr)    {
        $.ajax({
                type: type,
                url: url,
                data: sendFormAb($(data).val()),
                async: false,
                success: function (jsonVars) {
                    //jsonVars[arr] instanceof Object?alert(sendFormAb(jsonVars[arr])):{}
                    if  (jQuery.type(jsonVars[arr]) !== 'object') {
                      varForID = jsonVars[arr]
                    } else  {
                        //alert([jsonVars[arr]].join('\n'))
                        var keys = new Array();
                        for (var key in jsonVars[arr]) {
                            keys.push(key);
                        }
                        varForID = keys;
                        arrObj = jsonVars[arr];
                    }
                },
                complete: function()    {
                    $('#'+id).trigger('dropDownLoaded');
                }
        });
        return  [varForID, arrObj]; // обратите внимание сюда
    }
    function f0()   {
        $('#'+id).focus();
    }
    function f1(id){
        if($('.autoCompleteInput_'+id).length==0) {
            $('<div class="autoCompleteInput autoCompleteInput_'+id+'"  style="width:'+(($('#'+id).width())*1+20*1)*1+'px;">').insertBefore('#'+id);
            $('#'+id).appendTo('.autoCompleteInput_'+id);
            $('#'+id).after('<div class="dropDownList dropDownList_'+id+'" style="width:'+$('#'+id).css('width')+';"></div>');
        }else    {
            $('.dropDownList_'+id).show();
        }
    }
    function f2(arr, id)   {
        $('.dropDown_'+id).remove();
        for (var i in arr)  {

            if  ((arr[i].indexOf($('#'+id).val())!==-1)&&(arr[i]!==''))  {
                $('.dropDownList_'+id).append('<div class="dropDown dropDown_'+id+'">'+arr[i]+'</div>');
            }
        }
    }
    function f3(id)    {
        $('.dropDown_'+id).on('mousedown', function(){
           $('#'+id).val( $(this).html()).trigger('changed');
           $('#'+id).trigger('inputDropDownClick');
        });
        $('#'+id).on('blur', function(){
            $('.dropDownList_'+id).hide();
        });
    }
    function f4(id)   {
        $('#'+id).on('inputDropDownClick', function(){
            $('.dropDownList_'+id).hide();
        });
    }
    function f5()   {
        $('#'+id).trigger('changed');
    }
    $('#'+id).on({
        click: function()   {
            f(type, url, data, arr);
        },
        dropDownLoaded: function()  {
            f1(id);
            f2(varForID, id);
            f3(id);
            f4(id);
            f0();
        },
        keyup: function()   {
            f1(id);
            f2(varForID, id);
            f3(id);
            f4(id);
            f5();
        }

    });
return  [varForID, arrObj]; // обратите внимание сюда    
}



autocomleteRemovedArrWatcher('service_2', 'GET', '/getFifthParams', '#serviceType_2', 'service');


не получается при обращении к функции получить этот arrObj

консоль пишет. arrObj is not defined. подскажите. что делаю непраильно или помогите ссылкой где прочитать?

bes 11.01.2015 19:53

Цитата:

Сообщение от Dtri
вы не на то обратили внимание в посте. Но да ладно. Зато вы указали на ошибку в коде ту которую проглядел.

Цитата:

Сообщение от Dtri
return  [varForID, arrObj]; // обратите внимание сюда   

и зачем туда обращать внимание?

Dtri 11.01.2015 20:10

Цитата:

Сообщение от bes (Сообщение 350889)
и зачем туда обращать внимание?

чтобы легче было разобраться, в том что я спрашивать буду ниже.

я вышел из положения объявив переменные глобально к которым присваиваю результат внутри функций. Это помогло.

оказалось return вообще не нужен.

в данном вопросе. Как оно обычно и бывает. пока писал пост уже решил проблему)))

Но спасибо за внимание.

вот как выглядит код теперь. если интересно:

var arrObj;

function autocomleteRemovedArrWatcher(id, type, url, data, arr)  {
    var varForID;

    function f( type, url, data, arr)    {
        $.ajax({
                type: type,
                url: url,
                data: sendFormAb($(data).val()),
                async: false,
                success: function (jsonVars) {
                    //jsonVars[arr] instanceof Object?alert(sendFormAb(jsonVars[arr])):{}
                    if  (jQuery.type(jsonVars[arr]) !== 'object') {
                      varForID = jsonVars[arr]
                    } else  {
                        //alert([jsonVars[arr]].join('\n'))
                        var keys = new Array();
                        for (var key in jsonVars[arr]) {
                            keys.push(key);
                        }
                        varForID = keys;
                        arrObj = jsonVars[arr];
                    }
                },
                complete: function()    {
                    $('#'+id).trigger('dropDownLoaded');
                }
        });
    }
    function f0()   {
        $('#'+id).focus();
    }
    function f1(id){
        if($('.autoCompleteInput_'+id).length==0) {
            $('<div class="autoCompleteInput autoCompleteInput_'+id+'"  style="width:'+(($('#'+id).width())*1+20*1)*1+'px;">').insertBefore('#'+id);
            $('#'+id).appendTo('.autoCompleteInput_'+id);
            $('#'+id).after('<div class="dropDownList dropDownList_'+id+'" style="width:'+$('#'+id).css('width')+';"></div>');
        }else    {
            $('.dropDownList_'+id).show();
        }
    }
    function f2(arr, id)   {
        $('.dropDown_'+id).remove();
        for (var i in arr)  {

            if  ((arr[i].indexOf($('#'+id).val())!==-1)&&(arr[i]!==''))  {
                $('.dropDownList_'+id).append('<div class="dropDown dropDown_'+id+'">'+arr[i]+'</div>');
            }
        }
    }
    function f3(id)    {
        $('.dropDown_'+id).on('mousedown', function(){
           $('#'+id).val( $(this).html()).trigger('changed');
           $('#'+id).trigger('inputDropDownClick');
        });
        $('#'+id).on('blur', function(){
            $('.dropDownList_'+id).hide();
        });
    }
    function f4(id)   {
        $('#'+id).on('inputDropDownClick', function(){
            $('.dropDownList_'+id).hide();
        });
    }
    function f5()   {
        $('#'+id).trigger('changed');
    }
    $('#'+id).on({
        click: function()   {
            f(type, url, data, arr);
        },
        dropDownLoaded: function()  {
            f1(id);
            f2(varForID, id);
            f3(id);
            f4(id);
            f0();
        },
        keyup: function()   {
            f1(id);
            f2(varForID, id);
            f3(id);
            f4(id);
            f5();
        }
    });
}



вызов функции:
autocomleteRemovedArrWatcher('service_2', 'GET', '/getFifthParams', '#serviceType_2', 'service');


$('#service_1').on('blur', function () {
alert(arrObj[$('#service_1').val()]);
});

Dtri 11.01.2015 20:11

Если есть критика или замечания по оптимизации или другим ошибкам. буду благодарен если укажите.

bes 11.01.2015 20:18

Цитата:

Сообщение от Dtri
чтобы легче было разобраться, в том что я спрашивать буду ниже.

я вышел из положения объявив переменные глобально к которым присваиваю результат внутри функций. Это помогло.

оказалось return вообще не нужен.

вообще-то тебе сразу сказали - логическая ошибка


Цитата:

Сообщение от Dtri
Если есть критика или замечания по оптимизации или другим ошибкам. буду благодарен если укажите.

без тестового кода, мало кому интересно, что ты там нагородил, твой пример - не тестовый код, может быть выдержка из него
тестовый пример - это когда запустил и что-то получил/не получил, если есть ошибки


Часовой пояс GMT +3, время: 11:26.