Это плохая практика, чтобы повторять JavaScript с PHP

У меня есть приложение php, которое использует класс Listener, который в основном просто устанавливает запрос ajax с jquery (пример ниже). Но по какой-то причине повторение javascript просто кажется не элегантным. Лучше ли создавать одноэлементный класс для передачи javascript (который может привести к связыванию) или просто повторять сценарий, как я делаю сейчас?

Вот фрагмент кода того, что я делаю.

<?php

        $script = "
                    <script>
                    $(document).ready(function(){
                        $('".$trigger."').".$action."(function() {
                        ".$js_variables."
                            var ajax_load = '';
                            var loadUrl = '".$this->controller_path."';
                            var action = $(this).attr('id');

                            $('".$this->parent."')
                            .hide(2)
                            .html(ajax_load)  
                            .load(loadUrl, {action: action, ".$post_mapper."})
                            .fadeIn(800);
                        });
                    });
                </script>
        ";

      echo $script;

?>

Изменить: использование одноэлементного класса также позволит мне использовать $(document).ready() или укороченная версия $(function(){}) только один раз, а не каждый раз, когда я добавляю слушателя. Но я не уверен, стоит ли это дополнительного времени и усилий... Есть идеи?

4 ответа

Решение

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

<script>
    $(document).ready(function(){
        $('<?php echo $trigger ?>').<? echo $action ?>(function() {
            <?php echo $js_variables ?>
            var ajax_load = '';
            var loadUrl = '<?php echo $this->controller_path ?>';
            var action = $(this).attr('id');

            $('<?php echo $this->parent ?>')
                .hide(2)
                .html(ajax_load)  
                .load(loadUrl, {action: action, <?php echo $post_mapper ?>})
                .fadeIn(800);
            });
    });
</script>

Это плохая практика - выводить JavaScript с помощью php?

Как правило: да

Это обычная практика - выводить JavaScript из php, но я крайне не одобряю это.

В большинстве случаев вы можете избежать смешивания языков, следуя структуре внешнего интерфейса MVC:

HTML принадлежит .html * файлы. Это модель.
CSS принадлежит .css файлы. Это мнение.
JS принадлежит в .js файлы. Это контроллер.

Я нахожу очень редким, что мне действительно нужно генерировать JavaScript на серверном языке. Большую часть времени мне действительно нужно передавать информацию, которую может использовать JavaScript.

Вместо того, чтобы пытаться вывести:

<a href="#" id="foo">bar</a>
<script>
    $('#foo').click(function () {
        $.ajax('http://example.com')...
        return false;
    });
</script>

для каждой ссылки попробуйте использовать собственные атрибуты HTML, чтобы выполнить большую часть тяжелой работы:

<a href="http://example.com/" class="ajax-link">bar</a>

и в вашем скрипте вы могли бы иметь:

$(document).on('click', '.ajax-link', function () {
    $.ajax($(this).attr('href'))...
    return false;
});

Функция делегата должна быть связана только один раз и может быть сделана из статического файла JS, без необходимости пытаться внедрить JS в код PHP.

Если вам нужна дополнительная информация, используйте data-* атрибуты в сочетании с .data(...),

* или же .php или любой другой язык на стороне сервера, используемый для шаблонов.


Есть нишевые причины для вывода клиентского кода с сервера. Примером может служить генерация JSON для JSONP API, где вам нужно динамически генерировать обратный вызов.

Если у вас нет веской причины для создания JS на языке сервера, не делайте этого.

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

История научила нас не смешивать HTML, JavaScript и CSS в одном файле. Гораздо лучше держать их отдельно, в противном случае очень трудно найти правильное место, на которое можно посмотреть, когда вы пытаетесь отследить ошибку. Смешивание JavaScript и языка на стороне сервера не намного лучше. Есть еще некоторые вещи, которые приходят мне в голову, которые я нахожу в порядке. Например, файлы конфигурации или локализации, которые должны иметь динамические значения.

В вашем примере я бы предпочел оставить это разделенным. Все, что вы делаете, может быть отлично сделано с атрибутами (data) элементов HTML и некоторым поиском DOM. Также кажется, что вам нужно собрать некоторую информацию для вашего представления, которая лучше хранится в HTML. Например: $action Это может быть получено довольно просто из формы:

HTML

<from method="POST" action="/you-name-it">
  ...
</form>

JS

$(function(){
    var form = $('form');
    $.ajax( {
      type: "POST",
      url: form.attr( 'action' ),
      data: form.serialize(),
      success: function( response ) {
        console.log( response );
      }
    } );
});

Логика, почему эта точная форма представлена, может быть в JavaScript и / или PHP. Неважно, как они общаются.

Это вполне приемлемо, но несколько рискованно - вы генерируете части JS на лету, что означает, что вы должны генерировать VALID JS-код, иначе весь кодовый блок будет уничтожен из-за синтаксической ошибки.

например, если вы используете PHP для вставки значения переменной PHP в блок кода JS, что-то вроде:

<script type="text/javascript">
var last_name = '<?php echo $last_name ?>';
</script>

и $last_name бывает O'BrienВы ввели синтаксическую ошибку, потому что сгенерированный код будет:

var last_name = 'O'Brien';
                ^^^--- string with contents O
                   ^^^^^--- unknown/undefined variable Brien
                  ^^--string followed by variable, but no operator present.
                        ^--- start of a new unterminated string containing a ;

Каждый раз, когда вы вставляете необработанные данные на основе PHP в переменную Javascript, вы в основном ДОЛЖНЫ использовать json_encode (), который гарантирует, что сгенерированные данные JS являются синтаксически допустимым кодом JS:

var last_name = <?php echo $last_name ?>;

Обратите внимание, что я не ставил ' в этой версии - json_encode позаботится об этом за вас.

Другие вопросы по тегам