javascript - 用 Jquery 替换 <script> 标签内 HTML 中的值

标签 javascript jquery html parsing replace

我周末的大部分时间都对看似简单的修复视而不见,因此我向你们寻求专业知识。

我有以下脚本标记的 X 个实例(但始终具有相同的类名):

   <script type="text-html" class="tmpl-popup"><div class="acf-fc-popup">
        <ul>
                                <li>
                    <a href="#" data-layout="one_column" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/one_column.png" /> <span>One Column</span></a>
                </li>
                                <li>
                    <a href="#" data-layout="two_columns" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/two_columns.png" /> <span>Two Columns</span></a>
                </li>
                        </ul>
        <a href="#" class="focus"></a>
    </div>
</script>

其中我首先需要将 %%THEMEPATH%% 替换为包含站点名称(可能是“http://mydomainname.com ”)的变量。替换完成后,我需要将脚本标记内的 img 标记的 src 替换为值数据图像值。

但我似乎无法让它按照我想要的方式工作,因为 HTML 位于脚本标记内。这是我到目前为止一直在做的事情,但它似乎并没有真正完成这项工作:(

jQuery(".tmpl-popup").each(function(index){

        var haystack = jQuery(this).html(),
            needle = haystack.replace(/%%THEMEPATH%%/g, themePath);

            jQuery(this).html(needle);

            var popup = jQuery(jQuery.parseHTML(haystack)),
                imageSrc = jQuery(popup).find('img').data('image'),

            jQuery(popup).find('img').attr('src',imageSrc);

            jQuery(this).html(popup);       

    });

如果有人可以帮助我,请提前致谢:(

最佳答案

您可以使用 jQuery 的 html 的函数回调版本,并使用全局字符串替换 %%THEMEPATH%% 部分,然后(正如您提出的那样) ) 解析 HTML 并处理其中的图像,然后返回源更新 script 元素文本:

$("script.tmpl-popup").html(function(_, html) {
  // Update %%THEMEPATH%%
  html = html.replace(/%%THEMEPATH%%/g, "http://example.com");

  // Update src: `$.parseHTML` gives us an array of the top-level elements.
  // we loop through them, finding any `img[data-image]` that they contain,
  // and updating the `src` on those.
  return $.parseHTML(html).map(function(element) {
    // Note: If it were possible for an `img[data-image]` to be *at* the top
    // level, you'd need: `$(element).find("img[data-image]").addBack("img[data-image").attr...
    $(element).find("img[data-image]").attr("src", function() {
      return this.getAttribute("data-image"); // or $(this).attr("data-image") if you want more jQuery :-)
    });
    return element.outerHTML;
  });
});

$("script.tmpl-popup").html(function(_, html) {
  // Update %%THEMEPATH%%
  html = html.replace(/%%THEMEPATH%%/g, "http://example.com");
  
  // Update src: `$.parseHTML` gives us an array of the top-level elements.
  // we loop through them, finding any `img[data-image]` that they contain,
  // and updating the `src` on those.
  return $.parseHTML(html).map(function(element) {
    // Note: If it were possible for an `img[data-image]` to be *at* the top
    // level, you'd need: `$(element).find("img[data-image]").addBack("img[data-image").attr...
    $(element).find("img[data-image]").attr("src", function() {
      return this.getAttribute("data-image"); // or $(this).attr("data-image") if you want more jQuery :-)
    });
    return element.outerHTML;
  });
});
<p>You'll have to use right-click Inspect Element to see that the change has happened. :-)</p>
<script type="text-html" class="tmpl-popup"><div class="acf-fc-popup">
        <ul>
                                <li>
                    <a href="#" data-layout="one_column" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/one_column.png" /> <span>One Column</span></a>
                </li>
                                <li>
                    <a href="#" data-layout="two_columns" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/two_columns.png" /> <span>Two Columns</span></a>
                </li>
                        </ul>
        <a href="#" class="focus"></a>
    </div>
</script>
<script type="text-html" class="tmpl-popup"><div class="acf-fc-popup">
        <ul>
                                <li>
                    <a href="#" data-layout="one_column" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/one_column.png" /> <span>One Column</span></a>
                </li>
                                <li>
                    <a href="#" data-layout="two_columns" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/two_columns.png" /> <span>Two Columns</span></a>
                </li>
                        </ul>
        <a href="#" class="focus"></a>
    </div>
</script>
<script type="text-html" class="tmpl-popup"><div class="acf-fc-popup">
        <ul>
                                <li>
                    <a href="#" data-layout="one_column" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/one_column.png" /> <span>One Column</span></a>
                </li>
                                <li>
                    <a href="#" data-layout="two_columns" data-min="" data-max=""><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=" data-image="%%THEMEPATH%%/images/admin/layouts/two_columns.png" /> <span>Two Columns</span></a>
                </li>
                        </ul>
        <a href="#" class="focus"></a>
    </div>
</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

关于javascript - 用 Jquery 替换 &lt;script&gt; 标签内 HTML 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43570642/

相关文章:

javascript - 使变量在函数/类中可用

javascript - 如何使用 Clojurescript 与 html DOM 交互?

javascript - 使用不同的值和不同的数据大小更新 D3 柱形图

jquery - 在我的表单中实现一个选择元素,但不确定如何获取列表的用户选择

python - 如何将 html 附加到我的 QWebEngineView

javascript - 如果 img src 为空,如何使用 javascript 删除 div

jQuery 计算类中的元素

javascript - JQuery - 在本地工作,但 $ 未定义,但仅在部署的站点上定义

javascript - 语法错误: '#companySize option:selected' is not a valid selector

javascript - 带有 onkeyup 事件的输入标签用于建议数据列表,不适用于键盘上/下箭头键