2009-07-06 4 views
0

Итак, у нас есть странная проблема на работе. Нам нужно отобразить Flash-игру, которая использует клавиатуру, когда игра заканчивается, она запускает модальное всплывающее окно через Javascript. Мы используем параметр wmode, установленный в opaque, чтобы модальные дисплеи находились поверх Flash elment.Javascript modal поверх флеш-игр, во всех браузерах

Все работает нормально, за исключением IE6/7. Когда вы нажимаете клавиши UP или DOWN на клавиатуре, он прокручивает страницу вверх и вниз, а также отправляет ввод в игру клавиатуры.

Единственное исправление, которое мы, кажется, нашли для этого, заключается в том, чтобы полностью удалить атрибут classid из тега object. Но это заставляет элемент Flash отображаться поверх нашего Javascript-модала в обоих IE6/7.

Так что, похоже, у нас есть только один или другой, но не оба, если мы хотим поддерживать IE.

Любая помощь, подсказки, указатели или что-то еще было бы здорово, потому что в этих любопытных проблемах действительно не так много доступных онлайн. По крайней мере, не в соответствии с Google.

ответ

1

Я не уверен, что это лучшее решение, но вы можете изучить привязки событий клавиатуры в браузере (или просто в IE), чтобы они не срабатывали, пока посетитель играет в игру. onkeyup, onkeydown и onkeypress - это события, на которые нужно смотреть. Таким образом, вы можете иметь тег объекта там, в то же время предотвращая поведение прокрутки по умолчанию.

Надеюсь, это поможет!

+0

Хммм, это может быть на самом деле возможно. Это немного сумасшедший, но может работать ... lol – jimeh

-1

Простым решением было бы переключить стиль переполнения для элемента body/html на вашей странице до , скрытого. Это отключает прокрутку страницы, но должно поддерживать вашу позицию на странице.

//toggle this on and off when showing the window 
document.body.style.overflow = 'hidden'; 
+0

Хм, я не думаю, что это хорошее решение, потому что пользователям придется щелкнуть снаружи вспышки, чтобы он потерял фокус, прежде чем они могли прокручивать вверх или вниз по странице. – jimeh

1

нормально, после 2 дней поиска в Интернете для ответа я нашел чистую функцию JS, что исправить это во всех браузерах!

там вы идете:

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

теперь вы можете просто запустить в при загрузке страницы с JQuery:

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

Этот подход лучше, даже работает в IE 7. – Shawn

 Смежные вопросы

  • Нет связанных вопросов^_^