Javascript'te Çapraz Tarayıcı Flash Algılama


97

Herhangi birinin, tarayıcının gömülü flash içeriğini görüntüleyip görüntüleyemediğini tespit etmek için IE / Firefox'ta güvenilir şekilde çalışabilen bir komut dosyası örneği var mı? Güvenilir bir şekilde söylüyorum çünkü bunun% 100 mümkün olmadığını biliyorum.


Joeri'nin cevabını zaten kabul ettiğinizi görüyorum, ancak gerçekten swfObject'i ciddiye almalısınız. Çok daha sağlam ve daha az şişkin.
matt lohkamp

Yanıtlar:


94

SWFObject çok güvenilirdir. Bir süredir sorunsuz kullandım.


Aynı burada, SWFObject benim için de harika çalışıyor (eskiden FlashObject olarak adlandırılırdı, ancak Adobe heyecanlı bir uyum gösterdi)
davr 01.08

17
JQuery ve swfobject ile, Modernizr tarzı html sınıf adlarını eklemek için kullandığım kod budur: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z

2
İlgilenen varsa bu vakalardan bazılarını jsperf üzerinde test ettim. SWFObject en hızlı çıktı.
hitautodestruct

if( swfobject.hasFlashPlayerVersion("8.0") ) { }Takılı bir flaş yoksa, Swfobject'i Throws false ile kullanarak flaşı kontrol edin . Numara, gerekli minimum flash oynatıcı sürümüdür.
Kai Noack

hitautodestruct, tabii ki en hızlı SWFObject çıktı. Gerçek algılamayı yalnızca sayfa yüklemesinde bir kez yapar ve ardından her çağrıldığında depoladığı değerleri döndürür. Diğer yöntemleri de bu şekilde kullanacağınız için, performans karşılaştırması adil bir karşılaştırma değildir.
Akrikos

110

Max Stewart'a katılıyorum . SWFObject gitmenin yoludur. Cevabını bir kod örneği ile tamamlamak istiyorum. Bu, başlamanıza yardımcı olmalı:

swfobject.jsDosyayı eklediğinizden emin olun ( buradan edinin ):

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

Öyleyse şu şekilde kullanın:

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" i, ihtiyacınız olan minimum flash sürümüyle değiştirin. Örnek olarak 9.0.115'i seçtim çünkü h.264 desteğini ekleyen versiyon bu.

Ziyaretçinin flash'ı yoksa, "0.0.0" 'ın bir flash sürümünü bildirecektir, bu nedenle, sadece flash olup olmadıklarını bilmek istiyorsanız, şunu kullanın:

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

9
harika. Yüklü herhangi bir flaşı algılamanın gerçekten basit bir örneğini bulmakta zorlanıyordum. Teşekkürler.
Brian Scott

2
Bu örnek için teşekkürler! Kullanıcı flaşsızsa ve yine de yerleştirme için swfobject kullanıyorsa başka bir javascript çalıştırması gerekiyordu. :)
kontur

bununla ilgili bir sorun varsa, SWFobject için bir kontrol eklemeniz gerekir veya bir hata alırsınız çünkü undefined, hasFlashPlayerVersion () adında bir işleve sahip değildir. if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-iletişim

Açıkçası, benim kodum SWFObject'inizin yüklü olduğunu varsayıyor. Tıpkı bir çözüm için jQuery veya başka bir kitaplık kullanmak gibi. Eğer dahil etmezseniz işe yaramayacaktır ve her kullandığınızda kitaplığı kontrol ederseniz çok fazla şişkinlik / yürütme mantığı olacaktır.
Andrew Ensley

@Andrew: Bu yazının dört buçuk yaşında olduğunun farkındayım, ancak SWFObject ile çalışmaya alışkın olmayanlar için o kadar açık değil. HTML5 desteklenmiyorsa Flash'a başvuran dosya yüklemeleri için bir Angular eklentisi kullanıyorum ve Flash algılanmadıysa bir mesaj görüntülemek istiyorum. SWFObject'in yüklenmesi gereken bir kitaplık olduğu veya tarayıcıya Flash Player'ın yüklenmesiyle otomatik olarak yüklenip yüklenmediği bana açık değildi. Yorumunuzda açıklığa kavuşturduğunuz için teşekkür ederiz, ancak lütfen cevabınıza eklemeyi düşünün.
Travesty3

36

Bunun eski bir gönderi olduğunu biliyorum ama bir süredir arıyordum ve hiçbir şey bulamadım. JavaScript Flash Algılama Kitaplığını
uyguladım . Çok iyi çalışıyor ve hızlı kullanım için belgelenmiştir. Kelimenin tam anlamıyla 2 dakika sürdü. İşte başlıkta yazdığım kod:

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

şimdi Chrome ve Firefox 6+ üzerinde başarısız oluyor!
balint

Yasal görünüyor - en son sürüm oldukça iyi çalışıyor ya da benim. Teşekkürler, iyi çalışmaya devam edin!
poitroae

