2015-10-01 2 views
3

У меня есть следующий html, который является тегом dl, содержащим тег dt, с классом переключения и содержит FAQ, а затем тег dd с классом расширения, который содержит ответ на часто задаваемые вопросы :Замена объектов HTML в jQuery

<dl> 
<dt class="toggle">&#9660; Here is a FAQ</dt> 
<dd class="expand"> 
    <p>And here is the answer</p> 
</dd> 
.... 
</dl> 

и следующие JQuery:

$(function() { 
    $('.expand').hide(); 

    $('.toggle').click(function() { 
     var $expand = $(this).next('.expand'); 
     if ($expand.is(':hidden')) { 
      $expand.slideDown(); 
     } else { 
      $expand.slideUp(); 
     } 
    }); 
}); 

Эта функция разворачивает или сворачивает в FAQ ответ.

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

Независимо от того, как я пытаюсь кодировать/использовать функции среза или подстроки, я до сих пор не смог этого добиться.

Любые комментарии оценены, но будьте добры, так как это мой первый пост.

+0

Ваш первый вопрос хорошо сформулирован, что достаточно редко. Добро пожаловать в StackOverflow! – Benjamin

+0

Поместите объекты внутри пролета. Имейте оба элемента для начала и установите класс на dt в состоянии, а css может показать/скрыть их. – epascarello

+0

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

ответ

1

Другим вариантом является просто полагаться на CSS, чтобы показать скрыть стрелки вверх и вниз.

$(".toggle").on("click", function() { 
 
    $(this).toggleClass("open"); 
 
});
.toggle { 
 
    cursor: pointer; 
 
} 
 

 
.toggle > span + span { 
 
    display : none; 
 
} 
 

 
.toggle.open > span { 
 
    display : none; 
 
} 
 

 
.toggle.open > span + span { 
 
    display : inline; 
 
} 
 

 
.toggle + dd.expand { display : none; } 
 
.toggle.open + dd.expand { display : block; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<dl> 
 
<dt class="toggle"><span>&#9650</span><span>&#9660;</span> Here is a FAQ</dt> 
 
<dd class="expand"> 
 
    <p>And here is the answer</p> 
 
</dd> 
 
</dl>

+0

Все эти решения работают отлично, но решение css является самым чистым. Проблема с решением курсивного тега заключается в том, что, как вы считаете, некоторые шрифты выделяют стрелки вверх/вниз и заставляют их выглядеть ужасно! – Freeway

+0

Итак, вы меняете на пролет в этом решении ...;) – epascarello

+0

Точно! И, конечно, у вас есть 2 тега span, один для стрелки вверх и один для вниз, и просто переключайте скрытие и показ. – Freeway

1

Поместите стрелку внутри <i> тега, так что вы можете ориентировать его с помощью JQuery:

<dt class="toggle"><i>&#9660;</i> Here is a FAQ 1</dt> 

Пример:

$(function() { 
 

 
    $('.expand').hide(); 
 

 
    $('.toggle').click(function() { 
 
    var $expand = $(this).next('.expand'); 
 
    var isHidden = $expand.is(':hidden'); 
 
    $expand.slideToggle(); 
 
    $("i", this).html(isHidden? "&#9650;" : "&#9660;"); 
 
    }); 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<dl> 
 
    <dt class="toggle"><i>&#9660;</i> Here is a FAQ 1</dt> 
 
    <dd class="expand"> 
 
    <p>1 And here is the answer</p> 
 
    </dd> 
 
    <dt class="toggle"><i>&#9660;</i> Here is a FAQ 2</dt> 
 
    <dd class="expand"> 
 
    <p>2 And here is the answer</p> 
 
    </dd> 
 
    <dt class="toggle"><i>&#9660;</i> Here is a FAQ 3</dt> 
 
    <dd class="expand"> 
 
    <p>3 And here is the answer</p> 
 
    </dd> 
 
</dl>

+1

Работал сразу и приятное чистое решение. Огромное спасибо. – Freeway

+0

@Freeway спасибо. пожалуйста! –

0

Вы можете заменить на Unicode значение символа вместо объекта HTML.

Характер ▼ 9660 в десятичной форме и 25BC в шестнадцатеричном формате. Таким образом, его объект HTML является &#9660;, а его строковая форма JavaScript - "\u25BC".

То же самое касается ▲, которое равно 9650 в десятичной системе и 25B2 в шестнадцатеричном формате.

Таким образом, вы можете заменить назад и вперед в текстовых строках с:

.replace("\u25BC", "\u25B2"); 

Рабочий пример:

$(function() { 
 
    $('.expand').hide(); 
 

 
    $('.toggle').click(function() { 
 
     var $this = $(this); 
 
     var $expand = $this.next('.expand'); 
 
     if ($expand.is(':hidden')) { 
 
      $expand.slideDown(); 
 
      $this.text($this.text().replace("\u25BC", "\u25B2")); 
 
     } else { 
 
      $expand.slideUp(); 
 
      $this.text($this.text().replace("\u25B2", "\u25BC")); 
 
     } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<dl> 
 
<dt class="toggle">&#9660; Here is a FAQ</dt> 
 
<dd class="expand"> 
 
    <p>And here is the answer</p> 
 
</dd> 
 
.... 
 
</dl>

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