网页中flash数据抓取(flash安全性对象中叫“appName调js错误层出不穷”的属性)
优采云 发布时间: 2021-09-28 23:02网页中flash数据抓取(flash安全性对象中叫“appName调js错误层出不穷”的属性)
背景介绍:
最近在做一个项目,涉及图片选择、裁剪、上传等,由于浏览器安全问题,js无法获取文件中选择的文件路径,HTML5实现的照片裁剪、抠图等功能不同的。大浏览器的兼容性,实在不敢太大胆。这时候就引入了flash,然后js做不到的事情都让flash来做,然后js来控制页面元素。就这样开始了js和as的交互之旅。听flash的大叔说,flash调优js的功能风格很容易调,但js调as却不容易。最后的情况是as调整js错误无休止,花了很多时间就搞定了。当然,
重要内容
//获取flash对象
函数 getSWF(name){
var e=document.getElementById(name);
return (navigator.appName.indexOf("Microsoft") != -1)?e:e.getElementsByTagName("embed")[0];
}
为什么要这样做,因为在浏览器中嵌入flash一般采用如下格式:
因为IE(微软的),其他的(Mozilla的Firefox,谷歌的chrome等)在解析HTML文档上有差异,所以如果你面对不同的浏览器,如果你使用通用的方法,你不知道哪里错了,但你是真的错了!
详细代码
上面的函数getSWF(),顾名思义就是获取嵌入到文档中的flash对象。navigator 是浏览器对象,Navigator 对象收录浏览器的信息。
相关资料可参考:;
所以后面的 appName 就是 Navigator 对象中名为“appName”的属性。该属性记录了navigator.appName获取的浏览器名称。目前五大浏览器的appName取值如下:
IE:浏览器名称:Microsoft Internet
FF、Chrome、Opera、Safari:浏览器名称:Netscape
浏览器 appName 测试地址:;
indexOf()是一个Javascript函数,indexOf()方法可以返回指定字符串值在字符串中第一次出现的位置
stringObject.indexOf("str",num); stringObject是要搜索的字符串对象,str是要搜索的字符串,num是起始位置,如果查询发现stringObject中存在字符串“str”,则返回第一个出现位置,如果要检索的字符串值没有出现,方法返回-1;
var e = document.getElementById(name); 就是获取文档中属性id值为name的节点对象,并将这个对象赋值给e,
return (navigator.appName.indexOf("Microsoft") != -1)?e:e.getElementsByTagName("embed")[0]; 看起来很复杂,开头很简单,这里是一个三木算术(学过编程的应该都知道),具体格式是if(a)?b:c;也就是说当if(a)为真时,值为b,如果(a)不为真,则取值为c,这个长代码可以分解为if(a)?b:c;的格式。
navigator.appName.indexOf("Microsoft")!=-1 e e.getElementsByTagName("embed")[0] 这三部分
if(navigator.appName.indexOf("Microsoft")!=-1){ alert("我的浏览器不是 IE 核心"); }else{"我的浏览器是 IE 核心"}
当弹出窗口显示“我的浏览器不是IE核心”时,说明我的浏览器名称不收录“Microsoft”,即没有使用IE。此时要获取的flash对象就是文档中的对象。如果是IE浏览器,则获取该对象。无论获取到哪个对象,最后都必须使用return返回调用函数,这样才能在不同的浏览器中获取对应的flash对象。
总体方案:
获取到flash对象后,可以调用flash中的方法,或者flash中的属性。
var objName = getSWF("FlashToJS");
//调用对象的flash_selFiles方法
如果(对象名称){
objName.flash_cutPic(arg);
}别的{
console.log("没有获得对象");
}
这被转移到 flash 中的 flash_selFiles() 方法。
最后的想法
尽量减少页面中flash的使用,尤其不要过分依赖flash,as和js的交互还是隐藏着很多陷阱。报告结束!