【问题标题】:find(), each() and replacewith() in passed HTML in jQueryjQuery 中传递的 HTML 中的 find()、each() 和 replacewith()
【发布时间】:2012-05-06 00:23:34
【问题描述】:

我有一些 HTML 代码要传递给一个函数,该函数不是要查找所有 iframe,用图像替换 iframe 代码,然后返回修改后的 html。但是,它似乎并没有替换返回的 html 中的 iframe 代码。我很确定我只是错误地引用了 hte 替换,但在网上找不到任何类似于我试图做的例子。它们都引用搜索整个文档或在文档中显示 html 之后。此 HTML 不是也不能是由于应用程序要求。

请注意:我已经生成了 youtube 代码来替换 iframe 代码。问题在于执行替换。

function article_youtube_convert(html) {
    //go throught the iframes for youtube and convert them to embed

    $(html).find('iframe').each(function(i) {
                     alert(this.src);
        //ok what we need to do here is check if it's youtube 
        src_youtube = this.src;
        if(src_youtube.indexOf('http://www.youtube.com')!=-1){
           //so now we need the video id 
           url_parts = src_youtube.split('/');

           youtube_id = url_parts[url_parts.length-1];

           url_parts = youtube_id.split('?');
           youtube_id = url_parts[0];

           youtube_link = 'http://www.youtube.com/watch?v='+youtube_id;
           img_youtube = '<a id="tempvid" href="'+youtube_link+'"><img src="http://img.youtube.com/vi/'+youtube_id+'/0.jpg"/><br />View YouTube Video</a>';

            $(this).replaceWith(img_youtube);


                     //alert(document.getElementById('tempvid').innerHTML);  
        }
    });
    return html;


}

更新

我决定尝试使用 outerHTML 方法,并用变量中的新替换文本替换文本,如下所示。我提醒完整的来源没有问题,但它仍然不能取代它。

jQuery.fn.outerHTML = function(s) {
    return s
    ? this.before(s).remove()
    : jQuery("<p>").append(this.eq(0).clone()).html();
};


function article_youtube_convert(passed) {
    //go throught the iframes for youtube and convert them to embed
    //alert('inside');
    newhtml = passed;
    //alert(newhtml);
    $(newhtml).find('iframe').each(function(i) {
                     //alert(this.src);
        //ok what we need to do here is check if it's youtube 
        src_youtube = this.src;
        if(src_youtube.indexOf('http://www.youtube.com')!=-1){
           //so now we need the video id 
           url_parts = src_youtube.split('/');
                                   alert('youtube vid');
           youtube_id = url_parts[url_parts.length-1];

           url_parts = youtube_id.split('?');
           youtube_id = url_parts[0];

           youtube_link = 'http://www.youtube.com/watch?v='+youtube_id;
           img_youtube = '<a id="tempvid" href="'+youtube_link+'"><img src="http://img.youtube.com/vi/'+youtube_id+'/0.jpg"/><br />View YouTube Video</a>';
                                   alert('alert: '+$(this).outerHTML());
                                   sourcethe = $(this).outerHTML();
                                   passed.replace(sourcethe,img_youtube);
            //$(this).replaceWith(img_youtube);
                                   //alert($(this));


                     //alert(document.getElementById('tempvid').innerHTML);  
        }
    });
    alert(passed);
    return passed;


}

【问题讨论】:

  • 你检查 replaceWith 是否可以接受 HTML 字符串?我建议尝试 replaceWith( $(img_youtube) ) 看看结果如何。
  • @BiAiB:如果您在说这种话之前自己检查 API,可以节省时间。 ;-) api.jquery.com/replaceWith 建议它可以愉快地接受 jquery 对象、html 字符串或 dom 元素。

标签: javascript jquery dom replace find


【解决方案1】:

看起来你实际上并没有从那个函数返回你想要的......

你从来没有真正改变你的方法中的html,你只是用它来做一些被丢弃的东西,然后返回你输入的东西。

你最可能想做的事情是

var jqHtml = $(html);
...Do stuff to modify jqHtml...
return jqHtml.html();

我不确定也没有测试过的一件事是 .html() 是否返回你想要的。文档说它使用元素 innerHTML 属性,但我不确定这是否会给从字符串构造的 jquery 对象提供正确的东西(我认为它应该)。

无论如何,这是您的基本问题,您根本没有修改 html。 $(html) 正在获取html 字符串的副本,而不是对其可以根据需要进行更新的引用。

【讨论】:

  • 感谢您迄今为止的帮助。好的,那么,在这种情况下,我需要一些东西来用我生成的代码替换 html 字符串中的 iframe 代码。有趣的是,当我提醒 iframe 的 src 时,它会返回正确的内容。所以有些东西确实有效。
  • 一开始的警报会起作用。可能这一切都会奏效。问题是您正在做的所有工作都在$(html) 上。您正在链接所有内容以对此采取行动,但在此之后它实际上无法访问,因为它没有分配给任何东西。您返回的 html 与您一直在处理的 $(html) 无关。尝试在处理之前将 $(html) 放入变量中,然后检查该变量的 .html() 。或者只是添加到链接,但更少的链接使调试更容易。 :)
  • 要么它不工作,要么我真的很愚蠢(更有可能)。我尝试分配 $(html) = html,我什至更改了相同的内容以保持它们分开。它仍然不会取代。
【解决方案2】:

David,我刚刚做了一个快速测试并编写了一个包含三个 iframe 元素的简单 HTML 页面,并复制了您的代码。我将 iframe 包裹在 &lt;div id="test"&gt; 元素中并调用 article_youtube_convert ("div#test");。 iframe 被完美替换。

<div id="test">
  <iframe width="560" height="315" src="http://www.youtube.com/embed/Z5y-UIjhjuM" frameborder="0" allowfullscreen></iframe>
  <iframe width="560" height="315" src="http://www.youtube.com/embed/Z5y-UIjhjuM" frameborder="0" allowfullscreen></iframe>
  <iframe width="560" height="315" src="http://www.youtube.com/embed/Z5y-UIjhjuM" frameborder="0" allowfullscreen></iframe>
</div>

您确定将正确的 html 上下文传递给 article_youtube_convert 函数吗?

【讨论】:

  • 我相信从参数的名称和问题来看,它不是传入的选择器,而是一个 HTML 字符串。我在回答中概述了为什么我认为这会导致它出错。与将 HTML 元素作为字符串传递相比,您所拥有的肯定是通过 ratehr 更好的方法。当然,我可能弄错了一点。 :)
  • @Chris,你是对的!传递给函数的是 HTML 代码,而不是选择器。我一定忽略了这一点。您的回答似乎是正确的,应该返回修改后的 HTML。实际上,David 的函数返回未修改的输入 HTML。
【解决方案3】:

我想你想要

  url_parts = youtube_id.split('?');
  youtube_id = url_parts.pop();

但请注意youtube_id 将包含v=,因此您可以这样做:url_parts.pop().substring(2)

【讨论】:

  • 我遇到的问题不在于 youtube 代码,而在于替换 jquery 中的 html。我已经生成了替换 html。
  • @David 好的,我的错。当您执行console.log(img_youtube) 时会发生什么,它是否按预期输出。如果是这样,请尝试$(img_youtube).appendTo(document.body) 看看是否有任何事情发生
  • 我不想把它贴在正文上,我只想用生成的替换代码交换'html' var中的iframe html。
  • @David 是的,我的建议是调试步骤。看看是否有效
猜你喜欢
  • 2015-06-02
  • 2016-02-25
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
相关资源
最近更新 更多