Если вы построите весь HTML-текст с помощью простых шагов, некоторые трудности исчезнут. Итак, используя ваш пример, вы хотите закодировать следующий параметр запроса:
M&S
Когда вы встраиваете эту строку в качестве параметра запроса в URL, вам нужно ее кодировать, как вы уже знаете. Строка urlencoded M%26S
. Полный URL-адрес выглядит следующим образом:
http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147
Теперь этот URL встроен в код JavaScript, и в этом случае вам нужны только одинарные кавычки на обоих концах:
'http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147'
Весь код JavaScript выглядит следующим образом:
AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')
Теперь весь этот текст используется в контексте HTML, который интерпретируется как URL, поэтому вам нужно снова его кодировать:
AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')
И, наконец, поскольку вы встраиваете этот текст в HTML, вам необходимо htmlescape:
AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')
Вот почему вы заканчиваете:
<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')" title='Refresh'>Refresh</a>
Обычно я избегаю этих проблем с кодированием, не помещая строку M&S
непосредственно в событие onclick или в привязку. В общем случае вы не можете кодировать событие onclick и привязку одним и тем же способом, поскольку процесс декодирования для обоих отличается:
onclick: html -> js -> url
anchor: html -> url -> js -> url
Но подождите ... если вы напишите вспомогательную функцию, как это, она работает:
function myQuery(q) {
var encodedQ = encodeURIComponent(q); // TODO: which character encoding is used here?
var url = 'http://10.0.0.195/program.exe?Qry147=' + encodedQ + '&sortmethod1=147';
var response = AJAX_Get(url);
// TODO: handle errors
}
Теперь вы можете написать:
<a href="javascript:myQuery('M&S')">anchor</a>
<a onclick="myQuery('M&S')">event</a>
Этот трюк работает, потому что в якоре больше нет %
.