问题描述
我使用Addon SDK构建了一个Firefox扩展,打开了一个新的标签,其中包含来自扩展目录的HTML页面,并将内容脚本附加到它:
函数openHtmlLoadFormTab(htmlFileName,jsWorkerFileName){
tabs.open({
网址:data.url(htmlFileName)
onReady:功能(制表符){
变种tabWorker = tab.attach({
contentScriptFile:[data.url(jsJquery),data.url(jsWorkerFileName)]
});
}
});
我有一个< input type =file HTML文件中的>
和处理JS文件中的submit事件的代码(这些文件由 htmlFileName
和 jsWorkerFileName
)
由于安全原因,我无法使用的document.getElementById( 'UPLOADID')。值。我只是得到文件名。
然而,因为这是一个Firefox扩展,我想知道是否有重写这个限制吗?
我一直在寻找到 netscape.security.PrivilegeManager.enablePrivilege( UniversalFileRead)
和 mozFullPath
但我一直没有能够得到它的工作。我认为它已被弃用吗?
另一个解决方案是建立一个基于XUL的用户界面,并在那里提示文件,但我想知道如果有无论如何,这将工作在HTML。
首先编辑小例子代码
我建立了一个小示例扩展来说明我是如何做的。
lib / main.js
var self = require('self');
var tabs = require('tabs');
var data = self.data;
var jsLoadForm =load-form.js,htmlLoadForm =load-form.html;
var jsJquery ='jquery-1.8.0.min.js';
exports.onUnload = function(reason){};
exports.main = function(options,callbacks){
// TODO:移除此调试行
openHtmlLoadFormTab(htmlLoadForm,jsLoadForm);
};
功能openHtmlLoadFormTab(htmlFileName,jsWorkerFileName){
tabs.open({
网址:data.url(htmlFileName)
onReady:功能(制表符){
var tabWorker = tab.attach({
contentScriptFile:[data.url(jsJquery),data.url(jsWorkerFileName)]
});
}
}) ;
$ / code $ / pre
$ b data / load-form.html $ /
<!DOCTYPE HTML PUBLIC - // W3C // DTD HTML 4.01 Transitional // EN
http: //www.w3.org/TR/html4/loose.dtd\">
< html>
< head>
< title>表格< /标题>
< script lang =text / javascript>
函数fileChanged(e){
//这只是文件名
alert(html js:files [0] .name:+ e.files [0] .name) ;
// mozFullPath确实是空的,NOT undefined
alert(html js:files [0] .mozFullPath:+ e.files [0] .mozFullPath);
}
< / script>
< / head>
< body>
< form name =my-formid =my-formaction =>
< div>
< label for =uploadid1id =uploadlabel1>档案(JS in HTML):< / label>
< input type =filename =uploadid1id =uploadid1onchange =fileChanged(this)/>
< / div>
< div>
< label for =uploadid2id =uploadlabel2>文件(内容脚本中的JS):< / label>
< input type =filename =uploadid2id =uploadid2onchange =fileChangedInContentScript(this)/>
< / div>
< div>
< label for =uploadid3id =uploadlabel3>文件(在内容脚本中使用jQuery的JS):< / label>
< input type =filename =uploadid3id =uploadid3/>
< / div>
< / form>
< / body>
< / html> b
$ data $ load $ form $ $ $ class =lang-js prettyprint-override> $(document).ready(function(){
$(#uploadid3)。change(function(e){$ b $如果(e.files!= null)
console.log(jquery:e.files is defined);
else $ b(在jquery中,e.files为空
) $ b console.log(jquery:e.files is null);
//这个工作,打印文件名,但
console.log($('#uploadid3' ).val():+ $(#uploadid3)。val());
//这是未定义的
console.log($('#uploadid3')。mozFullPath: + $(#uploadid3)。mozFullPath);
});
});
$ b $ //这个句柄永远不会被调用
函数fileChangedInContentScript(e){
alert(js content script:filechanged in content script called);
$你可以在main.js中看到,我使用jquery-1.8.0 .min.js,从jQuery网站下载。
注意:当我在main.js中打开选项卡时,我也尝试了这些没有包含作为内容脚本的jQuery,但是没有运气。
结论是,当我从嵌入在HTML页面的JS访问它时, mozFullPath
确实是空的我找不到从jQuery访问 mozFullPath
的方法,我也不能找到一种方法来添加 onchange
处理程序在load-form.js中定义的load-form.html
使用load-form.js内容脚本中的onchange处理程序进行第二次编辑
我将下面的代码添加到load-form.js来捕获onchange事件。
我也从main.js中删除了jQuery内容脚本
$ b document.addEventListener DOMContentLoaded,函数(){
尝试{
的document.getElementById( uploadid2)的addEventListener( '变',函数(E){
的console.log(工作的addEventListener! );
console.log(e:+ e);
console.log(e.target:+ e.target);
console.log(e。 target.files:+ e.target.files);
console.log(e.target.files [0] .name:+ e.target.files [0] .name);
console.log(e.target.files [0] .mozFullPath:+ e.target.files [0] .mozFullPath);
});
console.log ()添加事件监听器)
catch(e){
console.log('added event listener failed:'+ e);
}
},false);
这仍然为mozFullPath输出一个空字符串:
info:添加事件监听器
info:addeventlistener工作!
info:e:[object Event]
info:e.target:[object HTMLInputElement]
info:e.target.files:[object FileList]
info:e。 target.files [0] .name:test.sh
info:e.target.files [0] .mozFullPath:
是否有获得所需的权限?我怎么能把我的手放在完整的路上?我需要完整的路径,所以我可以将它传递给扩展启动的应用程序。 (有解决方法,我可以做没有完整的路径,但他们降低了扩展的质量)解决方案