2012-06-08 2 views
2

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

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

<?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; 

?> 

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

+0

нет совсем нет, его одинаково приемлемо. – uday

+0

Я считаю, что эхом javascript с php - довольно распространенная практика. Является ли эта общая практика великой, это еще один вопрос. –

+0

Мне лично не нравится идея смешивания серверного и клиентского кода, но в этом нет ничего плохого. –

ответ

2

мм все это предпочтение ... Я обычно делаю это так, чтобы мой текстовый редактор смог определить, что такое 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> 
+0

Вот как я это делаю, по той же причине: цветовые коды IDE намного лучше, чем другие. –

+3

-1: Не знаете, почему кто-то проголосует за это, это действительно беспорядок, и его трудно отладить. Гораздо лучше сохранить разделение данных и взаимодействие. Храните JS вне ваших HTML-файлов. – zzzzBov

+0

Я не рекомендовал использовать JS в HTML-файлах. Я просто использовал пример, который он дал. Обычно я создавал функции в своих JS-файлах и просто отправлял параметры, повторяя значения php. Но вы не можете обойтись, чтобы что-то повторять значения PHP, так как они приходят на сервер. – James

6

Это плохая практика, чтобы повторить 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 f ile, без необходимости вставлять JS в PHP-код.

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

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


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

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

1

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

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

В вашем примере я предпочел бы оставить его разделенным. Все, что вы делаете, может быть отлично выполнено с атрибутами (данными) на элементах 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 , Неважно, как они общаются.

1

Это вполне приемлемо, но довольно рискованным - вы генерируете части из JS на лету, что означает, что вы должны генерировать ДЕЙСТВИТЕЛЬНЫЙ 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 позаботится об этом для вас.

Смежные вопросы