2010-07-06 53 views
0

Je tente de corriger le chevauchement flash en utilisant des expressions régulières. voici un exemple de balisage im essayant de convertir à mes besoinsproblème de chevauchement flash de tri wmode = 'opaque'

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

je veux une fonction en utilisant des expressions regluar que 1) vérifie la présence de <param name="wmode" ..... si elle existe ... il définit avec force la valeur à « opaque ». si n'existe pas, il l'ajoute au code ci-dessus.

J'ai besoin de cette fonction pour résoudre les problèmes de chevauchement flash de code « html » enregistré dans la base de données

+0

Pourquoi voulez-vous faire cela en utilisant des expressions régulières? Ce serait beaucoup plus propre et mieux en utilisant un analyseur DOM. (Bien que le commentaire conditionnel IE puisse être écrasé par l'analyseur DOM intégré de PHP.) –

+0

entrée utilisateur du code d'intégration analysé et nettoyé à l'aide du purificateur html. le code analysé est une plainte xhtml et à l'abri de XSS. je veux que le html purifié soit forcé d'avoir ce paramètre s'il existe ou non. Avez-vous une solution DOM jamais utilisé le dom parser, lemme lire dessus –

+0

Je pense que ce cud aussi être fait avec DOM parser, tout un avec une solution? –

Répondre

1

que j'ai trouvé une pure fonction JS qui le fixent dans tous les navigateurs!

là vous allez:

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

maintenant vous pouvez juste lancer quand la page se charge avec jQuery:

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

Je l'ai fixé en appelant cette fonction (ci-dessous) dans $ (document) fonction .ready.

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 de

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

1

Il y a une erreur dans votre code. Avec correctif, cela fonctionne excellent. Le code sera

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