Deteksi Flash Lintas Browser dalam Javascript

96

Adakah yang memiliki contoh skrip yang dapat bekerja dengan baik di IE / Firefox untuk mendeteksi apakah browser mampu menampilkan konten flash yang disematkan. Saya katakan dengan andal karena saya tahu itu tidak mungkin 100% setiap saat.

Ta01
sumber
Saya melihat Anda telah menerima jawaban joeri, tetapi Anda benar-benar harus mempertimbangkan swfObject dengan serius. Ini jauh lebih kuat dan tidak terlalu menggembung.
matt lohkamp

Jawaban:

94

SWFObject sangat andal. Saya telah menggunakannya tanpa masalah cukup lama.

Max Stewart
sumber
Sama di sini, SWFObject juga berfungsi dengan baik untuk saya (dulu disebut FlashObject, tetapi Adobe memberikan desis)
davr
17
Dengan jQuery dan swfobject, ini adalah kode yang saya gunakan untuk menambahkan nama kelas html bergaya Modernizr: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z
2
Jika ada yang tertarik saya menguji beberapa kasus ini di jsperf. SWFObject keluar paling cepat.
hitautodestruct
Periksa flash menggunakan swfobject dengan if( swfobject.hasFlashPlayerVersion("8.0") ) { }Throws false jika tidak ada flash yang terpasang. Nomor tersebut adalah versi pemutar flash minimum yang diperlukan.
Kai Noack
hitautodestruct, tentu saja SWFObject keluar tercepat. Itu hanya melakukan deteksi sebenarnya sekali saat halaman dimuat dan kemudian mengembalikan nilai yang disimpannya setiap kali dipanggil. Karena itulah cara Anda akhirnya menggunakan metode lain juga, perbandingan kinerja bukanlah perbandingan yang adil.
Akrikos
109

Saya setuju dengan Max Stewart . SWFObject adalah cara untuk pergi. Saya ingin melengkapi jawabannya dengan contoh kode. Ini harus membantu Anda memulai:

Pastikan Anda telah menyertakan swfobject.jsfile tersebut (dapatkan di sini ):

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

Kemudian gunakan seperti ini:

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");
}

Ganti "9.0.115" dengan versi flash minimum apa pun yang Anda butuhkan. Saya memilih 9.0.115 sebagai contoh karena itulah versi yang menambahkan dukungan h.264.

Jika pengunjung tidak memiliki flash, itu akan melaporkan versi flash "0.0.0", jadi jika Anda hanya ingin tahu apakah mereka memiliki flash, gunakan:

if(swfobject.hasFlashPlayerVersion("1"))
{
    alert("You have flash!");
}
else
{
    alert("You do not flash :-(");
}
Andrew Ensley
sumber
9
Bagus. Saya berjuang untuk menemukan contoh yang sangat sederhana untuk hanya mendeteksi flash yang terpasang. Terima kasih.
Brian Scott
2
Terima kasih atas contoh ini! Diperlukan untuk menjalankan beberapa javascript lain jika pengguna tanpa flash dan sudah menggunakan swfobject untuk penyematan. :)
kontur
ada masalah dengan ini, Anda perlu menyertakan pemeriksaan untuk SWFobject atau Anda akan mendapatkan kesalahan karena undefined tidak memiliki fungsi yang disebut hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm
Jelas, kode saya mengasumsikan bahwa Anda telah memuat SWFObject. Ini seperti menggunakan jQuery atau pustaka lain untuk solusi. Ini tidak akan berfungsi jika Anda tidak memasukkannya, dan itu akan menjadi banyak logika tambahan / eksekusi jika Anda memeriksa perpustakaan setiap kali Anda menggunakannya.
Andrew Ensley
@ Andrew: Saya menyadari posting ini berumur empat setengah tahun, tapi tidak begitu jelas bagi mereka yang tidak terbiasa bekerja dengan SWFObject. Saya menggunakan add-on Angular untuk upload file yang menggunakan Flash jika HTML5 tidak didukung, dan ingin menampilkan pesan jika Flash tidak terdeteksi. Tidak jelas bagi saya bahwa SWFObject adalah pustaka yang perlu dimuat, atau jika dimuat secara otomatis melalui penginstalan Flash Player di browser. Terima kasih telah mengklarifikasi dalam komentar Anda, tetapi mohon pertimbangkan untuk menambahkannya ke jawaban Anda.
Travesty3
36

Saya tahu ini adalah posting lama, tetapi saya sudah mencari beberapa lama dan tidak menemukan apa pun.
Saya telah menerapkan Perpustakaan Deteksi Flash JavaScript . Ini bekerja dengan sangat baik dan didokumentasikan untuk penggunaan cepat. Saya benar-benar membutuhkan waktu 2 menit. Berikut kode yang saya tulis di header:

<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>        
Jon Clark
sumber
sekarang gagal di Chrome dan Firefox 6+!
balint
Tampak sah - versi terbaru berfungsi dengan baik atau saya. Terima kasih, pertahankan kerja bagus!
poitroae
Terima kasih. Saya suka perpustakaan ini karena tidak memerlukan sentinel swf. Saya harap Anda selalu memperbaruinya!
Nick Van Brunt
Ini harus menjadi jawabannya ... :)
sabinonstack
32

