2015-05-08 4 views
8

Я хочу загрузить файл HTML (используя fs.read), загрузить DOM с помощью jsdom, а затем изменить текст узлов тела (через 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, * или * 'document.body.getElementsByTagName (" * ")' в javascript. Во-вторых, это серверный код, поэтому jQuery недоступен здесь, если только я не знаю о реализации jQuery на стороне сервера. –

+0

Я забыл включить var $ = require ('jquery') (окно) в этом сообщении, поэтому я отредактировал его, чтобы включить его. При использовании document.body.getElementsByTagName ("*") (без jquery) могу ли я просто отредактировать текст каждого узла? А затем сохранить отредактированный html? – Eva

+0

Тем не менее, '$ (document.body.getElementsByTagName (" * "))' не имеет смысла и, вероятно, недействителен даже при загрузке jQuery. Итак, вы говорите мне, что используете jQuery * server * -side? Я искал вокруг, и я не вижу места, где это используется, или даже говорю, что это возможно вообще. jQuery выполняется для DOM-манипуляцийm, и на сервере нет DOM. Здесь я не понимаю. 'fs' является модулем SERVER, и' read' и 'write' могут быть получены только с сервера, а не с браузера. Пожалуйста, подтвердите, что это * сервер * -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, который является меньшим множеством. Вы также ставите вопрос менее вероятным, чтобы быть полезным для других и получать upvotes. – Louis