我正在使用$.ajax
将Joomla安装中的页面内容加载到页面中。这很好用,但我在页面上有一些电子邮件地址,Joomla的电子邮件隐藏插件会自动对它们进行搜索并用JavaScript取代它们以阻止垃圾邮件程序。当我使用jQuery加载页面时,<script>
标记未加载/执行,我留下了:
此电子邮件地址受spam bots保护。您需要启用JavaScript才能查看。
应执行的代码是:
<script language='JavaScript' type='text/javascript'>
// Some email display code
document.write( '<a ' + path + '\'' + prefix + addy10641 + suffix + '\'' + attribs + '>' );
document.write( addy10641 );
document.write( '<\/a>' );
</script>This e-mail address is being protected from spambots. You need JavaScript enabled to view it
<script language='JavaScript' type='text/javascript'>
// Some email display code
</script>.
我的代码如下:
$.ajax({
url: fetchUrl,
type: "GET",
dataType: "html",
timeout: 4000,
error: function() {
location.href = fetchUrl;
},
success: function(response) {
$("#content *").fadeOut(function() {
$("#content *").remove();
parsedResponse = $(response).filter("#content")[0].innerHTML;
alert(parsedResponse); // This DOES NOT show the <script> tags
$("#content")[0].innerHTML = parsedResponse;
});
}
});
关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
Joomla正在这样做。以下是如何阻止它过滤掉脚本标记:http://docs.joomla.org/Why_does_some_HTML_get_removed_from_articles_in_version_1.5.8%3F
此外,为什么不是文本“这个电子邮件地址受到垃圾邮件程序保护。您需要启用JavaScript才能查看它”&lt; noscript&gt;&lt; / noscript&gt; (至少)或者你为什么不使用一些JavaScript依赖函数来隐藏文本?因为,您上面发布的内容将始终显示。就此而言,在没有启用JavaScript的情况下可以查看AJAX请求内容的人已经非常聪明,他们不需要解释: - )
最后,为什么使用document.write而不是更清晰和多样化: document.getElementById(yourId).innerHTML =“your@email.com”;并将插入电子邮件放入span或div中。如果你把它放在带有id的span或div中,这也允许你通过CSS控制外观,看起来不像普通的旧document.write
同样,为此,为什么不直接在JSON对象中返回电子邮件并让您的AJAX函数读取JSON并将其插入到页面上的div或span中?比返回原始HTML更清晰,更优雅。
编辑: 抱歉,我发现您正在为JQuery发送JavaScript,大概是eval,然后您正在使用document.getElementById。不要那样做。这是你的请求应该返回的内容(抱歉,但我不确切地知道你的变量名称是什么意思,所以我只是在制作内容):
{
"path": "/home",
"prefix": "/users/",
"email":"someemail@gmail.com",
"suffix": "/stuff/",
"attribs": "yourattribs-could-be-a-nested-array-of-values"
}
你的JQuery代码应该是这样的:
success: function(res) {
if (res) {
$("#content").fadeOut(function() {
$("#content").remove();
var link = '<a href="' + res.path + res.prefix + res.email + res.suffix + res.attribs + '">' + res.email + '</a>';
$("#content")[0].html(link);
}
});
}
答案 1 :(得分:0)
document.write不起作用;它旨在在页面加载时插入HTML。此外,使用innerHTML插入的脚本不会执行。我认为解决这个问题的最佳方法(关闭电子邮件隐藏或进行其他服务器端更改)是将代码注入iframe然后使用innerHTML:
function removeDocumentWrite(input) {
var ifr = $('<iframe style="display:none"/>').appendTo('body'),
doc = ifr[0].contentDocument;
doc.write('<html><body>' + input + '</body></html>');
doc.close();
ifr.contents().find('script').remove();
var html = doc.body.innerHTML;
ifr.remove();
return html;
}
$("#content").html(removeDocumentWrite(parsedResponse));
或者使用这样的函数(未经测试的示例)手动搜索脚本标记并在解析的响应中执行它们:
function removeDocumentWrite(input) {
input.replace(/<script.*?>([\s\S]*?)<\/script>/gi, function(str, p1) {
var html = '';
document.write = function(t) {
html += t;
};
return new Function(p1.replace(/<!--|-->/g, ''))();
});
}
$("#content").html(removeDocumentWrite(parsedResponse));
修改:添加了iframe方法