jQuery AJAX请求剥离Joomla电子邮件保护脚本

时间:2010-12-23 05:05:24

标签: jquery ajax joomla

我正在使用$.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;
            });
        }
});

关于如何解决这个问题的任何想法?

2 个答案:

答案 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方法