Phát hiện Trình duyệt Chéo Flash trong Javascript


96

Có ai có ví dụ về tập lệnh có thể hoạt động tốt trên IE / Firefox để phát hiện xem trình duyệt có khả năng hiển thị nội dung flash nhúng không. Tôi nói một cách đáng tin cậy bởi vì tôi biết 100% thời gian là không thể.


Tôi thấy bạn đã chấp nhận câu trả lời của joeri, nhưng bạn thực sự nên nghiêm túc xem xét swfObject. Nó mạnh mẽ hơn rất nhiều và ít cồng kềnh hơn.
matt lohkamp

Câu trả lời:


94

SWFObject rất đáng tin cậy. Tôi đã sử dụng nó mà không gặp rắc rối trong một thời gian khá dài.


Tương tự ở đây, SWFObject hoạt động tuyệt vời đối với tôi cũng như (thường được gọi là FlashObject, nhưng Adobe đã ném một sự phù hợp hissy)
davr

17
Với jQuery và SWFObject, đây là đoạn code tôi sử dụng để thêm tên lớp html Modernizr kiểu: $('html').addClass(typeof swfobject !== 'undefined' && swfobject.getFlashPlayerVersion().major !== 0 ? 'flash' : 'no-flash');
Jon z

2
Nếu ai quan tâm, tôi đã thử nghiệm một số trường hợp này trên jsperf. SWFObject ra mắt nhanh nhất.
hitautodestruct

Kiểm tra flash bằng swfobject với if( swfobject.hasFlashPlayerVersion("8.0") ) { }Throws false nếu không có flash được cài đặt. Số này là phiên bản trình phát flash tối thiểu được yêu cầu.
Kai Noack

hitautodestruct, tất nhiên SWFObject ra mắt nhanh nhất. Nó chỉ phát hiện thực tế một lần khi tải trang và sau đó trả về các giá trị được lưu trữ mỗi khi nó được gọi. Vì đó là cách bạn cũng sẽ sử dụng các phương pháp khác, nên so sánh hiệu suất không phải là một so sánh công bằng.
Akrikos

109

Tôi đồng ý với Max Stewart . SWFObject là con đường để đi. Tôi muốn bổ sung câu trả lời của anh ấy bằng một ví dụ mã. Điều này phải giúp bạn bắt đầu:

Đảm bảo rằng bạn đã bao gồm swfobject.jstệp (lấy tại đây ):

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

Sau đó, sử dụng nó như vậy:

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

Thay thế "9.0.115" bằng bất kỳ phiên bản flash tối thiểu nào bạn cần. Tôi đã chọn 9.0.115 làm ví dụ vì đó là phiên bản đã thêm hỗ trợ h.264.

Nếu khách truy cập không có flash, nó sẽ báo phiên bản flash là "0.0.0", vì vậy nếu bạn chỉ muốn biết họ có flash hay không, hãy sử dụng:

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

9
tuyệt quá. Tôi đã cố gắng tìm một ví dụ thực sự đơn giản về việc phát hiện bất kỳ đèn flash nào được cài đặt. Cảm ơn.
Brian Scott

2
Cảm ơn vì ví dụ này! Cần thiết để chạy một số javascript khác nếu người dùng không có flash và vẫn đang sử dụng swfobject để nhúng. :)
kontur

có vấn đề với điều này, bạn sẽ cần phải kiểm tra SWFobject hoặc bạn sẽ gặp lỗi vì undefined không có chức năng gọi là hasFlashPlayerVersion (). if(SWFobject && SWFobject.hasFlashPlayerVersion("1")) { // code here }
E-comm

Rõ ràng, mã của tôi giả định rằng bạn đã tải SWFObject. Nó giống như sử dụng jQuery hoặc bất kỳ thư viện nào khác để tìm giải pháp. Nó sẽ không hoạt động nếu bạn không bao gồm nó, và sẽ có thêm rất nhiều khối lượng / logic thực thi nếu bạn kiểm tra thư viện mỗi khi bạn sử dụng nó.
Andrew Ensley

@Andrew: Tôi nhận ra bài đăng này đã được 4 năm rưỡi, nhưng nó không quá rõ ràng đối với những người không quen làm việc với SWFObject. Tôi đang sử dụng tiện ích bổ sung Angular để tải lên tệp sử dụng Flash nếu HTML5 không được hỗ trợ và muốn hiển thị thông báo nếu không phát hiện thấy Flash. Tôi không rõ ràng rằng SWFObject là một thư viện cần được tải hoặc nếu nó được tải tự động thông qua cài đặt Flash Player trong trình duyệt. Cảm ơn bạn đã làm rõ trong bình luận của mình, nhưng vui lòng xem xét thêm nó vào câu trả lời của bạn.
Travesty

36

Tôi biết đây là một bài viết cũ, nhưng tôi đã tìm một lúc mà không thấy gì cả.
Tôi đã triển khai Thư viện phát hiện Flash JavaScript . Nó hoạt động rất tốt và nó được ghi lại để sử dụng nhanh chóng. Tôi thực sự mất 2 phút. Đây là mã tôi đã viết trong tiêu đề:

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

nó hiện không thành công trên Chrome và Firefox 6+!
balint

Có vẻ hợp pháp - phiên bản mới nhất hoạt động khá tốt hoặc tôi. Cảm ơn bạn, tiếp tục công việc tốt!
poitroae

Cảm ơn. Tôi thích thư viện này vì nó không yêu cầu swf lính canh. Tôi hy vọng bạn giữ cho nó được cập nhật!
Nick Van Brunt,

Điều này sẽ là câu trả lời ... :)
sabinonstack

