у меня есть кнопка
onclick = "click(' . $item . ');"
тогда функция javascript должна передать $item на другую страницу. Это работает нормально, если $item — это число, но не если это строка, а иногда это смесь символов и цифр, которую я не могу контролировать.
function click(c)
{
var u = "items.php?serial = " + c;
document.location.href = u;
}
Есть ли способ сделать это в JS?
@SanuKhan это работает, если я использую +encodeURIComponent(c), спасибо. Дайте ответ, и я приму его
Почему кнопка с прикрепленным JavaScript? Просто создайте гиперссылку, и она перейдет по указанному вами URL-адресу без необходимости использования какого-либо сценария. (И если вы хотите придать ссылке вид кнопки, вы можете легко сделать это с помощью CSS). Всегда будьте проще!
@ADyson, потому что JavaScript делает другие важные вещи, прежде чем дойти до этого момента.
@Kilisi попробуйте использовать обратные кавычки (``)
@NalanPandiKumar Я не тот, кто задает вопрос
@ADyson извини за недоразумение.
Важно понимать, что побег — это не то, что вы можете сделать «раз и навсегда», а то, что вы делаете каждый раз, когда передаете что-то из одного контекста в другой. В этом случае вы переходите от PHP к JS, а затем от JS к URL-адресу, поэтому я связал два существующих ответа, охватывающих эти два шага. Вам необходимо применить оба типа экранирования в нужных местах вашего кода.
Попробуйте это:
onclick = "click(\'' . $item . '\');"
Экранированные кавычки — это то, что вам нужно.
он не дает мне действительный URL-адрес, он дает "items.php?serial = "%20+%20c"
@Kilisi, можете ли вы добавить php-код, который создает кнопку в вашем сообщении, пожалуйста?
Все в порядке, теперь это исправлено в функции js из комментария выше. Проголосовал за ваши усилия, поскольку вижу, что вы находитесь на другом пути, который тоже подойдет. Итак, я использовал ваш ответ и идею из комментария, и теперь это работает.
Проблема в том, что $item
может содержать контент, нарушающий вашу функциональность. У вас есть
onclick = "click(' . $item . ');"
но что, если $item
это О'Брайан? В этом случае это переводится на
onclick = "click('O'Brian');"
Итак, что на самом деле происходит: вы должны передать строку click
, которая равна O, но это не сработает. Видеть:
function click(c)
{
var u = "items.php?serial = " + c;
document.location.href = u;
}
<input type = "button" onclick = "click('O'Brian')" value = "something">
Вы получите жалобу на то, что скобка не закрывается, потому что после закрытия строки O она ожидает закрытия скобки функции, но вместо этого получает Брайана.
Поскольку предложенный encodeURIComponent
является функцией Javascript (см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent), которую вы должны использовать c
в соответствии с предложением , это не решит вашу проблему само по себе. Прежде чем создавать структуру, вам понадобится что-то эквивалентное, которое будет выполнено PHP.
Это отличный ресурс для этого: Что является эквивалентом компонента encodeURI в PHP в JavaScript?
Это функция PHP, которая делает это для PHP:
function encodeURIComponent($str) {
$revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');
return strtr(rawurlencode($str), $revert);
}
и тогда вы можете сделать это:
onclick = "click(' . encodeURIComponent($item) . ');"
и тогда вам не нужно вызывать encodeURIComponent
внутри вашей click
функции, поскольку она уже обработана PHP
Очень подробно, спасибо
Ваше объяснение блестяще, вплоть до той части, где вы начинаете говорить о кодировании URL, а это совершенно другой контекст. Поможет ли функция, которую вы даете, в примере О'Брайена? Как подсказывает остальная часть вашего ответа, ключевой момент не в URL-адресах, а в том, чтобы вы создали действительный исходный код JavaScript; Для этого можно использовать json_encode
, потому что действительный JSON также является действительным исходным кодом JS.
Эта строка позже используется в URL-адресе, но она находится в коде JS, поэтому можно использовать функцию JS encodeUriComponent. Всегда сопротивляйтесь искушению «предварительно избежать» контента для нескольких контекстов одновременно, вы просто запутаетесь.
не могли бы вы попробовать использовать var u = "items.php?serial = "+encodeURIComponent(u), это закодирует данные в u, подходящие для URL-адреса