자바 스크립트에서 브라우저 간 플래시 감지


96

브라우저가 임베디드 플래시 콘텐츠를 표시 할 수 있는지 감지하기 위해 IE / Firefox에서 안정적으로 작동 할 수있는 스크립트 예제가있는 사람이 있습니까? 나는 그것이 불가능하다는 것을 100 % 알고 있기 때문에 확실하게 말한다.


나는 당신이 이미 joeri의 대답을 받아들이는 것을 보았습니다. 그러나 당신은 정말로 swfObject를 진지하게 고려해야합니다. 훨씬 더 견고하고 덜 부풀어 있습니다.
Matt lohkamp

답변:


94

SWFObject 는 매우 안정적입니다. 나는 꽤 오랫동안 문제없이 그것을 사용했습니다.


여기서도 마찬가지입니다. SWFObject는 저에게도 잘 작동합니다 (예전에는 FlashObject라고 불렸지만 Adobe는 쉿쉿 한 핏을 던졌습니다)
davr

17
jQuery 및 swfobject를 사용하면 Modernizr 스타일의 html 클래스 이름을 추가하는 데 사용한 코드입니다. $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z

2
누군가 관심이 있다면 jsperf 에서 이러한 사례 중 일부를 테스트 했습니다. SWFObject가 가장 빨리 나왔습니다.
hitautodestruct 2012

if( swfobject.hasFlashPlayerVersion("8.0") ) { }플래시가 설치되어 있지 않으면 false 를 던지는 swfobject를 사용하여 플래시를 확인합니다 . 숫자는 필요한 최소 플래시 플레이어 버전입니다.
Kai Noack 2014 년

hitautodestruct, 물론 SWFObject가 가장 빨리 나왔습니다. 페이지로드시 실제 감지를 한 번만 수행 한 다음 호출 될 때마다 저장된 값을 반환합니다. 이것이 다른 방법을 사용하는 방식이므로 성능 비교는 공정한 비교가 아닙니다.
Akrikos

109

나는 Max Stewart에 동의합니다 . SWFObject 는 갈 길입니다. 코드 예제로 그의 대답을 보완하고 싶습니다. 시작해야합니다.

swfobject.js파일 을 포함했는지 확인하십시오 ( 여기에서 가져 오기 ).

<script type="text/javascript" src="swfobject.js"></script>

그런 다음 다음과 같이 사용하십시오.

if(swfobject.hasFlashPlayerVersion("9.0.115"))
{
    alert("You have the minimum required flash version (or newer)");
}
else
{
    alert("You do not have the minimum required flash version");
}

"9.0.115"를 필요한 최소 플래시 버전으로 바꿉니다. 저는 9.0.115를 예로 선택했습니다. 264 지원을 추가 한 버전이기 때문입니다.

방문자에게 플래시가없는 경우 "0.0.0"의 플래시 버전을보고하므로 플래시가 전혀 없는지 알고 싶다면 다음을 사용하세요.

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}

9
큰. 나는 단순히 설치된 플래시를 감지하는 아주 간단한 예를 찾기 위해 고군분투하고 있었다. 감사.
Brian Scott

2
이 예제에 감사드립니다! 사용자가 플래시가없고 이미 삽입을 위해 swfobject를 사용하고있는 경우 다른 자바 스크립트를 실행해야합니다. :)
kontur

이것에 문제가 있습니다. SWFobject에 대한 검사를 포함해야합니다. 그렇지 않으면 undefined에 hasFlashPlayerVersion ()이라는 함수가 없기 때문에 오류가 발생합니다. if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm 2015

분명히 내 코드는 SWFObject가로드되었다고 가정합니다. 솔루션을 위해 jQuery 또는 다른 라이브러리를 사용하는 것과 같습니다. 포함하지 않으면 작동하지 않으며 사용할 때마다 라이브러리를 확인하면 많은 추가 팽창 / 실행 논리가 발생합니다.
Andrew Ensley 2015-04-26

