【问题标题】:How to Modify Content in a Text Block如何修改文本块中的内容
【发布时间】:2015-10-07 18:03:54
【问题描述】:

我有一些看起来像这样的 HTML:

<td class="targetTD">
  <a href="http://foo.com">
    <span>content</span>
  </a>
  **Text I want to modify**
  <span>more content</span>
</td>

targetTD 迭代动态次数取决于正在呈现的内容。对于每次迭代,我需要从文本块中代码的开头删除“:”的子字符串。不幸的是,它不在它自己的元素中,我没有能力将它包装在一个整洁的 id/class 中。我做了一些搜索,发现了一些我认为可以解决问题的 js:

<script>
var myString = $('.targetTD').html();
myString = myString.replace(': ','');
$('.targetTD').html(myString);
</script>

但这会吐出一个控制台错误:

无法获取未定义或空引用的属性“替换”。

最终更新(解决方案)

感谢@Vaibhav 提出修复!这个脚本成功了:

<script type="text/javascript">

    $(function() {
        $('.targetTD').each(function () {
            $(this).html($(this).html().replace(/\:\s/g, ''));
        });
    });

</script>

更新 1

感谢@BenM,我能够使用以下代码阻止错误产生:

<script>
$(function() {
    $('.targetTD').html(function() { $(this).html().replace(': ', ''); });
});
</script>

虽然我现在没有收到错误消息,但这仍然没有从文本块中删除“:”。关于为什么会这样的任何想法?

更新 2

为了广泛提供一些 SharePoint 细节,以回应@ElvisLikeBear 的评论:

  • 我要完成的具体任务是从按列表分组的列表中隐藏列名。在 SP2010 中,通过隐藏 ms-gb 类很容易做到这一点。 2013 年,Microsoft 将展开/折叠按钮与此类混为一谈,因此无法将其全部隐藏。我已经成功地隐藏了带有列名的跨度(在我上面的代码中,跨度包含在 a 中),但是“:”仍然在文本块中无济于事,现在它只是漂浮在每个类别的开头名字。

  • 代码正在页面级别部署为 sn-p,使用脚本编辑器 Web 部件。

【问题讨论】:

  • 错误表示mystring 为空。你能举一个带冒号的html的例子吗?
  • 您是否将 td 包含在表格和 tr 中?如果不是,那么它不是有效的 html,jquery 将无法找到它。这是您的代码的工作小提琴。唯一额外的事情是我已经将它附在 table 和 tr jsfiddle.net/4262prrs/4
  • 您是否将代码包装在document.ready 中,以便在代码运行时存在元素?需要理解的重要概念
  • 也将你的脚本包装在 $(document).ready(function({//Script}); 如果你还没有这样做的话,它会在所有元素加载后运行。
  • 小心附加到该 HTML 的事件和数据。您将丢失它们,因为您正在删除 DOM 元素并创建具有相同内容的新元素。

标签: javascript jquery css sharepoint-2013


【解决方案1】:

Brendan,您的代码的问题是您将 ':' 替换为 '' 但您没有再次将其分配给同一个 td。

Replace(':','') 函数仅替换第一次出现的 ':'。请按照我的代码。它会将所有的 ':' 替换为 ''。

参考“targetTD根据正在呈现的内容迭代动态次数”

我假设您需要 foreach 循环 来遍历所有 Td。

HTML :-

<table>
    <tr>
        <td class="targetTD">
            <a href="http://foo.com">
                <span>content</span>
            </a>
            Test:Test1
            <span>more content</span>
        </td>
    </tr>
    <tr>
        <td class="targetTD">
            <a href="http://foo.com">
                <span>content</span>
            </a>
            Test:Test1:test2
            <span>more content</span>
        </td>
    </tr>
    <tr>
        <td class="targetTD">
            <a href="http://foo.com">
                <span>content</span>
            </a>
            Test:Test1:test3:test4
            <span>more content</span>
        </td>
    </tr>
</table>

jQuery :-

<script type="text/javascript">

    $(function() {
        $('.targetTD').each(function () {
            $(this).html($(this).html().replace(/\:/g, ''));
        });
    });
    </script>

脚本已经过测试并且工作正常。

【讨论】:

  • 谢谢@Vaibhav!这几乎可以工作。它成功地删除了文本框中的 :,但它也删除了 &lt;a href="http://foo.com"&gt; 标记中的 : 并破坏了该链接。通过将替换函数中的正则表达式更改为 /\:\s/g,我能够成功删除有问题的“:”并避免破坏 a 标记。再次,非常感谢!!
【解决方案2】:

确保 DOM 准备就绪:

<script>
$(function() {
    $('.targetTD').html(function() { $(this).html().replace(': ', ''); });
});
</script>

【讨论】:

  • 感谢 BenM!我没有收到这个脚本的错误,但它也没有像我希望的那样替换文本。还有其他想法吗?
  • @BenM 不幸的是,鉴于 SharePoint 自己的内容的执行顺序,这在 SharePoint 中不起作用
【解决方案3】:

您的标记表明这是在 SharePoint 网站上执行的,这就是您的代码未触发的原因。您需要为 SharePoint 正确部署它。

您可以在解决方案或功能中执行此操作,或者如果它是单页脚本,您应该使用脚本 Web 部件(在 SharePoint 2010 和 2007 中称为内容编辑器 Web 部件),您还可以将代码 sn-p 添加到SharePoint 2013 中的页面。

您也可以通过 SharePoint designer 将脚本添加到标签中,但我认为这不是最佳做法,除非在一些非常特定的情况下(但对于非 SharePoint 开发人员来说,这将是最简单的方法)。

【讨论】:

  • 嗨@ElvisLikeBear - 感谢您的评论。这实际上部署为脚本编辑器 Web 部件中的 sn-p。我正在尝试覆盖在按列表分组的特定类别之前插入“(COLUMN NAME):”的默认 SharePoint 行为,但不是在所有页面上。在 2010 年,文本被方便地包裹在 ms-gb 类中,但在 2013 年,使用 CSS 隐藏该类现在也隐藏了展开/折叠按钮。
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2023-01-03
相关资源
最近更新 更多