การตรวจจับแฟลชข้ามเบราว์เซอร์ใน Javascript


97

ใครมีตัวอย่างของสคริปต์ที่สามารถทำงานได้ดีบน IE / Firefox เพื่อตรวจสอบว่าเบราว์เซอร์สามารถแสดงเนื้อหาแฟลชแบบฝังได้หรือไม่ ฉันพูดอย่างน่าเชื่อถือเพราะฉันรู้ว่ามันเป็นไปไม่ได้ 100% ของเวลา


ฉันเห็นว่าคุณยอมรับคำตอบของ joeri แล้ว แต่คุณควรพิจารณา swfObject อย่างจริงจัง มีประสิทธิภาพมากขึ้นและบวมน้อยลง
matt lohkamp

คำตอบ:


94

SWFObjectมีความน่าเชื่อถือมาก ฉันใช้มันโดยไม่มีปัญหามาระยะหนึ่งแล้ว


เหมือนกันที่นี่ SWFObject ก็ใช้งานได้ดีสำหรับฉันเช่นกัน (เคยเรียกว่า FlashObject แต่ Adobe โยนความพอดี)
davr

17
ด้วย jQuery และ swfobject นี่คือรหัสที่ฉันใช้เพื่อเพิ่มชื่อคลาส html สไตล์ Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z

2
หากใครสนใจฉันทดสอบบางกรณีเหล่านี้บน jsperf SWFObject ออกมาเร็วที่สุด
hitautodestruct

ตรวจสอบแฟลชโดยใช้ swfobject ด้วยif( swfobject.hasFlashPlayerVersion("8.0") ) { }Throws false หากไม่ได้ติดตั้งแฟลช จำนวนนี้เป็นเวอร์ชันโปรแกรมเล่นแฟลชขั้นต่ำที่ต้องการ
Kai Noack

hitautodestruct แน่นอนว่า SWFObject ออกมาเร็วที่สุด ทำการตรวจจับจริงเพียงครั้งเดียวในการโหลดหน้าเว็บจากนั้นส่งคืนค่าที่เก็บไว้ทุกครั้งที่เรียก เนื่องจากเป็นวิธีที่คุณต้องใช้วิธีการอื่นเช่นกันการเปรียบเทียบประสิทธิภาพจึงไม่ใช่การเปรียบเทียบที่ยุติธรรม
Akrikos

110

ผมเห็นด้วยกับแม็กซ์สจ๊วต 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 เป็นตัวอย่างเนื่องจากเป็นเวอร์ชันที่เพิ่มการรองรับ h.264

หากผู้เยี่ยมชมไม่มีแฟลชก็จะรายงานแฟลชเวอร์ชัน "0.0.0" ดังนั้นหากคุณต้องการทราบว่ามีแฟลชหรือไม่ให้ใช้:

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

9
เยี่ยมมาก ฉันพยายามหาตัวอย่างง่ายๆในการตรวจจับแฟลชที่ติดตั้งไว้ ขอบคุณ.
Brian Scott

2
ขอบคุณสำหรับตัวอย่างนี้! จำเป็นต้องเรียกใช้ javascript อื่น ๆ หากผู้ใช้ไม่มีแฟลชและใช้ swfobject สำหรับการฝังอยู่แล้ว :)
kontur

มีปัญหากับสิ่งนี้คุณจะต้องรวมการตรวจสอบ SWFobject ไม่เช่นนั้นคุณจะได้รับข้อผิดพลาดเนื่องจาก undefined ไม่มีฟังก์ชันที่เรียกว่า hasFlashPlayerVersion () if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm

เห็นได้ชัดว่ารหัสของฉันถือว่าคุณโหลด SWFObject แล้ว เหมือนกับการใช้ jQuery หรือไลบรารีอื่น ๆ เพื่อหาวิธีแก้ปัญหา มันจะใช้ไม่ได้ถ้าคุณไม่รวมไว้และมันจะเป็นตรรกะการขยาย / การดำเนินการพิเศษมากมายหากคุณตรวจสอบไลบรารีทุกครั้งที่คุณใช้มัน
Andrew Ensley

