我有一个网页,通过对云数据库解决方案的API调用获取其大部分内容。 HTML页面相当简单,但通过许多JS / JQuery命令等注入更多数据。
结果页面代表"引用"我想将其保存回云数据库以供参考。
我可以使用以下命令获取页面的当前状态并将其存储在变量中:
var AVMI_thisPage = document.getElementsByTagName('html')[0].outerHTML;
我现在需要从变量中删除任何<script>
标记,这样任何重新导入回到云数据库的HTML都不会包含任何可能在有人打开时再次弄乱页面的JS它供参考。
我应该能够将字符串推回到数据库,但我需要摆脱任何<script>
。
我尝试过JQuery,但这似乎会杀死HTML,HEAD和BODY标签。
说实话,我并不期待下面的代码能够正常工作......但是试过了。
E.g。
var AVMI_thisPage = document.getElementsByTagName('html')[0].outerHTML;
var AVMI_tree = $("<div>" + AVMI_thisPage + "</div>");
AVMI_tree.find('script').remove();
AVMI_thisPage = AVMI_tree.html();
有什么想法吗?
更新 - 最终代码(包括BASE64编码和上传)
function b64EncodeUnicode(str) {
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
return String.fromCharCode('0x' + p1);
}));
}
var htmlPage = $("html");
$("script", htmlPage).remove();
AVMI_thisPage = htmlPage.html();
AVMI_thisPageB64 = b64EncodeUnicode(AVMI_thisPage);
var req = "";
req += "<qdbapi>";
req += "<rid>" + AVMI_quoteRID + "</rid>";
req += "<field fid='171' filename='Hardcopy of Quote.html'>"+ AVMI_thisPageB64 + "</field>";
req += "</qdbapi>";
$.ajax({
type: "POST",
contentType: "text/xml",
dataType: "xml",
processData: false,
url: "https://xxxx.xxxxxxxx.com/db/" + AVMI_Q_DBID + "?act=API_UploadFile",
data: req
})
.then(function() {
alert("A copy of this quote has been saved into the 'Hardcopy Attachment' field.");
window.close();
});
答案 0 :(得分:2)
你可以这样做:
$("script", AVMI_tree).remove();
但请注意,您正在获取documentElement
的OuterHTML,其中包含Head
和BODY
,并将它们放入DIV
,这是非法的。
你可以这样做:
var htmlPage = $("html");
$("script", htmlPage).remove();
AVMI_thisPage = htmlPage.html();
请注意,实际上从HTML页面而不是从复制的DOM中删除SCRIPTS并不重要,因为一旦JVM处理并加载了加载的脚本,那么无论你是否重要将其从DOM中删除:脚本将被加载并激活。
答案 1 :(得分:0)
我不会质疑你做“状态”的原因。像这样保存,但是这里有你如何实现你想要的东西:
var regex = new RegExp('<script(.|\n)*</script>', 'g');
var noScript = AVMI_thisPage.replace(regex, '');
您可以在此页面的控制台中运行它并打印noScript
以便自己查看。
正则表达式选择在整个字符串化页面中包含任何字符或换行符的所有脚本标记,然后我们将它们替换为空,只进行字符串操作。我怀疑这必须比做DOM操作更快,更不用说用jQuery做了。