2010-12-23 60 views
1

我使用$.ajax将Joomla安装中的页面内容加载到页面中。这很好,但是我在页面上有一些电子邮件地址,Joomla的电子邮件隐藏插件会自动打乱它们并用JavaScript代替它们来阻止垃圾邮件。当我加载网页使用jQuery的<script>标签不会被加载/执行和我留下:jQuery AJAX请求条Joomla电子邮件保护脚本

该E-mail地址受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

Joomla正在这样做。以下是如何从筛选出的脚本代码来停止它:http://docs.joomla.org/Why_does_some_HTML_get_removed_from_articles_in_version_1.5.8%3F

此外,为什么不是文本“该E-mail地址受spam bots保护,需要使用Javascript功能来查阅。”内部的<无脚本> </noscript >(至少)或为什么你不使用JavaScript依赖函数来隐藏文本?因为,你上面发布的内容将始终显示。对于这个问题,能够在没有启用JavaScript的情况下查看您的AJAX请求内容的人已经够聪明了,以至于他们不需要解释:-)

最后,为什么您使用document.write而不是更清晰和多功能的: document.getElementById(yourId).innerHTML =“[email protected]”;并将插入电子邮件的跨度或分区。如果你把它放在一个带有id的span或div里面,这也允许你通过CSS来控制外观,并且看起来比普通的旧document.write更简单。

同样,为什么不只是返回用JSON对象发送电子邮件并让你的AJAX函数读取JSON并将其插入到页面上的div或跨度中?比返回原始HTML更清洁和优雅。

编辑: 对不起,我看到你正在发送JavaScript的JQuery大概eval,然后你使用document.getElementById。不要这样做。这是你的请求应该返回什么(很抱歉,但我不知道究竟你的变量名的意思,所以我只是做东西了):

{ 
"path": "/home", 
"prefix": "https://stackoverflow.com/users/", 
"email":"[email protected]", 
"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); 
     } 
     }); 
} 
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方法