Есть ли кросс-браузерный способ игнорировать непрозрачность при использовании jquery clone ()? - PullRequest
3 голосов
/ 22 августа 2009

Я использую таблицы в своем документе и хочу, чтобы пользователь мог отправить новый элемент в список, а затем «автоматически» отобразить его в верхней части списка (да, это было бы проще с DIVs, но работает с тем, что у меня есть).

Я использую jQuery и clone(), чтобы создать копию самой последней строки таблицы, затем использую fadeIn(), чтобы отобразить новый элемент после обновления и добавить его в начало списка. Поскольку внутренне jQuery преобразует элементы (в предположении DIV) в «block», я также изменяю класс css на «table-row». Работает нормально.

Весь код здесь:

    var row = $("tbody tr:first").clone().hide(); // clone and then set display:none
    row.children("td[class=td-date]").html("today");
 // set some properties
    row.children("td[class=td-data]").html("data");
    row.children("td[class=td-type]").html("type");
// fadeIn new row at the top of the table.
    row.insertBefore("tbody tr:first").stop().fadeIn(2000).css("display","table-row"); 

Проблема в том, что, если я запускаю процесс слишком быстро - то есть до завершения fadeIn, команда "clone ()" также завершает клонирование прозрачности.

Я действительно могу заставить его работать в Firefox, настроив первую строку выше:

 var row = $("tbody tr:first").clone().css("opacity","1").hide();

Теперь меня беспокоит то, что я не уверен, что что-то из этого делается эффективно, и / или что «непрозрачность» безопасна для разных браузеров.

Кто-нибудь делал что-то подобное раньше и может предложить какие-либо указатели на более надежный подход?

Ответы [ 3 ]

2 голосов
/ 08 сентября 2009
Непрозрачность

в качестве атрибута jQuery css является безопасным кросс-браузерным, поскольку устраняет различия в реализации браузера. Вот источник

// IE uses filters for opacity
if ( !jQuery.support.opacity && name == "opacity" ) {
  if ( set ) {
    // IE has trouble with opacity if it does not have layout
    // Force it by setting the zoom level
    elem.zoom = 1;

    // Set the alpha filter to set the opacity
    elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
    (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  }

  return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
  (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': "";
}

Следующие работы. Рабочая демонстрация - добавьте / edit к URL, чтобы поиграть с ним.

  // stop previous animation on the previous inserted element
  var prevRow = $("tbody tr:first").stop(true,true);

  var row = prevRow.clone();
  row.children("td.td-date").text("today");
  row.children("td.td-data").text("data");
  row.children("td.td-type").text("type");

  row.fadeIn(2000).prependTo("tbody");
1 голос
/ 08 сентября 2009

Нет причин использовать Hide на вашем клоне. Клон еще не добавлен в домен, поэтому его нельзя увидеть.

Попробуйте это:

var row = $("tbody tr:first").clone(); // clone
// set some properties
row.children("td[class=td-date]").html("today");
row.children("td[class=td-data]").html("data");
row.children("td[class=td-type]").html("type");
// fadeIn new row at the top of the table.
row.insertBefore("tbody tr:first").fadeOut(0).fadeIn(2000).css("display","table-row");
0 голосов
/ 22 августа 2009

Я думаю, jQuery справится с этим, если вы сделаете это.

var row = $("tbody tr:first").clone().fadeIn(0).hide();
...