@Andrew :이 게시물이 4 년 반이라는 것을 알고 있지만 SWFObject 작업에 익숙하지 않은 사람들에게는 그렇게 명확하지 않습니다. HTML5가 지원되지 않는 경우 Flash에 의존하는 파일 업로드에 Angular 애드온을 사용하고 있으며 Flash가 감지되지 않으면 메시지를 표시하고 싶었습니다. SWFObject가로드해야하는 라이브러리인지 또는 브라우저에 Flash Player를 설치하여 자동으로로드되었는지는 분명하지 않았습니다. 귀하의 의견에 명확하게 해주셔서 감사하지만 답변에 추가하는 것을 고려하십시오.
Travesty3

36

나는 이것이 오래된 게시물이라는 것을 알고 있지만 한동안 찾고 있었지만 아무것도 찾지 못했습니다. JavaScript Flash Detection Library를
구현했습니다 . 매우 잘 작동하며 빠른 사용을 위해 문서화되어 있습니다. 말 그대로 2 분이 걸렸습니다. 헤더에 작성한 코드는 다음과 같습니다.

<script src="Scripts/flash_detect.js"></script>
<script type="text/javascript"> 
 if (!FlashDetect.installed) {
    alert("Flash is required to enjoy this site.");         
 } else {
    alert("Flash is installed on your Web browser.");
 }
</script>        

이제 Chrome 및 Firefox 6 이상에서 실패합니다!
balint 22:41에

합법적 인 것 같습니다-최신 버전이 잘 작동합니다. 감사합니다. 계속해서 좋은 일을하세요!
poitroae 2013

감사. 센티넬 swf가 필요하지 않기 때문에이 라이브러리를 좋아합니다. 최신 상태로 유지하시기 바랍니다!
Nick Van Brunt

이 답 ... :)해야한다
sabinonstack

32

클로저 컴파일러 를 사용하여 작은 브라우저 간 플래시 감지를 생성 할 수 있습니다 .

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @formatting pretty_print
// @use_closure_library true
// ==/ClosureCompiler==

// ADD YOUR CODE HERE
goog.require('goog.userAgent.flash');
if (goog.userAgent.flash.HAS_FLASH) {
    alert('flash version: '+goog.userAgent.flash.VERSION);
}else{
    alert('no flash found');
}

다음 "컴파일 된"코드가 생성됩니다.

var a = !1,
    b = "";

function c(d) {
    d = d.match(/[\d]+/g);
    d.length = 3;
    return d.join(".")
}
if (navigator.plugins && navigator.plugins.length) {
    var e = navigator.plugins["Shockwave Flash"];
    e && (a = !0, e.description && (b = c(e.description)));
    navigator.plugins["Shockwave Flash 2.0"] && (a = !0, b = "2.0.0.11")
} else {
    if (navigator.mimeTypes && navigator.mimeTypes.length) {
        var f = navigator.mimeTypes["application/x-shockwave-flash"];
        (a = f && f.enabledPlugin) && (b = c(f.enabledPlugin.description))
    } else {
        try {
            var g = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"),
                a = !0,
                b = c(g.GetVariable("$version"))
        } catch (h) {
            try {
                g = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"), a = !0, b = "6.0.21"
            } catch (i) {
                try {
                    g = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), a = !0, b = c(g.GetVariable("$version"))
                } catch (j) {}
            }
        }
    }
}
var k = b;
a ? alert("flash version: " + k) : alert("no flash found");

3
이 솔루션은 우리 의견으로는 가장 깨끗합니다. 우리는 플래시가 설치되어 있는지 감지하는 swfobject / 라이브러리없는 방법을 찾고있었습니다. 이것은 트릭입니다. 감사!
익명 - 하나

멋진 솔루션 :) .. 당신은 내 하루를 구했습니다.
Arindam Paul

@ anonymous-one을 불평하지는 않지만이 솔루션은 라이브러리 (특히 goog.userAgent.flashGoogle의 Closure Compiler) 도 사용하지 않습니까? 나는 여기서 약간의 미묘한 차이를 놓치고 있지 않은지 확인하고 싶습니다.
Andrew Ensley 2013-08-07

첫 번째 스 니펫을 사용하지 않습니다. 우리는 2nd를 사용하고 있습니다. '라이브러리 프리'입니다.
anonymous-one

이것은 모든 브라우저를 포함하는 것으로 보이는 가장 순수하고 철저한 답변입니다. 감사합니다.
HartleySan 2013 년

22

내가 사용한 최소 버전 (버전을 확인하지 않고 Flash 플러그인 만) :

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};

