2015-05-08 59 views
8

我想加載一個HTML文件(使用fs.read),使用jsdom加載DOM,然後更改正文節點的文本(通過jquery)。然後我想將編輯的DOM窗口保存爲HTML文件。有沒有辦法做到這一點?我正在使用的代碼如下:Node.js - 如何編輯jsdom窗口中的元素並將窗口另存爲新的HTML文件?

fs.readFile(file, 'utf8', function(error, data) { 
    jsdom.env(data, [], function (errors, window) { 
     var $ = require('jquery')(window); 
     $(document.body.getElementsByTagName("*")).each(function() { 
      var content = $(this).text(); 
      var word = "\\b"+wordSuggestions.word+"\\b"; 
      var re = new RegExp(word, "g"); 
      content = content.replace(re, wordSuggestions.suggestion); 
      $(this).text(content); 
     }); 

     fs.writeFile(file, data, function (error){ // saving the new HTML file? What should I put instead of data? Window? 
     }); 
    }); 
}); 
+0

我覺得'$(document.body.getElementsByTagName(「*」))''有兩個錯誤的東西''。首先,它是jQuery和JavaScript選擇器的組合。它應該是jQuery中的$(「*」)',或者javascript中的document.body.getElementsByTagName(「*」)'。其次,它是服務器端代碼,所以jQuery在這裏不可用,除非我不知道jQuery的服務器端實現。 –

+0

我忘了在這篇文章中加入var $ = require('jquery')(窗口),所以我編輯它來包含它。 當使用document.body.getElementsByTagName(「*」)(不含jquery)時,我可以編輯每個節點的文本嗎?然後保存編輯的HTML? – Eva

+0

儘管如此,'$(document.body.getElementsByTagName(「*」))'沒有意義,並且可能無效,即使加載了jQuery。所以你告訴我你正在運行jQuery * server * -side?我搜索了四周,我可以看到沒有使用這個地方的地方,甚至可以說這是可能的。 jQuery是爲DOM操作製作的,並且服務器上沒有DOM。這裏有些我不明白的地方。 'fs'是一個SERVER模塊,'read'和'write'只能通過服務器而不是瀏覽器來實現。請確認這是一個* server * -side腳本(=不在瀏覽器中運行),並且您正在嘗試在其中使用jQuery。 –

回答

11

下面是如何執行此操作的示例。我已經基於你的代碼,但簡化了一下,以便我有代碼執行並說明如何去做。以下代碼讀取foo.html,並將modified!文本添加到所有p元素,然後將其寫入out.html。你缺少的主要東西是window.document.documentElement.outerHTML

var jsdom = require("jsdom"); 
var fs = require("fs"); 

fs.readFile('foo.html', 'utf8', function(error, data) { 
    jsdom.env(data, [], function (errors, window) { 
     var $ = require('jquery')(window); 
     $("p").each(function() { 
      var content = $(this).text(); 
      $(this).text(content + " modified!"); 
     }); 

     fs.writeFile('out.html', window.document.documentElement.outerHTML, 
        function (error){ 
      if (error) throw error; 
     }); 
    }); 
}); 
+0

是否還有一種方法可以選擇所有文本節點而不是所有p元素? – Eva

+0

沒有返回所有文本節點的jQuery函數(在DOM術語「文本節點」中)。可以遍歷DOM樹並逐個處理所有文本節點,但這不涉及jQuery。如果您想在此編輯您的問題以提示讀者解決「選擇所有文本節點」問題,我強烈建議您不要這樣做。你已經提出了一個問題,這個問題被認爲是關於從jsdom保存修改後的數據,我已經回答了。在獲得解決原始問題的答案之後,在問題中添加新問題並不受社區好評。 – Louis

+0

另一件事是,如果您要將jsdom問題與您應如何處理文本節點的問題結合起來,那麼您實際上可以結合可以獨立解決的問題。所以,不要從每個知道jsdom的人的輸入中獲益,以解決jsdom問題,以及每個知道DOM(也許jQuery)解決文本節點問題的人的輸入,您必須依賴那些誰知道jsdom *和* jQuery,這是一個較小的集合。你也可以使問題不太可能對其他人有用,並獲得積極樂觀。 – Louis

相關問題