1

我正在使用 Sharepoint (WSS 3.0),不幸的是,它在格式化调查问题的能力方面非常有限(即,它会删除您输入的任何 HTML)。我在其他地方看到了一个解决方案,建议我们在母版页文件中添加一些 JS 以允许换行。这很好用,但我想看看我们是否也可以允许链接。

在我们的 WSS 调查中,我现在可以在任何需要换行符的地方使用 {{br}}(这很有效)。我尝试扩展代码以允许使用链接标签(例如,{{link1}}url{{link2}}URL Title{{link3}};但是,这不起作用,大概是因为更新不是作为一个整体发生,然后浏览器尝试逐个渲染它,使其混淆。(FF和IE显示不同的结果,但都失败了。如果我混淆了下面JS的顺序 - 即,做link3, 2然后 1 - 输出也发生变化,但仍然失败。)有没有更好的方法来做到这一点?


<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>
4

2 回答 2

5

不要以块的形式修改 innerHTML 属性(每次更改 innerHTML 时,浏览器都会尝试更新 DOM,如果您提供不完整/损坏的标记,显然会搞砸),而是针对您自己的字符串变量进行所有修改,然后用您完成的字符串覆盖整个 innerHTML:

<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>
于 2009-05-19T18:28:23.130 回答
3

简单的答案是构建 innerHTML 并立即将其全部替换:

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;
    }
}

更复杂的答案是在你的正则表达式中使用捕获组并将一个函数作为第二个参数传递给replace(),以便对HTML 使用一个replace() 调用。例如,

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

第二种解决方案更复杂,会导致一些丑陋的正则表达式,但比一遍又一遍地调用 replace() 更有效。

于 2009-05-19T18:29:02.023 回答