¿Se considera una mala práctica tener PHP en su JavaScript?

54

Muchas veces en este sitio veo gente tratando de hacer cosas como esta:

<script type="text/javascript">
  $(document).ready(function(){

     $('<?php echo $divID ?>').click(funtion(){
       alert('do something');
     });

  });
</script>

No creo que este sea un tipo de patrón en el que las personas caen naturalmente. Debe haber algún tipo de tutorial o material de aprendizaje que muestre esto, de lo contrario no lo veríamos demasiado. Lo que estoy preguntando es si estoy haciendo una gran parte de esto o ¿es realmente una mala práctica?

EDITAR: Estaba hablando con un amigo mío sobre esto, que a menudo pone ruby en su JavaScript y mencionó este punto.

¿Está bien colocar dinámicamente constantes de aplicación en su JavaScript para que no tenga que editar dos archivos? por ejemplo ...

MYAPP.constants = <php echo json_encode($constants) ?>;

también está bien codificar directamente los datos que planea usar en una biblioteca

ChartLibrary.datapoints = <php echo json_encode($chartData) ?>;   

¿O deberíamos hacer una llamada AJAX cada vez?

    
pregunta Greg Guida 22.12.2011 - 17:45

12 respuestas

82

Normalmente, es una mala práctica usar el lenguaje X para generar código en el idioma Y.

Intente desacoplar los dos idiomas haciendo que datos sea su única interfaz, no mezcle el código .

En su ejemplo, podría mejorar el código utilizando PHP para completar una estructura cfg que está disponible para JavaScript:

<script type="text/javascript">
  var cfg = {
    theId: "<?php echo $divID ?>",
    ...
  };

  $(document).ready(function(){
     $("#" + cfg.theId).click(funtion(){
       alert('do something');
     });
  });
</script>

De esta manera, PHP solo se preocupa por rellenar la estructura de datos y JavaScript solo se preocupa por consumir la estructura de datos.

Este desacoplamiento también abre el camino para cargar los datos de forma asíncrona (JSON) en el futuro.

Actualizar:

Para responder a las preguntas adicionales que hizo con su actualización, sí, sería una buena práctica aplicar el principio DRY y permitir que PHP y JavaScript compartan el mismo objeto de configuración:

<script type="text/javascript">
  var cfg = <?php echo json_encode($cfg) ?>;

  ...

No hay ningún daño en insertar la representación JSON de su configuración directamente en su página de esta manera. No necesariamente tienes que buscarlo a través de XHR.

    
respondido por el Ates Goral 22.12.2011 - 17:56
21

El JavaScript generado dinámicamente es una práctica horrible y mala.

Lo que se supone que debes hacer es comprender lo que significa Separación de preocupaciones y Mejora progresiva.

Esto básicamente significa que tienes HTML dinámico y JavaScript estático (lo que mejora el HTML).

En su caso, es probable que desee una clase en su div y selecciónela con un selector de clase

    
respondido por el Raynos 22.12.2011 - 18:04
10

El mayor problema con tu fragmento es que te estás perdiendo el # para que sea un selector de jQuery válido;).

Diría que deberías intentar evitar incluir PHP en tu JavaScript siempre que sea posible. ¿Qué tiene de malo cambiar el selector en su controlador click() a una clase y agregar la clase al elemento en cuestión si desea que se active el controlador, y no si no lo hace?

<script type="text/javascript">
  $(document).ready(function(){

     $('.foo').click(funtion(){
       alert('do something');
     });

  });
</script> 

<div id="bar" class="<?php echo ($someCond ? 'foo' : ''); ?>">Hello</div>

Existen hay circunstancias en las que necesitas incluir PHP en tu JavaScript; pero debo admitir que estos son pocos y distantes entre sí.

Una vez, el ejemplo es cuando tienes diferentes entornos; Prueba, puesta en escena y en vivo. Cada uno de ellos tiene una ubicación diferente de sus activos (imágenes, principalmente). La forma más fácil de establecer la ruta para que JavaScript pueda utilizarla es algo como:

var config = { assets: "<?php echo $yourConfig['asset_url']; ?>" };
    
respondido por el Matt 22.12.2011 - 17:49
8

En mi opinión, esta es una mala práctica, ya que necesitarías llamar a este archivo something.php y luego no pudiste comprimirlo, por ejemplo, no mencionar que no está bien mezclar cosas de tu servidor con tu JavaScript. . Trate de limitar la mezcla entre PHP y JS tanto como sea posible.

Siempre puedes hacer esto en su lugar:

