У кого-нибудь есть способ подумать об этом?
Я собираюсь немного летучих мышей, работающих над этим:
$toReturn .= " function addProd(pExists) { document.getElementById('products').innerHTML = \"<tr><td id='prod_n'><input type='text' size='10' maxlength='10' name='proj_n' id='prod_n' onchange=".chr(92).chr(34)."saveData(setSaveParams('ajaxSaveDataController.php', 'PROD', 'n'), this.value)".chr(92).chr(34)." value='"; $toReturn .="'></td> <td id='prod_spec'> <textarea cols='60' name='prod_spec' id='prod_spec' rows='20' onchange=".chr(92).chr(34)."saveData(setSaveParams('ajaxSaveDataController.php', 'PROD', 'prod_spec'), this.value)".chr(92).chr(34)." value='"; $toReturn .="'></td></tr>\" + document.getElementById('prodsTab').innerHTML; if (pExists == 0) { document.getElementById('prodsTab').innerHTML = \"<tr><th id='proj_spec_h'>Name</td><th id='proj_spec_h'>Spec</td></tr>\" + document.getElementById('prodsTab').innerHTML;";
Я переписал это, поэтому не беспокойтесь о том, что опечатка не подходит.
Что здесь происходит, я использую PHP для написания Javascript, который вызывает функцию Ajax, а то, что меня отталкивает, это "
s» и '
s»
Поэтому я пишу строку возврата, на PHP, так что все, что в "
Затем я хочу написать некоторый innerHTML, чтобы я мог поместить внутри \"
Затем аргументы HTML могут быть в '
Все в порядке.
Таким образом, мой onchange-вызов должен заканчиваться так: onchange="function('a', 'b')"
, ну, откуда мои "
будут», если я использую "
что закончит строку PHP. Если я использую \"
что закончит строку innerHTML. Поэтому я закончил тем, что PHP интерпретировал этот chr(92).chr(34)
Так что это очень грязно, и это начинает ранить мою голову.
И теперь он терпит неудачу в этой пустой строке после второго $toReturn
, который я хотел там для удобочитаемости.
Я должен делать что-то не так с точки зрения стиля или чего-то.
Как вы обрабатываете вложенные?
Используйте двойные экранированные двойные кавычки:
\\\"
Таким образом, когда это будет напечатано, оно станет простой экранированной двойной кавычкой ( \"
), и она не будет в innerHTML.
Рассмотрим использование синтаксиса HEREDOC. http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
<?php $my_string = <<<EOD <script type="text/javascript"> var x = "this string has a ' known as a single quote!"; </script> EOD; ?>
Преимущество этого синтаксиса заключается в том, чтобы свободно писать html или javascript без экранирования кавычек.
Обновить
Вот немного больше информации о HEREDOC.
Прежде всего, наиболее распространенная ошибка, связанная с синтаксисом heredoc, вызвана пробелом. Синтаксис HEREDOC требует идентификатора открытия и закрытия. В приведенном выше примере я использовал EOD
как идентификатор. Важно, чтобы идентификатор открытия не имел пробелов после него, а идентификатор закрытия находился в новой строке, перед пробелом не было пробелов и пробелов между идентификатором и точкой с запятой.
Вам не нужно использовать EOD
качестве вашего идентификатора. Вы можете использовать что-то более описательное. Мне нравится использовать идентификатор, который описывает блок кода.
<?php $html = <<<HTML <html> <head> <title>Example html</title> </head> <body> <p class="paragraph">This is my html!</p> </body> </html> HTML; $javascript = <<<JAVASCRIPT <script type="text/javascript"> var helloText = "Hello, my name is Jrod"; alert(helloText); </script> JAVASCRIPT; ?>
Чтобы использовать переменные в синтаксисе heredoc, вам нужно будет использовать фигурные скобки вокруг вашей переменной в коде.
$widget = <<<WIDGET <p>Good Morning {$name}</p> WIDGET;
Считаете ли вы, что процитировали цитаты, такие как \\\"
?
После одного шага это обычно становится \"
и после второго шага "
.
Во всяком случае, генерация (javascript) кода внутри (html) кода из (php) кода неизбежно станет беспорядочной. Подумайте об использовании системы шаблонов или о разделении проблем.
Еще один трюк – это определение строк в javascript, прежде чем помещать их в onchange, а затем использовать одинарные кавычки
<script type='text/javascript'> <!-- var a = 'a'; var b = 'b'; --> </script> ... <... onchange='function(a, b)'>