Anda dapat menggunakan compiler closure untuk menghasilkan deteksi flash kecil antar browser:

// ==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');
}

yang menghasilkan kode "terkompilasi" berikut:

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");
stewe
sumber
3
solusi ini adalah yang terbersih menurut kami. kami sedang mencari metode swfobject / library gratis untuk mendeteksi jika flash diinstal. ini berhasil. Terima kasih!
Anonymous-one
Solusi luar biasa :) .. Anda menyelamatkan hari saya.
Arindam Paul
Bukan untuk mengeluh @ anonymous-one, tetapi bukankah solusi ini juga menggunakan pustaka (khusus goog.userAgent.flashdari Closure Compiler Google)? Saya hanya ingin memastikan bahwa saya tidak melewatkan beberapa perbedaan nuansa di sini.
Andrew Ensley
kami tidak menggunakan cuplikan pertama. kami menggunakan 2nd. yang merupakan 'perpustakaan gratis'.
Anonymous-one
Ini adalah jawaban paling murni dan menyeluruh yang pernah saya lihat yang tampaknya mencakup semua browser. Terima kasih.
HartleySan
22

Versi minimum yang pernah saya gunakan (tidak memeriksa versi, hanya Plugin Flash):

var hasFlash = function() {
    return (typeof navigator.plugins == "undefined" || navigator.plugins.length == 0) ? !!(new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) : navigator.plugins["Shockwave Flash"];
};
Tom Roggero
sumber
2
Bagus dan pendek, saya suka!
mike nelson
@ greg.kindel Saya telah menggunakannya sejak lama, dan berfungsi untuk versi yang saya uji. Akan sangat membantu, jika Anda menentukan versi OS dan versi IE juga;)
Tom Roggero
tidak berfungsi di IE 9.0.17 di bawah Win 7 dengan pesan kesalahan: "Server otomasi tidak dapat membuat objek". Ini sepertinya tergantung pada penginstalan. Pada beberapa komputer, ini bekerja pada beberapa yang tidak.
Zensursula
@Zensursula: Saya mencoba {} catch () di sekitar ActiveXObject dan mengembalikan false di klausa pengecualian. Sekarang bekerja untuk saya juga
Zensursula
1
@mch banyak hal bisa melakukan itu. tetapi tingkat keamanan secara default seharusnya tidak.
Tom Roggero
5

Mendeteksi dan menyematkan Flash dalam dokumen web adalah tugas yang sangat sulit.

Saya sangat kecewa dengan kualitas dan markup yang tidak memenuhi standar yang dihasilkan dari solusi SWFObject dan Adobe. Selain itu, pengujian saya menemukan bahwa pembaru otomatis Adobe tidak konsisten dan tidak dapat diandalkan.

Pustaka Deteksi Flash JavaScript (Deteksi Flash) dan Pustaka Pembuat HTML Flash JavaScript (TML Flash) adalah solusi markup yang dapat dibaca, dipelihara, dan sesuai standar.

- "Luke membaca sumbernya!"


sumber
4

Kode untuk satu isFlashExistsvariabel liner :

<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>

Perhatikan bahwa ada alternatif seperti ini: swfobject.getFlashPlayerVersion();

trante
sumber
3

Lihat sumbernya di http://whatsmy.browsersize.com (baris 14-120).

Berikut adalah kode browser silang yang diabstraksikan di jsbin untuk deteksi flash saja , berfungsi di: FF / IE / Safari / Opera / Chrome.

Ates Goral
sumber
Dapatkah Anda memberikan beberapa kode atau setidaknya tautan tentang bagaimana Anda mendapatkan jawaban di situs Anda?
hitautodestruct
@hitautodestruct Jika Anda melihat sumber halaman, jawabannya ada di sana, di bagian atas blok JS.
Ates Goral
Jadi intinya berbicara tentang kode ini (jsbin link)?
hitautodestruct
@hitautodestruct Ya, ditambah detectObject()mitra untuk IE.
Ates Goral
3

bagaimana dengan:

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;
};
Martin Bommeli
sumber
3

Jika Anda tertarik dengan solusi Javascript murni, berikut ini yang saya salin dari 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;
}
bizi
sumber
1

Jika Anda hanya ingin memeriksa apakah flash diaktifkan, ini sudah cukup.

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;

}

Catatan: hindari mencentang enabledPlugin , beberapa browser seluler memiliki plugin tap untuk mengaktifkan flash, dan akan memicu negatif palsu.

bitinn
sumber
0

Telah membuat .swfpengalihan kecil . Jika browser mengaktifkan flash, browser akan mengarahkan ulang.

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");

}

}
mike
sumber
0

Menggunakan pustaka Google Closure compiler goog.require ('goog.userAgent.flash'), saya membuat 2 fungsi ini.

boolean hasFlash ()

Kembali jika browser memiliki flash.

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;
}

boolean isFlashVersion (versi)

Kembali jika versi flash lebih besar dari versi yang disediakan

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)
}
ayam
sumber