JS не объекты сохраняются в DOM? - PullRequest
0 голосов
/ 06 июня 2011

У меня есть этот скрипт, работающий с jquery и uploadify

      $('#uploader').uploadify({
    'uploader'  : '/admin/includes/uploadify/uploadify.swf',
    'script'    : '/admin/includes/uploadify/uploadify_storage.php',
     'scriptData': {'sessionId': sessionId},
    'cancelImg' : '/admin/includes/uploadify/cancel.png',
     'buttonImg'   : '/site_images/add_files.png',
    'folder'    :  storage,
    'auto'      : false,
    'multi'     : true,
    'fileExt'     : '*.jpg',
    'simUploadLimit' : 2,
    'wmode': 'transparent',
    'width': '150',
    'height': '20',
    'removeCompleted': false,
    'queueID'        : 'upload_queue',
    'onComplete'  : function(event, ID, fileObj, name,response, data) {

                             console.log(path);
             console.log(sub_ul);       
        }
  });

//code//


    $("li.dir > span.name").live('click', function(){
         $("span").removeClass("selected");
        var li = $(this).parent();
        var root  = $(li).attr("title");
        var folder  = $(li).find("span.name").html();
        var path = root+"/"+folder;
        path = path.replace('//', '/');
        var sub_ul = $(li).find("> ul.sub_folder");
                    set_path(sub_ul);
        $(this).addClass("selected");
    });

в основном, когда вы нажимаете на диапазон с .name, он запускает код, который получает var sub_ul = $(li).find("> ul.sub_folder");, который работает (отправляется на set_path()). Во второй раз, когда я запускаю uploadify в конце на OnComplete, console.log(path); показывает правильное значение, но console.log(sub_ul); ничего не возвращает (тоже предупреждение), как объект не указан. Я не могу использовать объекты после запуска JS? Разве они не сохраняются в DOM, как path делает?

1 Ответ

2 голосов
/ 06 июня 2011
  1. В опубликованной вами функции onComplete вы регистрируете ul_sub, а не sub_ul, как вам кажется.

  2. Если в set_path() не задано значение для глобальной переменной с именем path, я не вижу, как вы могли бы получить одно и то же значение в этих двух разных функциях - переменная path внутри * Обработчик 1015 * относится к этой функции и не будет доступен в другом месте. То же самое касается sub_ul.

  3. Я не могу использовать объекты после запуска JS? Разве они не сохраняются в DOM, как путь?

    Я не совсем уверен, что с этим делать, объекты JavaScript не «сохраняются в DOM». Если вы не можете получить доступ к созданному вами объекту, тогда контекст должен отличаться от того, в котором был создан объект, - теперь он должен быть вне области и, следовательно, недоступен. Использование закрытия является одним из способов сохранить функции и переменные доступными. Использование глобальных переменных - еще один способ сделать это, но это не рекомендуется, и его следует избегать, если в этом нет крайней необходимости.


Возможно, вы захотите прочитать эти статьи о области видимости в JavaScript, чтобы лучше понять, как все это работает:


Вы упомянули в комментариях, что создали глобальную path переменную, но не sub_ul. Один из простых способов «исправить» ваш код - использовать глобальные переменные. Но опять же, использование глобальных переменных, как правило, не рекомендуется, так как вы можете в конечном итоге загрязнить глобальное пространство имен.

И, не видя больше вашего кода, трудно сказать, будет ли он всегда работать правильно - например, ваш скрипт загрузки может быть вызван событиями, которые не приводят к установке значений path и sub_ul , что будет означать, что при запуске функции onComplete она получит неправильные значения для обоих.

//global vars
var path;
var sub_ul;

$('#uploader').uploadify({
    'uploader'  : '/admin/includes/uploadify/uploadify.swf',
    'script'    : '/admin/includes/uploadify/uploadify_storage.php',
     'scriptData': {'sessionId': sessionId},
    'cancelImg' : '/admin/includes/uploadify/cancel.png',
     'buttonImg'   : '/site_images/add_files.png',
    'folder'    :  storage,
    'auto'      : false,
    'multi'     : true,
    'fileExt'     : '*.jpg',
    'simUploadLimit' : 2,
    'wmode': 'transparent',
    'width': '150',
    'height': '20',
    'removeCompleted': false,
    'queueID'        : 'upload_queue',
    'onComplete'  : function(event, ID, fileObj, name,response, data) {
                        //these will now log the values of the global vars
                        console.log(path);
                        console.log(sub_ul);       
                    }
});

//code//


$("li.dir > span.name").live('click', function(){
    $("span").removeClass("selected");
    var li = $(this).parent();
    var root  = li.attr("title");
    var folder  = li.find("span.name").html();
    //don't redeclare path - that would shadow the global variable
    //use the global variable instead
    path = root+"/"+folder;
    path = path.replace('//', '/');
    //don't redeclare sub_ul
    sub_ul = $(li).find("> ul.sub_folder");
    set_path(sub_ul);
    $(this).addClass("selected");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...