2
멋지고 짧습니다. 좋아요!
마이크 넬슨

@ greg.kindel 그 이후로 오랫동안 사용해 왔으며 테스트 한 버전에서 작동합니다. ), 당신은 너무 OS 버전과 IE 버전을 지정하는 경우, 유용하지만이 될 수
톰 Roggero

Windows 7의 IE 9.0.17에서 "자동화 서버가 개체를 만들 수 없습니다"라는 오류 메시지와 함께 작동하지 않습니다. 이것은 설치에 따라 달라지는 것 같습니다. 일부 컴퓨터에서는 작동하지 않는 컴퓨터도 있습니다.
Zensursula 2013-06-17

@Zensursula : ActiveXObject 주위에 try {} catch ()를 배치하고 예외 절에서 false를 반환했습니다. 지금은 너무 MEE을 위해 노력하고 있습니다
Zensursula

1
@mch 많은 일이 그렇게 할 수 있습니다. 그러나 기본적으로 보안 수준은 그렇지 않습니다.
Tom Roggero 2015



5

웹 문서 내에서 Flash를 감지하고 포함하는 것은 놀랍도록 어려운 작업입니다.

저는 SWFObject와 Adobe의 솔루션 모두에서 생성 된 품질 및 비표준 준수 마크 업에 매우 실망했습니다. 또한 테스트 결과 Adobe의 자동 업데이트 프로그램이 일관성이없고 신뢰할 수없는 것으로 나타났습니다.

JavaScript Flash Detection Library (Flash Detect)JavaScript Flash HTML Generator Library (Flash TML) 는 읽기 쉽고 유지 관리가 가능하며 표준을 준수하는 마크 업 솔루션입니다.

- "루크가 소스를 읽어라!"


4

하나의 라이너 isFlashExists변수에 대한 코드 :

<script type='text/javascript'
    src='//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js'> </script>

<script type='text/javascript'>
   var isFlashExists = swfobject.hasFlashPlayerVersion('1') ? true : false ;
   if (isFlashExists) {
    alert ('flash exists');
   } else {
    alert ('NO flash');
   }
</script>

다음과 같은 대안이 있습니다. swfobject.getFlashPlayerVersion();


3

http://whatsmy.browsersize.com (14-120 행) 에서 소스를 확인 하십시오 .

여기에 추상화 된 크로스 브라우저입니다 jsbin에 코드 에 대한 전용 플래시 감지 , 작동 : FF / IE / 사파리 / 오페라 / 크롬.


사이트에서 어떻게 답변을 얻었는지에 대한 코드 나 최소한 링크를 제공 할 수 있습니까?
hitautodestruct

@hitautodestruct 페이지의 소스를 보면 답이 바로 JS 블록 맨 위에 있습니다.
Ates Goral 2012

그래서 본질적으로 으로이 코드 (jsbin 링크) 있습니까?
hitautodestruct

@hitautodestruct 예, detectObject()IE 의 대응 물도 포함 됩니다.
Ates Goral

3

이건 어떤가요:

var hasFlash = function() {
    var flash = false;
    try{
        if(new ActiveXObject('ShockwaveFlash.ShockwaveFlash')){
            flash=true;
        }
    }catch(e){
        if(navigator.mimeTypes ['application/x-shockwave-flash'] !== undefined){
            flash=true;
        }
    }
    return flash;
};

3

순수한 Javascript 솔루션에 관심이 있다면 다음은 Brett 에서 복사 한 것입니다 .

function detectflash(){
    if (navigator.plugins != null && navigator.plugins.length > 0){
        return navigator.plugins["Shockwave Flash"] && true;
    }
    if(~navigator.userAgent.toLowerCase().indexOf("webtv")){
        return true;
    }
    if(~navigator.appVersion.indexOf("MSIE") && !~navigator.userAgent.indexOf("Opera")){
        try{
            return new ActiveXObject("ShockwaveFlash.ShockwaveFlash") && true;
        } catch(e){}
    }
    return false;
}

1

플래시가 활성화되어 있는지 확인하고 싶다면 이것으로 충분합니다.

