Usando innerHTML.replace para substituir o texto para criar o link

votos
1

Estou usando Sharepoint (WSS 3.0), que é, infelizmente, muito limitado em sua capacidade de formatar perguntas da pesquisa (ou seja, ele retira qualquer HTML que você entra). Vi uma solução em outro lugar que sugeriu que adicionar alguns JS para o nosso arquivo de página mestra para permitir quebras de linha. Isso funciona muito bem, mas eu gostaria de ver se podemos permitir links também.

Em nossas pesquisas WSS, agora eu posso usar `br` qualquer lugar eu quero uma quebra de linha (isso funciona). Eu tentei estender o código para permitir o uso de tags de link (por exemplo, `link1`url`link2`URL Title`link3`; mas, isso não funciona, provavelmente porque as atualizações não estão acontecendo como um todo, e o navegador, em seguida, tenta torná-lo peça por peça, confundindo-o (FF e iE mostrar resultados diferentes, mas ambos falham Se eu misturar a ordem do JS abaixo -.. isto é, fazer link3, 2 e, em seguida, 1 - a alterações de saída, bem como, mas ainda falha.) existe uma maneira melhor de fazer isso?


<script language=JavaScript>
var className;
className = 'ms-formlabel';
var elements = new Array();
var elements = document.getElementsByTagName('td');
for (var e = 0; e < elements.length; e++)
{
if (elements[e].className == className){
elements[e].innerHTML = elements[e].innerHTML.replace(/`br`/g,'<br/>');
elements[e].innerHTML = elements[e].innerHTML.replace(/`link1`/g,'<a href=');
elements[e].innerHTML = elements[e].innerHTML.replace(/`link2`/g,'>');
elements[e].innerHTML = elements[e].innerHTML.replace(/`link3`/g,'</a>');}
}
</script>
Publicado 19/05/2009 em 19:24
fonte usuário
Em outras línguas...                            


2 respostas

votos
5

Em vez de modificar a propriedade innerHTML em blocos (o navegador tenta atualizar o DOM cada vez que você alterar innerHTML, que se você fornecer marcação incompleta / quebrado, obviamente vai baralhar as coisas), fazer todas as modificações contra sua própria variável de cadeia e, em seguida, substituir todo o innerHTML com sua seqüência completou:

<script language="JavaScript">
var className;
className = 'ms-formlabel';
var elements = new Array();
var elements = document.getElementsByTagName('td');
for (var e = 0; e < elements.length; e++)
{
if (elements[e].className == className) {
    var newHTML = elements[e].innerHTML;

    newHTML = newHTML.replace(/`br`/g,'<br/>');
    newHTML = newHTML.replace(/`link1`/g,'<a href="');
    newHTML = newHTML.replace(/`link2`/g,'">');
    newHTML = newHTML.replace(/`link3`/g,'</a>');}

    elements[e].innerHTML = newHTML;
}
</script>
Respondeu 19/05/2009 em 19:28
fonte usuário

votos
3

A resposta mais simples seria a de construir o innerHTML e substituí-lo de uma só vez:

for (var e = 0; e < elements.length; e++)
{
    if (elements[e].className == className) {
        var newHTML = elements[e].innerHTML;
        newHTML = newHTML.replace(/`br`/g,'<br/>');
        newHTML = newHTML.replace(/`link1`/g,'<a href="');
        newHTML = newHTML.replace(/`link2`/g,'">');
        newHTML = newHTML.replace(/`link3`/g,'</a>');
        elements[e].innerHTML = newHTML;
    }
}

A resposta mais complexa seria a utilização de grupos de captura em seu regex e passar uma função como o segundo parâmetro para substituir (), de modo a usar uma única chamada para substituir () para o HTML. Por exemplo,

elements[e].innerHTML = elements[e].innerHTML.replace(/(`link1`)|(`link2`)|(`link3`)/g, 
    function (match) {
        var map = { 
            '`link1`' : '<a href="',
            '`link2`' : '>',
            '`link3`' : '</a>', }
        return map[match];
    });

A segunda solução é mais complexa e leva a algumas expressões regulares feias, mas é mais eficiente do que chamar replace () uma e outra vez.

Respondeu 19/05/2009 em 19:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more