背景介绍

  最近在搞一个项目,涉及到图片选取,裁剪,上传等,由于浏览器安全性问题,js无法获取到<input type="file">中选取的文件路径,而且对照片的裁剪,抠图等由HTML5实现的功能,对各大浏览器的兼容性,真是不敢太大胆。这个时候就引进了flash,然后所有js做不了的让flash来做,然后由js来控制页面元素。就这样开始了js与as的交互之旅,听做flash的大叔说,flash调js的函数式很好调的,而js调as不大容易。最终的情况是as调js错误层出不穷,花费了很多时间在上面,当然了,期初js调as也走了弯路,因为之前没有跟flash打过交道,所以只能任由别人说了,但是貌似还不是咱们js的问题,因为网上现成的方法就很多的了,废话不多说,把项目中js调用as的代码共享出来。

重要内容

//获取flash对象
function getSWF(name){
var e=document.getElementById(name);
return (navigator.appName.indexOf("Microsoft") != -1)?e:e.getElementsByTagName("embed")[0];
}

为什么要这样呢,因为在浏览器中嵌入flash一般采用如下格式:

<object>

<embed></embed>

</object>

因为IE(微软家的),其他(Mozilla家的火狐,谷歌家的chrome等等)在对HTML文档进行解析的时候存在差异,所以如果面对不同的浏览器,通用一个方法,自己都不知道错在哪里,但是你真的错了!

代码详解

上面的函数getSWF()顾名思义,就是获取文档中嵌入的flash对象,navigator是浏览器对象,Navigator 对象中包含有关浏览器的信息。

相关的信息可参考:http://www.w3school.com.cn/jsref/dom_obj_navigator.asp

所以后面的appName就是Navigator对象中叫“appName”的属性,这个属性记录了navigator.appName获取到的是浏览器的名称,当前5大主流浏览器的appName值如下:

IE:                                                浏览器名称:Microsoft Internet

FF,Chrome,Opera,Safari:                 浏览器名称:Netscape

浏览器appName测试地址:http://www.w3school.com.cn/tiy/t.asp?f=hdom_browser

indexOf()是Javascript函数,indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置

stringObject.indexOf("str",num);stringObject就是被查找的字符串对象,str是要查找的字符串,num是起始位置,如果查询到了“str”字符串存在于stringObject中,则返回第一个出现的位置,如果要检索的字符串值没有出现,则该方法返回 -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)为true时取值为b,if(a)不为true时,取值为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对象就是文档中的<object></object>对象,如果是IE浏览器,则获取到的是<embed></embed>这个对象,无论获得那个对象,最终都要用return返回给调用的函数,这样就可以在不同的浏览器里获得相对应的flash对象。

整体方案:

获取了flash 对象之后就可以调用flash里面的方法,或者flash里面的属性了。

var objName = getSWF("FlashToJS");

//调用对象的flash_selFiles方法
if(objName){
objName.flash_cutPic(arg);
}else{
console.log("没有获取到对象");
}

这就调到了flash里里面的flash_selFiles()方法。

最后的感言

在页面中还是尽量减少使用flash,特别是别对flash太过于依赖,在as与js的交互中还是隐藏着很多的陷阱的。报告完毕!

前端页面js与flash交互——js获取flash对象,并传递参数的更多相关文章

  1. iOS JS 和 OC交互 / JS 和 native 相互调用

    现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native  OC代码 第一种机制 ( ...

  2. 前端页面唯一字符串生成(Js)UUID

    function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 3 ...

  3. PHP获取不到url传递参数中#&等特殊字符解决方法

    有些符号在URL中是不能直接传递的,无法传入PHP处理,比如#&等符号,通过$_GET是获取不到的,比如一个域名https://localhost/url.php?url=yangyufei+ ...

  4. 可以获取get post url 传递参数的统一方法

    public static string objRequest(string requestName) { object obj = HttpContext.Current.Request[reque ...

  5. flash与js交互

    当Flash置于HTML容器中时,经常会遇到Flash与JS的通信问题,例如:JS能否调用Flash中的变量.方法,Flash能否调用JS中的变量.方法等等.答案是肯定的.随着技术的不断发展,解决方案 ...

  6. Odoo前端页面模版渲染引擎——Jinja2用法教程

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9307200.html  一:渲染模版 要渲染一个qweb模板文件,通过render_template方法即可. ...

  7. vue中 router-link 传递参数以及获取

    将所遇见的问题一步一步记录下来,不久便会成长 今天在修改前端(vue) BUG的时候遇见 router-link标签,传递参数到另一个页面,确不知道参数在另一个页面怎么接收,于是找度娘需求解决办法,最 ...

  8. Js与flash交互:在html页面中用js与MyReport插件交互

    Html页面与flash的加载 如下图,flash是html页面的一个插件节点. js与flash进行交互,首先要处理好html页面和swf的加载问题. Swf调用外部js方法,要确保js方法已存在, ...

  9. Python之路-(js正则表达式、前端页面的模板套用、Django基础)

    js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...

随机推荐

  1. selenium+python笔记1

    #!/usr/bin/env python # -*- coding: utf-8 -*- """@desc: 讲讲web项目中常用的方法属性 webdriver 提供了 ...

  2. 在csdn里markdown感受

    先来一个百度百科   Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式.   Markdown具有一系列衍生版本,用于扩展Markdo ...

  3. MySQL学习笔记_2_MySQL创建数据表(上)

    MySQL创建数据表(上) 一.创建数据表的SQL语句模型[弱类型] CREATETABLE [IF NOT EXISTS] 表名称( 字段名1列的类型[属性][索引], 字段名2 列的类型[属性][ ...

  4. Text Justification [LeetCode]

    Problem Description:http://oj.leetcode.com/problems/text-justification/ Note: Just be careful about ...

  5. 让ie678支持css一些属性及html标签

    昨天写的一个页面,用的css3及html5的一些样式与标签,在ie8下看是没有效果的,然后就在晚上查找了一下如何能让ie8也能实现这些效果. 1.添加respond.js文件,Respond.js让I ...

  6. Problem 2020 组合(FOJ)

    Problem 2020 组合 Accept: 714    Submit: 1724Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem ...

  7. PL/SQL设置编码方式

    (2012-10-30 21:38:33) 转载▼ 标签: 杂谈 分类: ORACLE 导出sql文件出现乱码问题,百度之后,发现问题是由于PL/SQL客户端和ORACLE的字符编码设置不一致引起的. ...

  8. Windows 下对目录建立软链接

    在Linux下,可以很方便的通过ln命令创建对文件和对文件夹的软链接.在Windows下,通过快捷方式,可以创建到文件和文件夹的链接,但是这软链接不是一个层面的上东西.软链接是底层文件系统层面的,而快 ...

  9. Assert断言测试

    assert编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真.可以在 ...

  10. jsp和servlet的区别

    servlet是服务器端的程序,动态生成html页面发到客户端,但是这样 程序里有许多out.println(),java和html语言混在一起很乱.所以 后来推出了jsp.其实jsp就是servle ...