2012-03-28 2 views
1

Я включил JavaScript на третьей странице на третьей странице. Это добавляет следующий элемент на странице через некоторое время после загрузки страницы:Изменение классов CSS, добавленных в DOM во время выполнения

<a class="foo">some link</a> 

Мне нужно убедиться, что это меняется на:

<a class="bar">some link</a> 

ASAP после того, как элемент добавляется к странице. Я попытался добавить следующее к JQuery готовый обработчик

$('a.gullSearchBtn').removeClass('gullSearchBtn').addClass('roundButton'); 

Но это выполняется перед добавлением элемента и, следовательно, не работает. Я искал в Интернете, и похоже, что функция jQuery, известная как «livequery», может быть решением моей проблемы, но я не могу заставить ее работать.

+2

'Это добавляет следующий элемент на странице некоторое время после того, как страница loaded' является ключом к вашему вопросу. Можете ли вы рассказать о том, что означает «некоторое время после»? –

+0

@ Don - Я ненавижу это решение, но это то, что я делал для чего-то очень похожего на одном из моих собственных сайтов. По крайней мере, он пытается быть несколько изящным. Как добавляется элемент? Есть ли какое-либо событие или крючок, который вы можете захватить? http://stackoverflow.com/questions/7323716/how-to-mimic-the-jquery-plugin-livequery – mrtsherman

+0

@ Don: привет, чувак, вы собираетесь проверить мой ответ? я знаю, что это старый, но время от времени я возвращаюсь, чтобы проверить старые ответы без текущего решения ...!;) –

ответ

1

Вы можете просто пойти на родные стили и использовать функцию setTimeout, чтобы проверить, не выйдет ли она. Но это будет работать только если у вас есть уникальный способ определить, что элемент, например: это единственный якорь элемент с классом Foo

Мой Рекомендуемый цикл

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

function checkTimer(){ 
    var ele = $('a.foo'); 
    if(ele.length == 0){ 
     setTimeout(function(){ 
      checkTimer(); 
     },100); 
    } 
    else { 
     ele.attr('class','bar'); 
    } 
} 

Некоторые предполагают, что вы используете setInterval(), который обеспечивает ту же функциональность, что и цикл выше. По личному опыту я знаю, насколько склонно это ломать, но вот код для этой версии.

setInterval() Loop

var timer; 
$(document).ready(function(){ 
    timer = setInterval(function(){ 
     checkTimer(); 
    },100); 
}); 

function checkTimer(){ 
    var ele = $('a.foo'); 
    if(ele.length != 0){ 
     ele.attr('class','bar'); 
     clearTimeout(timer) 
    } 
} 
+3

'setInterval()' предназначен для такого рода функций, используя 'setTimeout()' просто приводит к более сложному коду. Поскольку у вас уже есть '$ ('a.foo')' хранится в 'элементе', повторное выделение в блоке' else' необязательно. –

+0

не забудьте 'clearTimeout();' если вы идете так –

+0

@AnthonyGrist. Хотя вы правы, это хороший ответ! ** + 1 ** (для вас обоих) – gdoron

1

Связывание с DOMNodeInserted или DOMSubtreeModified может помочь достичь этого. Но в соответствии со следующей должности это не будет работать с IE

How to detect new element creation in jQuery?

0

Рассматривали ли вы это?

оригинальный CSS

.roundButton { 
    [your rules] 
} 

изменил CSS

.gullSearchBtn, .roundButton { 
    [your rules] 
} 
+0

Класс может использоваться для чего-то другого, кроме CSS, например, для стороннего скрипта, который он упоминает. В этом случае он нуждается в изменении класса. –

+0

Да (и я говорю о * рассмотрении * добавлении селектора) - но он также не может использоваться ни для чего, кроме стиля; в этом случае это было бы самым легким изменением для получения желаемого результата. –

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