function testFlash() {

    var support = false;

    //IE only
    if("ActiveXObject" in window) {

        try{
            support = !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash"));
        }catch(e){
            support = false;
        }

    //W3C, better support in legacy browser
    } else {

        support = !!navigator.mimeTypes['application/x-shockwave-flash'];

    }

    return support;

}

참고 : enabledPlugin을 선택 하지 마십시오 . 일부 모바일 브라우저에는 탭하여 사용 가능한 플래시 플러그인이 있으며 거짓 음성을 트리거합니다.



0

.swf리디렉션 하는 작은 만들었습니다 . 브라우저가 플래시를 사용하는 경우 리디렉션됩니다.

package com.play48.modules.standalone.util;

import flash.net.URLRequest;


class Redirect {


static function main() {

    flash.Lib.getURL(new URLRequest("http://play48.com/flash.html"), "_self");

}

}

0

Google Closure 컴파일러 goog.require ( 'goog.userAgent.flash') 라이브러리를 사용하여이 두 함수를 만들었습니다.

부울 hasFlash ()

브라우저에 플래시가 있으면 반환합니다.

function hasFlash(){
    var b = !1;
    function c(a) {if (a = a.match(/[\d]+/g)) {a.length = 3;}}
    (function() {
    if (navigator.plugins && navigator.plugins.length) {
        var a = navigator.plugins["Shockwave Flash"];
        if (a && (b = !0, a.description)) {c(a.description);return;}
        if (navigator.plugins["Shockwave Flash 2.0"]) {b = !0;return;}
    }
    if (navigator.mimeTypes && navigator.mimeTypes.length && (a = navigator.mimeTypes["application/x-shockwave-flash"], b = !(!a || !a.enabledPlugin))) {c(a.enabledPlugin.description);return;}
    if ("undefined" != typeof ActiveXObject) {
        try {
            var d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");b = !0;c(d.GetVariable("$version"));return;
        } catch (e) {}
        try {
            d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");b = !0;
            return;
        } catch (e) {}
        try {
            d = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), b = !0, c(d.GetVariable("$version"));
        } catch (e) {}
    }
    })();
    return b;
}

부울 isFlashVersion (버전)

플래시 버전이 제공된 버전보다 큰 경우 반환

function isFlashVersion(version) {
    var e = String.prototype.trim ? function(a) {return a.trim()} : function(a) {return /^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]};
    function f(a, b) {return a < b ? -1 : a > b ? 1 : 0};
    var h = !1,l = "";
    function m(a) {a = a.match(/[\d]+/g);if (!a) {return ""}a.length = 3;return a.join(".")}
    (function() {
        if (navigator.plugins && navigator.plugins.length) {
            var a = navigator.plugins["Shockwave Flash"];
            if (a && (h = !0, a.description)) {l = m(a.description);return}
            if (navigator.plugins["Shockwave Flash 2.0"]) {h = !0;l = "2.0.0.11";return}
        }
        if (navigator.mimeTypes && navigator.mimeTypes.length && (a = navigator.mimeTypes["application/x-shockwave-flash"], h = !(!a || !a.enabledPlugin))) {l = m(a.enabledPlugin.description);return}
        if ("undefined" != typeof ActiveXObject) {
            try {
                var b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");h = !0;l = m(b.GetVariable("$version"));return
            } catch (g) {}
            try {
                b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");h = !0;l = "6.0.21";return
            } catch (g) {}
            try {
                b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"), h = !0, l = m(b.GetVariable("$version"))
            } catch (g) {}
        }
    })();
    var n = l;
    return (function(a) {
        var b = 0,g = e(String(n)).split(".");
        a = e(String(a)).split(".");
        for (var p = Math.max(g.length, a.length), k = 0; 0 == b && k < p; k++) {
            var c = g[k] || "",d = a[k] || "";
            do {
                c = /(\d*)(\D*)(.*)/.exec(c) || ["", "", "", ""];d = /(\d*)(\D*)(.*)/.exec(d) || ["", "", "", ""];
                if (0 == c[0].length && 0 == d[0].length) {break}
                b = f(0 == c[1].length ? 0 : parseInt(c[1], 10), 0 == d[1].length ? 0 : parseInt(d[1], 10)) || f(0 == c[2].length, 0 == d[2].length) || f(c[2], d[2]);c = c[3];d = d[3]
            } while (0 == b);
        }
        return 0 <= b
    })(version)
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.