jQuery - 替换'find'元素的HTML

时间:2013-08-03 07:03:37

标签: jquery html5

我认为这并不罕见,所以我在这里搜索过,但找不到我需要的适当方法。

基本上,我想替换特定元素下的字符串 - pre

  1. sourceHTMLstrings
  2. 用div包装
  3. 将(换行)转换为jQueryObject
  4. 找到pre
  5. 获取每个pre
  6. 的HTML字符串
  7. 在HTMLstrings中将A替换为B
  8. 使用新的HTMLstrings重构每个pre
  9. 重构的jQueryObject或sourceHTMLstrings
  10. 所以,这是我的尝试:

    String.prototype.replaceAll = function (org, dest)
        {
            return this.split(org).join(dest);
        };
    var wrap = function (data)
        {
            return '<div>' + data + '</div>';
        };
    
    // Data is a string which contains `pre` elements
    var $data2 = $(wrap(Data))
                    .find('pre') //behavior is confirmed to find several `pre`; so far so good
                    .html(this.html().replaceAll(A, B));
                    //Uncaught TypeError: Object #<Object> has no method 'html' 
    

    .....
    
    var $data2 = $(wrap(Data))
                    .find('pre') //behavior is confirmed to find several `pre`; so far so good
                    .html(this.replaceAll(A, B));
                    //Uncaught TypeError: Object #<Object> has no method 'replaceAll'
    

    基本上,我无法跟踪每个对象在方法之间传递的方式。

    我也尝试使用each方法但没有成功。你有什么好主意吗?

    编辑:

    答案是

    var $data2 = $("<div/>");
    
    $data2.html(Data).find("pre").html(function(_,h){
            return h.replaceAll(A, B);
    });
    

    然后是$ data2 .....

    $data2 = $("<div/>").html(Data).find("pre").html(function(_,h){
                return h.replaceAll(A, B);
    

    只收集pre个结果。不是整个文件范围。

    我认为这是通过破坏性价值来表现问题的一个好或坏的例子。

    即使是jQuery也是功能范例,这太糟糕了。

2 个答案:

答案 0 :(得分:0)

如果您更改html功能

,则会有效
.html(this.replaceAll(A, B));

到此:

.html(function(_,h){
    return h.replaceAll(A, B);
});

作为旁注,你可以更简单:

var $data2 = $("<div/>").html(Data).find("pre").html(function(_,h){
        return h.replaceAll(A, B);
});

修改

如果您想在Data变量中获取entrie HTML,请在更改HTML后尝试使用end()。这将重置遍历并将其恢复为<div/>级别。

var $data2 = $("<div/>").html(Data).find("pre").html(function (_, h) {
    return h.replaceAll(A, B);
}).end();

上面的代码将返回我们创建的div。它的内在内容将是pre和其他内容。要获得这些内容,请在children()之后添加end()。这将把Data中的所有内容转换为DOM对象。

var $data2 = $("<div/>").html(Data).find("pre").html(function (_, h) {
    return h.replaceAll(A, B);
}).end().children();

演示:http://jsfiddle.net/hungerpain/jRjQC/

答案 1 :(得分:0)

var $data2 = $(wrap(Data)).find('pre').html().replaceAll(A, B);