@ แอนดรูว์: ฉันรู้ว่าโพสต์นี้มีอายุสี่ปีครึ่ง แต่ก็ไม่ชัดเจนสำหรับผู้ที่ไม่คุ้นเคยกับ SWFObject ฉันใช้โปรแกรมเสริม Angular สำหรับการอัปโหลดไฟล์ที่ใช้ Flash หากไม่รองรับ HTML5 และต้องการแสดงข้อความหากตรวจไม่พบ 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

ดูเหมือนว่า Legit - เวอร์ชันล่าสุดทำงานได้ดีหรือฉัน ขอบคุณติดตามผลงานดีๆต่อไป!
poitroae

ขอบคุณ. ฉันชอบไลบรารีนี้เพราะไม่ต้องใช้ยามรักษาการณ์ ฉันหวังว่าคุณจะอัปเดตอยู่เสมอ!
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 / library ฟรีหากติดตั้งแฟลช นี่เป็นเคล็ดลับ ขอบคุณ!
anonymous-one

ทางออกที่ยอดเยี่ยม :) .. คุณช่วยวันของฉัน
Arindam Paul

ไม่ต้องบ่น @ anonymous-one แต่โซลูชันนี้ไม่ใช้ไลบรารี (โดยเฉพาะgoog.userAgent.flashจาก Closure Compiler ของ Google) หรือไม่ ฉันแค่อยากให้แน่ใจว่าฉันจะไม่พลาดความแตกต่างเล็กน้อยที่นี่
Andrew Ensley

เราไม่ได้ใช้ตัวอย่างข้อมูลแรก เรากำลังใช้ตัวที่ 2 ซึ่งเป็น 'ห้องสมุดฟรี'
anonymous-one

นี่เป็นคำตอบที่บริสุทธิ์และละเอียดที่สุดเท่าที่ฉันเคยเห็นมาซึ่งดูเหมือนว่าจะครอบคลุมทุกเบราว์เซอร์ ขอบคุณ.
HartleySan

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 ด้วย)
Tom Roggero

ไม่ทำงานใน IE 9.0.17 ภายใต้ Win 7 พร้อมข้อความแสดงข้อผิดพลาด: "Automation server can't create object" สิ่งนี้ดูเหมือนจะขึ้นอยู่กับการติดตั้ง ในคอมพิวเตอร์บางเครื่องจะใช้งานได้กับบางเครื่อง
Zensursula

@Zensursula: ฉันลองใช้ {} catch () รอบ ๆ ActiveXObject และส่งคืนเท็จในข้อยกเว้น ตอนนี้มันทำงานให้ฉันด้วย
Zensursula

1
@mch หลายสิ่งสามารถทำได้ แต่โดยค่าเริ่มต้นระดับความปลอดภัยไม่ควร
Tom Roggero


7

บางทีชุดตรวจจับโปรแกรมเล่นแฟลชของ Adobe อาจเป็นประโยชน์ที่นี่?

http://www.adobe.com/products/flashplayer/download/detection_kit/


6
อยากจะชี้ให้เห็น: SWFObject เป็นตัวตายตัวแทนของชุดตรวจจับของ Adobe ที่เชื่อมโยงที่นี่
Andrew Ensley

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 / Safari / Opera / Chrome


คุณสามารถระบุรหัสบางส่วนหรืออย่างน้อยก็ลิงค์ว่าคุณได้รับคำตอบในไซต์ของคุณอย่างไร
hitautodestruct

@hitautodestruct หากคุณดูแหล่งที่มาของหน้าคำตอบจะอยู่ที่นั่นโดยตรงที่ด้านบนของบล็อก JS
Ates Goral

โดยพื้นฐานแล้วกำลังพูดถึงรหัสนี้ (ลิงก์ 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;

}

หมายเหตุ: หลีกเลี่ยงการตรวจสอบenablePluginเบราว์เซอร์มือถือบางตัวมีปลั๊กอินแฟลชแบบแตะเพื่อเปิดใช้งานและจะเรียกใช้ค่าลบเท็จ



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') ไลบรารีฉันสร้าง 2 ฟังก์ชันนี้

บูลีน 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.