function setOnClick(divid) {
 $(divid).click(funtion(){
   alert('do something');
 });
}

Y luego puedes llamar a esta función en un archivo php, para hacer que estas cosas de mezcla sean lo más pequeñas posible.

$(function() {
  setOnClick('<?php echo $divId; ?>');
});

Al hacer esto (teniendo archivos JS más grandes, no 2-3 líneas en las que no importa), puede aprovechar la compresión del archivo JS y los desarrolladores de aplicaciones frontales se sienten muy cómodos trabajando solo con JavaScript en mi opinión (como podría escribir Python, Ruby, etc. no solo PHP, y el código podría aumentar de tamaño dependiendo de lo que tenga que hacer allí.

    
respondido por el alessioalex 22.12.2011 - 17:50
6

No creo que esto sea una mala práctica. Si el ID requerido en su JavaScript es dinámico, no hay otra manera de hacerlo.

    
respondido por el CodeZombie 22.12.2011 - 17:47
5

Algunas personas dirían que es una mala práctica. No porque sea PHP dentro de JS, sino porque está en línea JS y, por lo tanto, el navegador no lo almacenará en caché para facilitar la carga la próxima vez.

OMI siempre es mejor usar JSON para pasar variables entre los 2 idiomas, pero supongo que depende de ti.

    
respondido por el Nick 22.12.2011 - 17:53
5

Yo diría que en general no lo hagas. Sin embargo, si desea pasar datos desde PHP - > Javascript no me parecería una locura tener un bloque de Javascript en línea donde tienes el código del formulario que se muestra a continuación. Aquí, el código simplemente está pasando datos de php a javascript, no creando lógica sobre la marcha o similar. Lo bueno de hacer esto frente a una llamada ajax es que los datos están disponibles tan pronto como la página se carga y no requiere un viaje adicional al servidor.

<script>
window.config = <?php echo json_encode($config);?>;
</script>

Por supuesto, otra opción es crear un archivo de configuración javascript desde PHP a través de algún tipo de script de construcción que lo coloque en un archivo .js.

    
respondido por el Zachary K 23.12.2011 - 13:47
4

Lo único en lo que puedo pensar que realmente puede causar problemas es cuando los errores de PHP están configurados para mostrarse, por lo que introduce una carga de HTML que muestra el error de PHP en tu JavaScript.

También porque está en el script, por lo tanto, no se muestra y, a veces, puede tomar un tiempo darse cuenta de por qué tu script está roto.

    
respondido por el Alex Coplan 22.12.2011 - 17:48
3

Depende de quién, y si me preguntas, sí, lo considero una práctica atrasada por varias razones. En primer lugar, prefiero tener un código javascript en su propio archivo JS que el analizador php no pueda tocar.

En segundo lugar, php se ejecuta solo a la hora del servidor, por lo que si depende de alguna variable en php para cambiar su javascript, es posible que no funcione muy bien. Si hay alguna configuración de carga de página que desea controlar con javascript, normalmente prefiero agregar ese valor al DOM con php para que javascript pueda alcanzarlo cuando y si lo desea (en un div oculto, por ejemplo).

Finalmente, solo por motivos de organización, esto puede ser muy molesto. Es lo suficientemente malo como para mezclar html y php (en mi opinión).

    
respondido por el Explosion Pills 22.12.2011 - 17:51
1

La contención de PHP en un objeto de datos config va del 90%, pero la mejor práctica es separarlo por completo. Puede usar una API RESTful para solicitar solo los datos que necesita, es un poco más de javascript pero con algunas ventajas.

  • El script es estático y se puede almacenar en caché de forma permanente
  • PHP ya no es un vector XSS
  • Separación completa de preocupaciones

Desventajas:

  • Requiere una solicitud HTTP adicional
  • javascript más complejo

Script

//pure javascript
$.on('domready',function({
    //load the data
    $.get({
       url:'/charts/3D1A2E', 
       success: function(data){
           //now use the chart data here
           ChartModule.init(data);
       }
    });
})
    
respondido por el roo2 06.01.2014 - 05:59
-3

NO es una mala práctica SOLO si se usa para la inicialización de código javascript, (en mis temas de WordPress, inicializo mis objetos javascript con funciones php como site_url () porque es la única manera de manejar eso (tal vez podríamos usar un ajax solicito obtener un json, y entonces ... pero es un dolor en el culo).

Buena práctica:

nuevo javascriptObject ("");

Mala práctica:

/ * algún código * / document.get_element_by_id (); / * algún código * /     
respondido por el junius rendel 02.03.2013 - 23:41

Lea otras preguntas en las etiquetas