Para um site I'estou fazendo, eu quero carregar um mergulho, e esconder outro, depois ter dois botões que vão alternar as visualizações entre os mergulhos usando JavaScript.
**Este é o meu código actual***
function replaceContentInContainer(target, source) {
document.getElementById(target).innerHTML = document.getElementById(source).innerHTML;
}
function replaceContentInOtherContainer(replace_target, source) {
document.getElementById(replace_target).innerHTML = document.getElementById(source).innerHTML;
}
<html>
<button onClick="replaceContentInContainer('target', 'replace_target')">View Portfolio</button>
<button onClick="replaceContentInOtherContainer('replace_target', 'target')">View Results</button>
<div>
<span id="target">div1</span>
</div>
<div style="display:none">
<span id="replace_target">div2</span>
</div>
A segunda função que substitui o div2 não está funcionando, mas a primeira está.
Para mostrar ou ocultar um elemento, manipule o elemento's propriedade estilo. Na maioria dos casos, você provavelmente só quer mudar o elemento's propriedade display
:
element.style.display = 'none'; // Hide
element.style.display = 'block'; // Show
element.style.display = 'inline'; // Show
element.style.display = 'inline-block'; // Show
Alternativamente, se você ainda gostaria que o elemento ocupasse espaço (como se você fosse esconder uma célula de tabela), você poderia mudar o elemento's propriedade `visibilidade' em vez disso:
element.style.visibility = 'hidden'; // Hide
element.style.visibility = 'visible'; // Show
Se você quiser esconder uma coleção de elementos, basta iterar sobre cada elemento e mudar o elemento's display
para ninguém
:
function hide (elements) {
elements = elements.length ? elements : [elements];
for (var index = 0; index < elements.length; index++) {
elements[index].style.display = 'none';
}
}
// Usage:
hide(document.querySelectorAll('.target'));
hide(document.querySelector('.target'));
hide(document.getElementById('target'));
hide(document.querySelectorAll('.target'));
function hide (elements) {
elements = elements.length ? elements : [elements];
for (var index = 0; index < elements.length; index++) {
elements[index].style.display = 'none';
}
}
<div class="target">This div will be hidden.</div>
<span class="target">This span will be hidden as well.</span>
Na maioria das vezes, você provavelmente estará apenas alternando entre display: none' e
display: block', o que significa que o seguinte poderá ser suficiente ao mostrar uma coleção de elementos.
Você pode opcionalmente especificar o display
desejado como o segundo argumento se você não'não quer que ele seja o `bloqueio' por padrão.
function show (elements, specifiedDisplay) {
elements = elements.length ? elements : [elements];
for (var index = 0; index < elements.length; index++) {
elements[index].style.display = specifiedDisplay || 'block';
}
}
// Usage:
var elements = document.querySelectorAll('.target');
show(elements);
show(elements, 'inline-block'); // The second param allows you to specify a display value
var elements = document.querySelectorAll('.target');
show(elements, 'inline-block'); // The second param allows you to specify a display value
show(document.getElementById('hidden-input'));
function show (elements, specifiedDisplay) {
elements = elements.length ? elements : [elements];
for (var index = 0; index < elements.length; index++) {
elements[index].style.display = specifiedDisplay || 'block';
}
}
<div class="target" style="display: none">This hidden div should have a display of 'inline-block' when it is shown.</div>
<span>Inline span..</span>
<input id="hidden-input" />
Alternativamente, uma melhor abordagem para mostrar o(s) elemento(s) seria simplesmente remover o estilo inline display
a fim de revertê-lo de volta ao seu estado inicial. Em seguida, verifique o estilo display
computado do elemento para determinar se ele está sendo escondido por uma regra em cascata. Se assim for, então mostre o elemento.
function show (elements, specifiedDisplay) {
var computedDisplay, element, index;
elements = elements.length ? elements : [elements];
for (index = 0; index < elements.length; index++) {
element = elements[index];
// Remove the element's inline display styling
element.style.display = '';
computedDisplay = window.getComputedStyle(element, null).getPropertyValue('display');
if (computedDisplay === 'none') {
element.style.display = specifiedDisplay || 'block';
}
}
}
show(document.querySelectorAll('.target'));
function show (elements, specifiedDisplay) {
var computedDisplay, element, index;
elements = elements.length ? elements : [elements];
for (index = 0; index < elements.length; index++) {
element = elements[index];
// Remove the element's inline display styling
element.style.display = '';
computedDisplay = window.getComputedStyle(element, null).getPropertyValue('display');
if (computedDisplay === 'none') {
element.style.display = specifiedDisplay || 'block';
}
}
}
<span class="target" style="display: none">Should revert back to being inline.</span>
<span class="target" style="display: none">Inline as well.</span>
<div class="target" style="display: none">Should revert back to being block level.</div>
<span class="target" style="display: none">Should revert back to being inline.</span>
(Se você quiser dar um passo adiante, você pode até imitar o que jQuery faz e determinar o estilo padrão do elemento's do navegador, anexando o elemento a um 'iframe' em branco (sem uma folha de estilo conflitante) e então recuperar o estilo computado. Ao fazer isso, você saberá o verdadeiro valor inicial da propriedade display
do elemento e você ganhou'não precisa codificar um valor para obter os resultados desejados).
Da mesma forma, se você gostaria de alternar o display
de um elemento ou coleção de elementos, você poderia simplesmente iterar sobre cada elemento e determinar se ele é visível, verificando o valor computado da propriedade display
. Se ele's visível, defina o display
para ninguém
, caso contrário remova o estilo inline display
, e se ele's ainda estiver escondido, defina o display
para o valor especificado ou o padrão hardcoded, block
.
function toggle (elements, specifiedDisplay) {
var element, index;
elements = elements.length ? elements : [elements];
for (index = 0; index < elements.length; index++) {
element = elements[index];
if (isElementHidden(element)) {
element.style.display = '';
// If the element is still hidden after removing the inline display
if (isElementHidden(element)) {
element.style.display = specifiedDisplay || 'block';
}
} else {
element.style.display = 'none';
}
}
function isElementHidden (element) {
return window.getComputedStyle(element, null).getPropertyValue('display') === 'none';
}
}
// Usage:
document.getElementById('toggle-button').addEventListener('click', function () {
toggle(document.querySelectorAll('.target'));
});
document.getElementById('toggle-button').addEventListener('click', function () {
toggle(document.querySelectorAll('.target'));
});
function toggle (elements, specifiedDisplay) {
var element, index;
elements = elements.length ? elements : [elements];
for (index = 0; index < elements.length; index++) {
element = elements[index];
if (isElementHidden(element)) {
element.style.display = '';
// If the element is still hidden after removing the inline display
if (isElementHidden(element)) {
element.style.display = specifiedDisplay || 'block';
}
} else {
element.style.display = 'none';
}
}
function isElementHidden (element) {
return window.getComputedStyle(element, null).getPropertyValue('display') === 'none';
}
}
.target { display: none; }
<button id="toggle-button">Toggle display</button>
<span class="target">Toggle the span.</span>
<div class="target">Toggle the div.</div>
Usando estilo:
<style type="text/css">
.hidden {
display: none;
{
.visible {
display: block;
}
</style>
Utilizar um manipulador de eventos em JavaScript é melhor que o atributo onclick=""
em HTML:
<button id="RenderPortfolio_Btn">View Portfolio</button>
<button id="RenderResults_Btn">View Results</button>
<div class="visible" id="portfolio">
<span>div1</span>
</div>
<div class"hidden" id="results">
<span>div2</span>
</div>
JavaScript:
<script type="text/javascript">
var portfolioDiv = document.getElementById('portfolio');
var resultsDiv = document.getElementById('results');
var portfolioBtn = document.getElementById('RenderPortfolio_Btn');
var resultsBtn = document.getElementById('RenderResults_Btn');
portfolioBtn.onclick = function() {
resultsDiv.setAttribute('class', 'hidden');
portfolioDiv.setAttribute('class', 'visible');
};
resultsBtn.onclick = function() {
portfolioDiv.setAttribute('class', 'hidden');
resultsDiv.setAttribute('class', 'visible');
};
</script>
jQuery]1 pode ajudá-lo a manipular elementos DOM facilmente!