开发者

sorting flash overlap problem wmode='opaque'

开发者 https://www.devze.com 2023-01-06 03:02 出处:网络
im trying to fix the flash overlap using regular expressions. here is an example of markup im trying to convert to my needs

im trying to fix the flash overlap using regular expressions. here is an example of markup im trying to convert to my needs

  <object width="440" height="300" data=
  "http://www.youtube.com/v/dMH0bHeiRNg&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"
  type="application/x-shockwave-flash">
    <param name="allowScriptAccess" value="never" />
    <param name="allowNetworking" value="internal" />
    <param name="wmode" value="window" />
    <param name="movie" value=
    "http://www.youtube.com/v/dMH0bHeiRNg&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" />
    <!--[if IE]><embed width="440" height="300" src="http://www.youtube.com/v/dMH0bHeiRNg&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" allowScriptAccess="never" allowNetworking=开发者_如何转开发"internal" wmode="window"><![endif]-->
  </object>

i want a function using regluar expressions that 1) checks presence of <param name="wmode" ..... if it exists... it forcefully sets value to 'opaque'. if doesn't exists it adds it to the above code.

I need this function to solve flash overlap problems of 'html' code saved in database


i've found a pure JS function that fix it in all browsers!

there you go:

function fix_flash() {
    // loop through every embed tag on the site
    var embeds = document.getElementsByTagName('embed');
    for (i = 0; i < embeds.length; i++) {
        embed = embeds[i];
        var new_embed;
        // everything but Firefox & Konqueror
        if (embed.outerHTML) {
            var html = embed.outerHTML;
            // replace an existing wmode parameter
            if (html.match(/wmode\s*=\s*('|")[a-zA-Z]+('|")/i))
                new_embed = html.replace(/wmode\s*=\s*('|")window('|")/i, "wmode='transparent'");
            // add a new wmode parameter
            else
                new_embed = html.replace(/<embed\s/i, "<embed wmode='transparent' ");
            // replace the old embed object with the fixed version
            embed.insertAdjacentHTML('beforeBegin', new_embed);
            embed.parentNode.removeChild(embed);
        } else {
            // cloneNode is buggy in some versions of Safari & Opera, but works fine in FF
            new_embed = embed.cloneNode(true);
            if (!new_embed.getAttribute('wmode') || new_embed.getAttribute('wmode').toLowerCase() == 'window')
                new_embed.setAttribute('wmode', 'transparent');
            embed.parentNode.replaceChild(new_embed, embed);
        }
    }
    // loop through every object tag on the site
    var objects = document.getElementsByTagName('object');
    for (i = 0; i < objects.length; i++) {
        object = objects[i];
        var new_object;
        // object is an IE specific tag so we can use outerHTML here
        if (object.outerHTML) {
            var html = object.outerHTML;
            // replace an existing wmode parameter
            if (html.match(/<param\s+name\s*=\s*('|")wmode('|")\s+value\s*=\s*('|")[a-zA-Z]+('|")\s*\/?\>/i))
                new_object = html.replace(/<param\s+name\s*=\s*('|")wmode('|")\s+value\s*=\s*('|")window('|")\s*\/?\>/i, "<param name='wmode' value='transparent' />");
            // add a new wmode parameter
            else
                new_object = html.replace(/<\/object\>/i, "<param name='wmode' value='transparent' />\n</object>");
            // loop through each of the param tags
            var children = object.childNodes;
            for (j = 0; j < children.length; j++) {
                try {
                    if (children[j] != null) {
                        var theName = children[j].getAttribute('name');
                        if (theName != null && theName.match(/flashvars/i)) {
                            new_object = new_object.replace(/<param\s+name\s*=\s*('|")flashvars('|")\s+value\s*=\s*('|")[^'"]*('|")\s*\/?\>/i, "<param name='flashvars' value='" + children[j].getAttribute('value') + "' />");
                        }
                    }
                }
                catch (err) {
                }
            }
            // replace the old embed object with the fixed versiony
            object.insertAdjacentHTML('beforeBegin', new_object);
            object.parentNode.removeChild(object);
        }
    }
}

now you can just run in when the page loads with jQuery:

 $(document).ready(function () {
            fix_flash();    
 }


I fixed it by calling this function(below) within $(document).ready function.

window.fix_wmode2transparent_swf = function  () {
    // For embed
    jQuery("embed").each(function(i) {
        var elClone = this.cloneNode(true);
        elClone.setAttribute("WMode", "Transparent");
        jQuery(this).before(elClone);
        jQuery(this).remove();
    });    
    // For object and/or embed into objects
    jQuery("object").each(function (i, v) {
    var elEmbed = jQuery(this).children("embed");
    if(typeof (elEmbed.get(0)) != "undefined") {
        if(typeof (elEmbed.get(0).outerHTML) != "undefined") {
            elEmbed.attr("wmode", "transparent");
            jQuery(this.outerHTML).insertAfter(this);
            jQuery(this).remove();
        }
        return true;
    }
    var algo = this.attributes;
    var str_tag = '<OBJECT ';
    for (var i=0; i < algo.length; i++) str_tag += algo[i].name + '="' + algo[i].value + '" ';    
    str_tag += '>';
    var flag = false;
    jQuery(this).children().each(function (elem) {
        if(this.nodeName == "PARAM") {
            if (this.name == "wmode") {
                flag=true;
                str_tag += '<PARAM NAME="' + this.name + '" VALUE="transparent">';        
            }
            else  str_tag += '<PARAM NAME="' + this.name + '" VALUE="' + this.value + '">';
        }
    });
    if(!flag)
        str_tag += '<PARAM NAME="wmode" VALUE="transparent">';        
    str_tag += '</OBJECT>';
    jQuery(str_tag).insertAfter(this);
    jQuery(this).remove();    
    });
}

source

http://www.nobilesoft.com/Scripts/fix_wmode2transparent_swf.js


There is a mistake in your code. With fix, it is working excellent. The code will be

$(document).ready(function () {
            fix_flash();    
});
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号