2010-02-11 20 views
16

¿Cuál sería la forma correcta de detener el espacio en blanco que genera ColdFusion?White Space/Coldfusion

Sé que hay cfcontent y cfsetting enableCFoutputOnly. ¿Cuál es la forma correcta de hacer eso?

+0

¿Cuál es el problema que intentas resolver? El espacio en blanco Adicional no causa ningún daño real en sí mismo, al menos no que yo sepa. – Jay

Respuesta

1

Si ninguno <cfsilent> ni <cfsetting enablecfoutputonly="yes"> se puede satisfacer, entonces usted está probablemente sobre-ingeniería de este problema.

Cuando lo hace exclusivamente por razones estéticas, mi recomendación es: Ignorar el espacio en blanco, no hace ningún daño.

+3

El espacio en blanco es más un problema que estropear el código limpio. El espacio en blanco antes de un tipo de documento causará errores en la validación. Aparentemente estético, pero en realidad es un problema si sus clientes desean/requieren sitios válidos. El espacio en blanco antes o después de un retorno de servicio web de texto sin formato puede causar inconvenientes también. Los espacios en blanco iniciales en un retorno XML pueden causar errores como "contenido no permitido en prólogo". Ambos resultados requerirían que el usuario manipule los resultados solo para poder usarlos. En mi opinión ese es un servicio web descuidado. – Travis

+0

@Travis: Sí, eso es cierto. Aún así, estos problemas particulares pueden resolverse perfectamente con los métodos disponibles. El espacio en blanco que resulta de mezclar CF y HTML es mucho menos problemático y se puede dejar solo, en mi humilde opinión. – Tomalak

+0

En la mayoría de los casos, sí, acepto que se puede ignorar. Howerver, he tenido algunos clientes que insisten en la validación estricta (en una nota curiosa, incluso sus sitios más nuevos parecen algo de 1991). El espacio en blanco causa estragos al tratar de hacer esto; no solo antes del doctype sino en todo el documento. La mayor parte no se debe a CF, sino porque el codificador tiene espacios en blanco en el código, ver mi contribución a las respuestas. – Travis

0

He descubierto que incluso con todas las formas posibles de eliminar espacios en blanco, es posible que el código siga teniendo espacios no deseados o saltos de línea. Si todavía está experimentando esto, puede que necesite sacrificar el código bien formateado para el resultado deseado.

por ejemplo, en lugar de:

<cfprocessingdirective supressWhiteSpace = "true"> 
<cfquery ...> 
... 
... 
... 
</cfquery> 
<cfoutput> 
Welcome to the site #query.userName# 
</cfoutput> 
</cfprocessingdirective> 

Es posible que necesite código:

<cfprocessingdirective supressWhiteSpace = "true"><cfquery ...> 
... 
... 
... 
</cfquery><cfoutput>Welcome to the site #query.UserName#</cfoutput></cfprocessingdirective> 

Esto no es CF añadir espacios en blanco, pero la adición de espacios en blanco cuando el formato de su CF.

HTH

+0

oh mi. Un código muy formateado que sea legible y fácil de entender tiene que ser más importante que algún espacio en blanco adicional en el código HTML extraído. Ven ahora. – Jay

+1

Ver los comentarios en la respuesta de Tomalak. En la mayoría de los casos sí, pero no cuando es absolutamente necesario, Jay. Esta es una solución viable cuando los espacios en blanco arruinarán su sistema y CF no maneja los espacios en blanco que ingresa. El espacio en blanco antes de un tipo de documento causará errores en la validación. Aparentemente estético, pero en realidad es un problema si sus clientes desean/requieren sitios válidos. El espacio en blanco antes o después de un retorno de servicio web de texto sin formato puede causar inconvenientes también. Los espacios en blanco iniciales en un retorno XML pueden causar errores como "contenido no permitido en prólogo". – Travis

5

Puede modificar la salida de ColdFusion por conseguir acceso a la ColdFusion outpout Buffer. James Brown recientemente demostró esto en nuestra reunión del grupo de usuarios (Central Florida Web Developers User Group).

<cfscript> 
    out = getPageContext().getOut().getString(); 
    newOutput = REreplace(out, 'regex', '', 'all'); 
</cfscript> 

Un excelente lugar para hacer esto sería en Application.cfc onRequestEnd(). Su resultado podría ser una sola línea de HTML que luego se envía al navegador. Trabaja con tu servidor web para GZip y reducirás mucho el ancho de banda.

0

O bien, puede asegurarse de que toda su página se almacena dentro de una variable y todo este procesamiento se realiza dentro de las etiquetas cfsilent. p.ej.

<cfsilent> 
    <!-- some coldfusion --> 
    <cfsavecontent variable="pageContent"> 
     <html> 
      <!-- some content --> 
     </html> 
    </cfsavecontent> 
    <!-- reformat pageContent if required --> 
</cfsilent><cfoutput>#pageContent#</cfoutput> 

Por último, puede realizar cualquier procesamiento adicional después de que haya generado el PageContent pero antes de su emisión, por ejemplo, una expresión regular para eliminar espacios en blanco adicionales o algún código de limpieza.

0

Aquí hay un consejo si usa CFC.

Si no está esperando su método para generar cualquier salida, utilice output="false" en <cffunction> y <cfcomponent> (no es necesario sólo si está utilizando el estilo de la escritura CF9). Esto eliminará una gran cantidad de espacios en blanco no deseados.

11

Además de <cfsilent>, <cfsetting enablecfoutputonly="yes"> y <cfprocessingdirective suppressWhiteSpace = "true"> es <cfcontent reset="true" />. Puede eliminar espacios en blanco al comienzo de su documento con él.

documento HTML 5 comenzaría entonces así: documento

<cfcontent type="text/html; charset=utf-8" reset="true" /><!doctype html> 

XML:

<cfcontent reset="yes" type="text/xml; charset=utf-8" /><CFOUTPUT>#VariableHoldingXmlDocAsString#</CFOUTPUT> 

De esta manera usted no conseguirá el "contenido no está permitido en el prólogo" -error de documentos XML .

Si se van a espacios en blanco no deseados de una función de utilizar la -attribute output para suprimir cualquier salida y devolver el resultado como una cadena - por ejemplo:

<cffunction name="getMyName" access="public" returntype="string" output="no"> 
    <cfreturn "Seybsen" /> 
</cffunction> 
0

Si tiene acceso al servidor y desea implementar en cada búsqueda de página busque e instale trimflt.jar. Es un filtro de servlet de Java que eliminará todos los espacios en blanco y los saltos de línea antes de enviarlo. Coloque el archivo jar en el directorio/WEB-INF/lib de CF y edite el archivo web.xml para agregar el filtro. También es configurable para eliminar comentarios, excluir archivos o extensiones y preservar cadenas específicas. Lo he estado ejecutando durante unos años sin ningún problema. A configúrelo y olvídelo solución.

Cuestiones relacionadas