Делаем URL W3C действительным И работаем в Ajax Request - PullRequest
2 голосов
/ 17 ноября 2009

У меня есть общая функция, которая возвращает URL. (Это функция плагина, которая возвращает URL к ресурсам [изображениям, таблицам стилей] внутри плагина).

Я использую параметры GET в этих URL.

Если я хочу использовать эти URL-адреса на HTML-странице, чтобы пройти проверку W3C, мне нужно маскировать амперсанды как & amp;

/plugin.php?plugin=xyz&resource=stylesheet&....

но, если я хочу использовать URL-адрес в качестве параметра "url" для вызова AJAX, амперсанд интерпретируется неправильно, что испортило мои вызовы.

Могу ли я сделать что-нибудь получить & amp; работа в AJAX звонках?

Я бы очень хотел избежать добавления параметров в функцию генерирования URL-адреса (предназначенное для использования = "ajax" или чего-либо другого) или манипулирования URL-адресом в Javascript, поскольку эта модель плагина будет многократно использоваться (и, возможно, многими ) и я хочу, чтобы это было как можно проще.

Ответы [ 4 ]

3 голосов
/ 17 ноября 2009

Мне кажется, что вы сталкиваетесь с проблемой того, что одна часть вашего приложения пересекает несколько слоев. В данном случае это плагин.

URL, указанный в RFC 1738 , гласит, что URL должен использовать маркер & для отделения пар ключ / значение друг от друга. Однако амперсанд является зарезервированным токеном в HTML и поэтому должен быть экранирован в &. Поскольку выход из амперсандов является артефактом HTML, ваш плагин, вероятно, не должен избегать их напрямую. Вместо этого у вас должна быть функция или что-то, что ускользает от канонического URL, чтобы его можно было встроить в разметку HTML.

1 голос
/ 17 ноября 2009

Единственное место, где это может произойти, это если вы:

  • Использование XHTML
  • Служит в виде текста / html
  • Использование inline <script>

Это не удачная комбинация, и решение в спецификации .

Используйте внешние скрипты, если ваш скрипт использует <или & или]]> или -.

Примечание о типах носителей XHTML включает тот же совет, но также предоставляет обходной путь , если вы решите его игнорировать.

0 голосов
/ 17 ноября 2009

Попробуйте вернуть JSON вместо строки, чтобы ваш Javascript мог считывать значение URL как объект, и у вас не должно быть этой проблемы. Кроме этого, попробуйте просто расшифровать строку HTML, используя что-то вроде:

function escapeHTML (str)
{
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);
   return div.innerHTML;
}; 

Очевидно, вы захотите убедиться, что удалили любую ссылку на элементы DOM, которые вы могли бы создать (чего я не сделал здесь, чтобы упростить пример).

Я использую эту технику на сайтах AJAX, которые создаю на своей работе, и много раз использовал ее для решения этой проблемы.

0 голосов
/ 17 ноября 2009

Когда у вас есть разметка формы:

<a href="?a=1&amp;b=2">

Тогда значение атрибута href равно ?a=1&b=2. &amp; является только escape-последовательностью в HTML / XML и не влияет на значение атрибута. Это похоже на:

<a href="&lt;&gt;">

Где значение атрибута <>.

Если вместо этого у вас есть код вида:

<script>
var s = "?a=1&b=2";
</script>

Тогда вы можете использовать функцию JavaScript:

<script>
var amp = String.fromCharCode(38);
var s = "?a=1"+amp+"b=2";
</script>

Это позволяет коду, который в противном случае мог бы быть только действительным HTML или только допустимым XHTML, быть действительным в обоих. (Для получения дополнительной информации см. Комментарии Дорвальда.)

...