«Неверный аргумент» в IE 8 для jQuery.prepend () на flash-объектах - PullRequest
1 голос
/ 05 февраля 2012

Демонстрационная страница .

При запуске в IE 8 этот код выдает исключение с «Неверный аргумент».как описание и сообщение, и этот номер: -2147024809

Я использую последнюю (1.7.1) jQuery.Это известная ошибка?Как решить?

var objs=$('object').not('object param[name="wmode"][value="transparent"]');
var appended = $('<param name="wmode" value="transparent"></param>');
objs.prepend(appended);

Фрагмент HTML:

<object width="Width in Pixels" height="Height in Pixels" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0">
  <param name="salign" value="lt">
  <param name="quality" value="high">
  <param name="scale" value="noscale">

  <param name="movie" value="http://geekfile.googlepages.com/flvplay.swf">
  <param name="FlashVars" value="&streamName=FLV_Video_URL&skinName=http://geekfile.googlepages.com/flvskin&autoPlay=true&autoRewind=true">
  <embed width="Width in Pixels" height="Height in Pixels" flashvars="&streamName=FLV_Video_URL&autoPlay=true&autoRewind=true&skinName=http://geekfile.googlepages.com/flvskin" quality="high" scale="noscale" salign="LT" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://geekfile.googlepages.com/flvplay.swf" wmode="transparent">
  </embed>
</object>

Ошибка в строке 5771 jquery.js:

this.insertBefore( elem, this.firstChild );

Обновление : Это не «проблема jQuery» - это происходит с необработанным javascript.

Этот код выдает :

function handle(object) {
  var html = object.innerHTML;

  // The following line throws an exception:
  // Also, 'html' is not empty or undefined at this point.
  object.innerHTML = '<param name="wmode" value="transparent"></param>' + html;  
}

Ответы [ 3 ]

2 голосов
/ 03 августа 2012

Как утверждает Fresheyeball, IE не видит <object/> как часть DOM или, скорее, не допускает изменений, как только он был вставлен в документ (тогда как перед вставкой он может быть очень хорошо изменен).

Простое и достаточно безопасное решение, чтобы исправить это, состоит в изменении полного outerHTML узла. Это не приведет к изменению элемента, но удалит его, создаст заново, заменит его и, следовательно, не вызовет вышеуказанное исключение.

Пример для jQuery:

$("object:has(> param[name=wmode][value=window]), object:not(:has(> param[name=wmode]))").each(replace);
function replace() {
  this.outerHTML = this.outerHTML.replace(/<(?:[^">]+|(["']).*?\1)*>/, '$&<param name="wmode" value="opaque"/>');
}

Аналогичный повторный рендеринг для <embed/> может быть достигнут следующим образом:

$("embed[wmode=window], embed:not([wmode])").attr("wmode", "opaque").wrap("<div/>").unwrap();
1 голос
/ 05 февраля 2012

Я не уверен на 100% в этом, но столкнулся с чем-то подобным и раньше, и это было специфично для тега <object>.IE не видит это как часть html dom, поэтому манипуляции с jquery возвращают нулевой объект.Решение, которое я помню, работало как html5shiv, создайте элемент объекта и добавьте параметр в виде строки вместо объекта jQuery, и все должно быть хорошо.

В качестве альтернативы, вы можете заключить flash в элемент div, а затемвнутренний HTML этого div, добавьте к этому html, а затем поместите его обратно в div.

0 голосов
/ 02 марта 2012

Сценарий, приведенный ниже, не совсем то исправление из двух или трех строк, на которое я надеялся, но я нашел эту статью очень полезной. Я немного изменил его и убрал проверку на jQuery, но это сработало как шарм!

http://www.developersnippets.com/2010/12/04/how-to-add-wmodetransparent-for-flash-object-using-jquery-and-native-javascript/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...