我有这个脚本使用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()
)。我在OnComplete
结束时第二次启动uploadify时console.log(path);
显示正确的值,但console.log(sub_ul);
没有返回任何内容(也是警报),就像没有指定对象一样。 JS运行后我无法使用对象?他们不像path
那样保存在DOM中吗?
答案 0 :(得分:2)
在您发布的 onComplete
函数中,您正在记录ul_sub
而不是sub_ul
,因为您似乎想要。
除非在set_path()
中设置名为path
的全局变量的值,否则我看不出如何在这两个不同的函数中获得相同的值 - 变量{{ path
处理程序中的1}}范围限定为该函数,并且在其他地方无法访问。 click
也是如此。
JS运行后我无法使用对象?难道他们不像路径一样保存在DOM中吗?
我不太清楚要做什么,JavaScript对象不会“保存在DOM中”。如果您无法访问已创建的对象,则上下文必须与创建对象的上下文不同 - 它现在必须超出范围且因此无法访问。使用闭包是保持函数和变量可访问的一种方法。使用全球变量是另一种方法,但不建议这样做,除非绝对必要,否则应该避免使用。
您可能希望阅读这些有关JavaScript范围的文章,以便更好地了解工作原理:
您在评论中提到,您已制作全局sub_ul
变量,但不是path
。 “修复”代码的一种简单方法是使用全局变量。但同样,通常不鼓励使用全局变量,因为最终可能污染全局命名空间。
如果没有看到更多代码,很难说这是否总能正常运行 - 例如,您的uploadify脚本可能由不会导致sub_ul
和{{1}值的事件触发要设置,这意味着当path
函数运行时,它将为两者都得到错误的值。
sub_ul