• 前端页面js与flash交互——js获取flash对象,并传递参数


    背景介绍

      最近在搞一个项目,涉及到图片选取,裁剪,上传等,由于浏览器安全性问题,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的交互中还是隐藏着很多的陷阱的。报告完毕!

  • 相关阅读:
    HDU 1124 Factorial(简单数论)
    29.QT主窗口加widget
    28.开始画面和异形窗口
    27.Qt时钟
    26.QT颜色与布局
    25.QT进度条
    146.正则表达式
    24.qint64转QString 以及获取文件属性
    23.QFile遍历
    22.监视文件
  • 原文地址:https://www.cnblogs.com/jameslong/p/3720332.html
Copyright © 2020-2023  润新知