jquery
  • parsing
  • element
  • 2012-02-20 53 views 1 likes 
    1

    我有一個html字符串我想直接轉儲到一個元素。這個html字符串包含一些標籤,並且我需要在其src屬性的前面添加一個路徑。如何在追加元素之前解析元素的內容? (jQuery)

    目前,我正在做這樣的事情:

    // note, htmlString is coming in from an external xml file... 
    var htmlString = "<img src='img1.jpg'/><br/><img src='img2.jpg'/>"; 
    var imgContainer = $('<div />'); 
    imgContainer.append(htmlString); 
    
    var prefix = "some/path/to/img/"; 
    imgContainer.find('img').each(function(i, el) { 
        $(el).attr('src', prefix + $(el).attr('src')); 
    }); 
    

    這工作,但我看到了不預先考慮路徑的失敗的資源負載。好像瀏覽器試圖在創建imgContainer元素時立即加載圖像,即使它沒有附加到文檔中。我想避免那些失敗的負載。

    我想我可以追加前解析htmlString但它是通過它的創建後,該元素不錯,只是$。每()...

    注:我已經通過問這個問題,創建一個有學問jQuery元素通過$(htmlString)立即導致在htmlString內的所有資源上加載嘗試。所以,我必須以某種方式操作htmlString,然後才能將其包裝到jQuery對象中。

    +0

    嘗試在'each()'中使用原始的jQuery對象。刪除'我,el'並用$(this)'替換'$(el)'。不知道這是否會做一些事情,但嘿,很容易嘗試。 – elclanrs 2012-02-20 19:22:24

    +0

    @elclanrs沒有骰子......可以說是更清潔的代碼壽。 – ericsoco 2012-02-20 19:26:12

    回答

    3

    您可以嘗試將htmlString解析爲XML,對其進行修改,然後將其附加到DOM。

    像這樣的東西(不知道是否XMLSerializer作品在所有瀏覽器,我認爲這是在IE this.xml):

    var htmlString = "<img src='img1.jpg'/><br/><img src='img2.jpg'/>", 
    imgContainer = $('<div />') 
    xml = $.parseXML('<xml>'+htmlString+'</xml>'), // add `<xml>` because 
                   // XML needs a root element 
    prefix = "some/path/to/img/", 
    // needed to convert XML to HTML 
    sXML = typeof XMLSerializer !== 'undefined' && new XMLSerializer; 
    
    $(xml).find('img').each(function(i, el) { // replace the SRC 
        $(el).attr('src', prefix + $(el).attr('src')); 
    }); 
    
    // Convert XML to HTML 
    // http://stackoverflow.com/a/829724 
    htmlString = $(xml).find('xml').contents().map(function(i,v){ 
        return v.xml || sXML.serializeToString(v); 
    }).get().join(''); 
    
    imgContainer.append(htmlString); 
    

    DEMO:http://jsfiddle.net/de2dg/3/

    +0

    啊謝謝你取代這個答案!我看到它,計劃嘗試它,刷新,它已經走了....現在嘗試。 ps,有沒有辦法在SO/StackExchange中引導消息用戶?想要ping你,但看不到方法... – ericsoco 2012-02-20 19:57:58

    +0

    @ericsoco:不幸的是,你不能直接向用戶發送消息。唯一的辦法是評論他們的一個職位。我刪除了這個,因爲我不確定它是否適用於所有瀏覽器(或者甚至是否正確)。它*應該*現在在大多數瀏覽器中工作。 – 2012-02-20 20:00:56

    +1

    選擇了這個答案,因爲它保留了原始html完整,而@elclanrs的答案(同時也是有用的)只提取標籤。 – ericsoco 2012-02-20 20:25:39

    1

    你爲什麼不與正則表達式中提取圖像字符串並使用數組來保存圖像並最後添加所有內容?

    var str = '<img src=\'img1.jpg\'/><br/><img src=\'img2.jpg\'/>', 
        patt = /\w+\d+\.(jpg|png|gif)+/g, // Probably could be better but works 
        imgs = str.match(patt), 
        prefix = 'some/path/to/img/', 
        output = ''; 
    $.each(imgs, function(i, v){ output += '<img src="'+ prefix + v +'"/>'; }); 
    $('<div />').append(output).appendTo('#el'); 
    

    http://jsfiddle.net/DmKys/

    +0

    因爲htmlString有一堆的 S之間穿插其他的東西,並通過外部XML文件進來...... – ericsoco 2012-02-20 19:43:00

    +0

    然後你可以使用正則表達式來從一個字符串中提取圖片的路徑,然後遍歷數組等等。 .. – elclanrs 2012-02-20 20:02:54

    +0

    哦,聽起來很可愛,但我用正則表達式不好。有小費嗎? – ericsoco 2012-02-20 20:05:02

    0

    一類直接在HTML的輸入如「隱藏」添加到圖像和與顯示的CSS定義它:無;它不會被首先繪製。

    然後在您的每個循環中更改源後刪除此類。

    編輯:(最後我知道他的意思) 將屬性從src更改爲pre_src,並在每個循環中使用此屬性來附加新的「src」屬性,並在此之後刪除pre_src。 [removeAttr()] 因此,資源將不會被加載,你可以使用你的每個循環...

    +1

    each()必須在jQuery對象上調用;只要一個jQuery對象被創建任何 S內它試圖加載。所以,這也不起作用。但是,我現在看到,這就是我的答案中不可避免的一部分 - 我需要餡它變成$之前解析htmlString()。 – ericsoco 2012-02-20 19:47:14

    +0

    pleae表達自己更好的下一次:) – Thomas 2012-02-20 19:58:39

    +0

    我很想表達自己,以及可能的。有小費嗎?你對我的問題感到困惑嗎?順便說一句,你的編輯有與你原來的建議相同的問題。 – ericsoco 2012-02-20 20:02:36

    相關問題