Teşekkürler. Bu kitaplığı seviyorum çünkü bir nöbetçi swf gerektirmiyor. Umarım güncel tutarsınız!
Nick Van Brunt

Cevap bu olmalı ... :)
sabinonstack

32

Küçük, çapraz tarayıcı flaş algılaması oluşturmak için kapatma derleyicisini kullanabilirsiniz :

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

aşağıdaki "derlenmiş" kodla sonuçlanır:

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
bu çözüm bize göre en temiz olanıdır. flash'ın kurulu olup olmadığını tespit etmek için swfobject / kitaplık içermeyen bir yöntem arıyorduk. bu hile yapar. Teşekkürler!
anonim

Harika çözüm :) .. günümü kurtardın.
Arindam Paul

@ Anonymous-one şikayet etmeyin, ancak bu çözüm aynı zamanda bir kitaplık (özellikle goog.userAgent.flashGoogle'ın Closure Compiler'dan) kullanmıyor mu? Burada bazı nüanslı farklılıkları kaçırmadığımdan emin olmak istiyorum.
Andrew Ensley

ilk parçacığı kullanmıyoruz. 2. kullanıyoruz. bu da 'kitaplık içermez'.
anonim-biri

Bu, tüm tarayıcıları kapsıyor gibi görünen, gördüğüm en saf ve en kapsamlı cevap. Teşekkür ederim.
HartleySan

22

Şimdiye kadar kullandığım minimum sürüm (sürümü kontrol etmiyor, sadece Flash Eklentisi):

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

2
Güzel ve kısa, beğendim!
mike nelson

@ greg.kindel O zamandan beri uzun süredir kullanıyorum ve test ettiğim sürümler için çalışıyor. İşletim sistemi sürümünü ve IE sürümünü de belirtirseniz yardımcı olabilir;)
Tom Roggero

Win 7 altında IE 9.0.17'de çalışmıyor: "Otomasyon sunucusu nesne oluşturamıyor". Bu kuruluma bağlı gibi görünüyor. Bazı bilgisayarlarda bazılarında çalışmaz.
Zensursula

@Zensursula: ActiveXObject etrafına bir try {} catch () koydum ve istisna cümlesinde false döndürdüm. Şimdi benim için de çalışıyor
Zensursula

1
@mch bunu bir çok şey yapabilir. ancak varsayılan olarak güvenlik seviyeleri olmamalıdır.
Tom Roggero



5

Flash'ı bir web belgesine algılamak ve gömmek şaşırtıcı derecede zor bir iştir.

Hem SWFObject hem de Adobe'nin çözümlerinden üretilen kalite ve standartlara uymayan işaretlemeden çok hayal kırıklığına uğradım. Ek olarak, testlerim Adobe'nin otomatik güncelleyicisinin tutarsız ve güvenilmez olduğunu buldu.

JavaScript Flash Algılama Kitaplığı (Flash Algılama) ve JavaScript Flash HTML Oluşturucu Kitaplığı (Flash TML) okunaklı, bakımı yapılabilir ve standartlara uygun bir işaretleme çözümüdür.

- "Luke kaynağı oku!"


4

Tek satırlık isFlashExistsdeğişken için kod :

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

Bunun gibi bir alternatifin olduğunu unutmayın: swfobject.getFlashPlayerVersion();


3

Kaynağı http://whatsmy.browsersize.com (satır 14-120) adresinde görüntüleyin .

Yalnızca flaş algılama için jsbin'de soyutlanmış çapraz tarayıcı kodu, şu cihazlarda çalışır: FF / IE / Safari / Opera / Chrome.


Sitenizde cevaba nasıl ulaştığınıza dair bir kod veya en azından bir bağlantı sağlayabilir misiniz?
hitautodestruct

@hitautodestruct Sayfanın kaynağını görüntülerseniz, yanıt doğrudan orada, JS bloğunun üst kısmında yer alır.
Ates Goral

Yani aslında bu kod hakkında mı konuşuyordunuz (jsbin bağlantısı)?
hitautodestruct

@hitautodestruct Evet, artı IE'nin detectObject()karşılığı.
Ates Goral

3

ne dersin:

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

Saf bir Javascript çözümüyle ilgileniyorsanız, işte Brett'ten kopyaladığım çözüm :

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

Sadece flaşın etkin olup olmadığını kontrol etmek istiyorsanız, bu yeterli olacaktır.

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;

}

Not: enablePlugin'i işaretlemekten kaçının , bazı mobil tarayıcılarda dokunarak etkinleştirilen flash eklentisi vardır ve yanlış negatifi tetikler.



0

.swfYönlendiren küçük bir oluşturduk . Tarayıcı flaş etkinse, yeniden yönlendirecektir.

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 derleyicisini kullanarak goog.require ('goog.userAgent.flash') kitaplığını kullanarak bu 2 işlevi oluşturdum.

boole hasFlash ()

Tarayıcıda flash varsa geri döner.

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

boole isFlashVersion (sürüm)

Flash sürümü sağlanan sürümden büyükse döner

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)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.