Текстовый своп Jquery - проблема многократного использования

0

Поэтому я использовал скрипт, который я нашел в Stack Overlow для обмена текстом. Сначала он работал отлично, но затем я попытался использовать его снова на одной странице, и я заметил проблему.

Здесь вы можете увидеть проблему: JsFiddle

HTML-код

<div class="gallerycard">
    <div id="textMessage"></div>
    <div class="textContent">
        <div class="girlname">ONE LEFT</div>
    </div>
    <div class="textContent">
        <div class="newgirl">TWO LEFT</div>
    </div>
    <div class="girlimage"></div>
    <div class="girlinfo">TEXT</div>
</div>
<div class="gallerycard">
    <div id="textMessage"></div>
    <div class="textContent">
        <div class="girlname">ONE RIGHT</div>
    </div>
    <div class="textContent">
        <div class="newgirl">TWO RIGHT</div>
    </div>
    <div class="girlimage"></div>
    <div class="girlinfo">TEXT</div>
</div>

JQuery

var cnt=0, texts=[];

// save the texts in an array for re-use
$(".textContent").each(function() {
  texts[cnt++]=$(this).text();
});
function slide() {
  if (cnt>=texts.length) cnt=0;
  $('#textMessage').html(texts[cnt++]);
  $('#textMessage')
    .fadeIn('fast').animate({opacity: 1.0}, 800).fadeOut('fast', 
     function() {
       return slide()
     }
  );      
}      
slide()      

Итак, как я могу удержать их от слияния?

Теги:
text

2 ответа

0

Существует множество проблем, основанных исключительно на слишком большой копии/вставке, не понимая почему.

Оба целевых div имеют одинаковый идентификатор. У вас никогда не должно быть двух элементов на одной странице, которые имеют один и тот же идентификатор. Теперь есть быстрый и грязный способ очистить его, и есть гибкий и эффективный способ его очистки. Я пошел на гибкое решение, и я объясню, как это работает, насколько я могу.

<div class="gallerycard" data-target="textMessageLeft">
    <div id="textMessageLeft"></div>
    <div class="textContent">
        <div class="girlname">ONE LEFT</div>
    </div>
    <div class="textContent">
        <div class="newgirl">TWO LEFT</div>
    </div>
    <div class="girlimage"></div>
    <div class="girlinfo">TEXT</div>
</div>
<div class="gallerycard" data-target="textMessageRight">
    <div id="textMessageRight"></div>
    <div class="textContent">
        <div class="girlname">ONE RIGHT</div>
    </div>
    <div class="textContent">
        <div class="newgirl">TWO RIGHT</div>
    </div>
    <div class="girlimage"></div>
    <div class="girlinfo">TEXT</div>
</div>

Заметьте, что я добавил элемент данных-цели на галерею, содержащую идентификатор div, в который мы хотим поместить текст. Я также изменил идентификаторы на каждом целевом div, чтобы быть уникальным. Это важно для того, чтобы все это работало, а также элемент данных, соответствующий этим идентификаторам.

texts = {};

// save the texts in an array for re-use
$(".textContent").each(function () {
    var target = $(this).parent().attr('data-target');
    if (texts[target] == null) { texts[target] = []; }
    texts[target].push($(this).text());
});

function slide(divId, cnt) {
    if (cnt >= texts[divId].length) cnt = 0;
    $('#' + divId).html(texts[divId][cnt++]);
    $('#' + divId)
        .fadeIn('fast').animate({
        opacity: 1.0
    }, 800).fadeOut('fast',

    function () {
        return slide(divId,cnt)
    });
}

for (var t in texts)
{
    slide(t, 0);
}

В javascript я много изменил, чтобы сделать это расширяемым и гибким решением, а не просто дублировать то, что уже было с двумя отдельными именами.

Сначала мы удалили счетчик и изменили текст на объект ({} вместо []). Отсюда я могу использовать тексты как хэш, что упрощает остальную часть скрипта. Ключ хэша - это значение цели данных из контейнера div сообщения и разделов содержимого. Добавьте столько элементов контента, сколько захотите, под каждым родителем, и все они будут найдены и связаны правильно.

Тексты из каждого div textContent хранятся в массиве, но мы используем функцию push() для устранения необходимости в переменной счетчика - счетчики отлично подходят для одного экземпляра, но они становятся уродливыми с кратными.

Я изменил функцию слайда, чтобы принять две переменные: divId и cnt. divId - это то, как слайдер знает, какой div для цели и cnt позволяет рекурсивному вызову сохранять закрытый счетчик, который не будет конфликтовать с другими экземплярами функции слайдера, работающими одновременно.

Наконец, чтобы снова предотвратить дублирование и разрешить дальнейшее расширение. Вместо простого вызова слайда мы перебираем хэш для получения divId и вызываем экземпляр слайда для каждого divId, который у нас есть. Идем дальше и пытаемся расширить количество панелей или добавить новые div textContent под одним из заголовков. Теперь все работает очень гладко.

Скрипка здесь: http://jsfiddle.net/AX4LC/4/

0

Вам нужно два массива, по одному для каждого, дать каждой из галерей разные идентификаторы и сделать это дважды

var cnt=0, firstTexts=[], secondTexts=[];

// save the texts in an array for re-use
$('#firstID > .textContent').each(function() {
  firstTexts[cnt++]=$(this).text();
});

cnt = 0;
// save the texts in an array for re-use
$('#secondID > .textContent').each(function() {
  secondTexts[cnt++]=$(this).text();
});

и дважды вызовите слайд с соответствующим массивом и идентификатором

Ещё вопросы

Сообщество Overcoder
Наверх
Меню