JQuery AJAX Запрос Полосы Сценарий Защиты Почты Joomla - PullRequest
1 голос
/ 23 декабря 2010

Я использую $.ajax, чтобы загрузить на страницу содержимое страниц моей установки Joomla.Это работает хорошо, но у меня есть несколько адресов электронной почты на странице, и плагин Joomla для маскировки электронной почты автоматически их зашифровывает и заменяет JavaScript-кодом для предотвращения спам-ботов.Когда я загружаю страницу с помощью jQuery, теги <script> не загружаются / не выполняются , и мне остается:

Этот адрес электронной почты защищен от спам-ботов,У вас должен быть включен 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 голосов
/ 23 декабря 2010

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

0 голосов
/ 23 декабря 2010

Joomla делает это.Вот как остановить фильтрацию тегов скрипта: http://docs.joomla.org/Why_does_some_HTML_get_removed_from_articles_in_version_1.5.8%3F

Кроме того, почему нет текста «Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра» внутри

(по крайней мере) или почему вы не используете какую-либо JavaScript-зависимую функцию, чтобы скрыть текст?Потому что то, что вы разместили выше, всегда будет отображаться.В этом отношении тот, кто может просматривать содержимое вашего запроса AJAX без включенного JavaScript, уже достаточно умен, чтобы не нуждаться в объяснениях: -)

Наконец, почему вы используете document.write вместоболее понятный и универсальный: document.getElementById (yourId) .innerHTML = "your@email.com";И положить вставку электронной почты в span или div.Если вы поместите его в span или div с идентификатором, это также позволит вам контролировать внешний вид с помощью CSS и будет казаться менее примитивным, чем простой старый document.write

Опять же, почему бы не простовернуть электронную почту в объекте JSON и сделать так, чтобы ваша функция AJAX прочитала JSON и вставила его в div или span на странице?Намного чище и элегантнее, чем возвращать необработанный HTML.

РЕДАКТИРОВАТЬ: Извините, я вижу, что вы отправляете JavaScript для JQuery предположительно 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);
        }
        });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...