32

Bạn có thể sử dụng trình biên dịch bao đóng để tạo ra một phát hiện flash trên nhiều trình duyệt nhỏ:

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

dẫn đến mã "đã biên dịch" sau:

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
giải pháp này là sạch nhất theo ý kiến ​​của chúng tôi. chúng tôi đang tìm kiếm một phương pháp swfobject / thư viện miễn phí để phát hiện nếu flash được cài đặt. điều này thực hiện thủ thuật. cảm ơn!
nặc danh-một

Giải pháp tuyệt vời :) .. bạn đã cứu ngày của tôi.
Arindam Paul

Không phải phàn nàn @ nặc danh-một, nhưng không phải giải pháp này cũng sử dụng thư viện (cụ thể là goog.userAgent.flashtừ Trình biên dịch đóng cửa của Google)? Tôi chỉ muốn đảm bảo rằng tôi không bỏ lỡ một số khác biệt sắc thái ở đây.
Andrew Ensley,

chúng tôi không sử dụng đoạn mã đầu tiên. chúng tôi đang sử dụng thứ 2. là "thư viện miễn phí".
nặc danh-một

Đây là câu trả lời thuần túy và thấu đáo nhất mà tôi đã thấy dường như bao gồm tất cả các trình duyệt. Cảm ơn bạn.
HartleySan

22

Phiên bản tối thiểu tôi đã từng sử dụng (không kiểm tra phiên bản, chỉ Flash Plugin):

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

2
Đẹp và ngắn gọn, tôi thích nó!
mike nelson

@ greg.kindel Tôi đã sử dụng nó trong một thời gian dài kể từ đó và nó hoạt động cho các phiên bản tôi đã thử nghiệm. Có thể là mặc dù hữu ích, nếu bạn chỉ định phiên bản hệ điều hành và phiên bản IE quá;)
Tom Roggero

không hoạt động trong IE 9.0.17 trong Win 7 với thông báo lỗi: "Máy chủ tự động hóa không thể tạo đối tượng". Điều này dường như phụ thuộc vào cài đặt. Trên một số máy tính, nó hoạt động trên một số không.
Zensursula

@Zensursula: Tôi đã thử {} catch () xung quanh ActiveXObject và trả về false trong mệnh đề ngoại lệ. Nó bây giờ đang làm việc cho mee quá
Zensursula

1
@mch rất nhiều thứ có thể làm được điều đó. nhưng mức bảo mật theo mặc định thì không.
Tom Roggero



5

Phát hiện và nhúng Flash vào tài liệu web là một nhiệm vụ khó khăn một cách đáng ngạc nhiên.

Tôi rất thất vọng với chất lượng và đánh dấu không tuân thủ tiêu chuẩn được tạo ra từ cả SWFObject và các giải pháp của Adobe. Ngoài ra, thử nghiệm của tôi cho thấy trình cập nhật tự động của Adobe không nhất quán và không đáng tin cậy.

Thư viện phát hiện Flash JavaScript (Flash Detect)Thư viện trình tạo HTML Flash JavaScript (Flash TML) là một giải pháp đánh dấu dễ đọc, dễ bảo trì và tuân thủ các tiêu chuẩn.

- "Luke đã đọc nguồn!"


4

Mã cho một isFlashExistsbiến lót :

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

Lưu ý rằng có một giải pháp thay thế như sau: swfobject.getFlashPlayerVersion();


3

Xem nguồn tại http://whatsmy.bariesize.com (dòng 14-120).

Đây là trình duyệt chéo được tóm tắt trên jsbin chỉ để phát hiện flash , hoạt động trên: FF / IE / Safari / Opera / Chrome.


Bạn có thể cung cấp một số mã hoặc ít nhất là một liên kết về cách bạn đạt được câu trả lời trên trang web của mình không?
hitautodestruct 18/12/12

@hitautodestruct Nếu bạn xem nguồn của trang, câu trả lời nằm ngay ở đó, ở đầu khối JS.
Ates Goral

Vì vậy, về cơ bản đang nói về mã này (liên kết jsbin)?
hitautodestruct 19/12/12

@hitautodestruct Có, cộng với bản detectObject()sao cho IE.
Ates Goral 19/12/12

3

Thế còn:

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

Nếu bạn quan tâm đến giải pháp Javascript thuần túy, đây là giải pháp mà tôi sao chép từ 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

Nếu bạn chỉ muốn kiểm tra xem flash có được bật hay không, thì điều này là đủ.

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;

}

Lưu ý: tránh kiểm tra Đã kích hoạtPlugin , một số trình duyệt di động có plugin flash chạm để bật và sẽ kích hoạt âm thanh giả.



0

Đã tạo một .swfchuyển hướng nhỏ . Nếu trình duyệt được bật flash, nó sẽ chuyển hướng.

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

Sử dụng thư viện goog.require ('goog.userAgent.flash') của trình biên dịch Google Closure, tôi đã tạo 2 hàm này.

boolean hasFlash ()

Trả về nếu trình duyệt có 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 (phiên bản)

Trả về nếu phiên bản flash lớn hơn phiên bản được cung cấp

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)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.