escape () не работает последовательно? - PullRequest
2 голосов
/ 07 октября 2011

используя javascript, я генерирую HTML-код, например, добавляя функцию, которая начинается с нажатия на ссылку, например:

$('#myDiv').append('<a href="javascript:start(\''+TERM+'\');">click</a>');

Так что start() следует вызывать, если кто-то нажимает на ссылку (щелчок).TERM может содержать одно слово, например world или moody's, сгенерированный HTML-код будет выглядеть следующим образом:

<a href="javascript:start('world');">click</a>

ИЛИ

<a href="javascript:start('moody's');">click</a>

Как видите,2-й пример не будет работать.Поэтому я решил «убежать» от TERM, вот так:

$('#myDiv').append('<a href="javascript:start(\''+escape(TERM)+'\');">click</a>');

Глядя на исходный код HTML с помощью firebug, можно увидеть, что был сгенерирован следующий код:

<a href="javascript:start('moody%27s');">click</a>

Это прекрасно работает, пока я действительно не нажму на ссылку - поэтому браузер (здесь Firefox) пытается интерпретировать %27 и пытается запустить start('moody's');

Есть ли способ избежать термина постоянныйбез интерпретации %27, пока термин не будет обработан в JS?Есть ли другое решение вместо использования регулярных выражений для изменения ' на \'?

Ответы [ 3 ]

3 голосов
/ 07 октября 2011

Не пытайтесь генерировать встроенный JavaScript. Этот путь лежит слишком много боли и ада обслуживания. (Если бы вы пошли по этому маршруту, вы бы экранировали символы в строках JavaScript с \).

Вместо этого используйте стандартные процедуры привязки событий.

Предполагая, что $ - это jQuery, а не одна из многих других библиотек, использующих это бесполезное имя переменной:

$('#myDiv').append(
    $('<a>').append("click").attr('href', 'A sensible fallback').click(function (e) {
        alert(TERM); // Because I don't have the function you were calling
        e.preventDefault();
   })
);

См. Также http://jsfiddle.net/TudEw/

0 голосов
/ 07 октября 2011

escape () используется для кодирования URL, а не для возможности вставлять строковый литерал.Ваш код имеет серьезные недостатки по нескольким причинам.

Если вы хотите событие onclick, используйте событие onclick.Не пытайтесь «внедрить» код JavaScript в вашу разметку.Если у вас есть «строка» в переменной, вам никогда не нужно ничего подставлять в нее, если вы не генерируете URL-адреса или другие ограниченные термины.

var element = $('<span>click</span>');
element.bind('click', function () { start(TERM); });
$('#myDiv').append(element);

Если вы не знаете, что это делает, тогдавернитесь к основам и узнайте, что означают события и ссылки на функции в javascript.

0 голосов
/ 07 октября 2011

Эта функция escape() предназначена для экранирования URL-адресов для передачи по сети, а не для строк. Я не знаю, что есть встроенная функция для экранирования строк для JavaScript, но вы можете попробовать эту, которую я нашел в Интернете: http://www.willstrohl.com/Blog/EntryId/67/HOW-TO-Escape-Single-Quotes-for-JavaScript-Strings.

Использование: EscapeSingleQuotes(strString)

Редактировать: Только что заметил вашу заметку о регулярных выражениях. Это решение использует регулярные выражения, но я думаю, что в этом нет ничего плохого: -)

...