validar validacion vacios formularios formulario eventos enviar ejemplos con campos antes javascript html string escaping

validacion - validar formulario javascript html5



¿Cómo evito una cadena dentro de código JavaScript dentro de un controlador onClick? (13)

Cualquier buen motor de plantillas que valga la pena tendrá una función de "comillas de escape". El nuestro (también de cosecha propia, donde trabajo) también tiene una función para escapar de las citas de javascript. En ambos casos, la variable de plantilla simplemente se agrega con _esc o _js_esc, dependiendo de lo que desee. Nunca debe generar contenido generado por el usuario en un navegador que no se haya escapado, en mi humilde opinión.

Tal vez estoy pensando demasiado en esto, pero tengo un problema para descubrir qué escapatoria usar en una cadena en algún código JavaScript dentro del controlador onClick de un enlace. Ejemplo:

<a href="#" onclick="SelectSurveyItem(''<%itemid%>'', ''<%itemname%>''); return false;">Select</a>

<%itemid%> y <%itemname%> son donde ocurre la sustitución de la plantilla. Mi problema es que el nombre del elemento puede contener cualquier carácter, incluidas comillas simples y dobles. Actualmente, si contiene comillas simples, rompe el código JavaScript.

Lo primero que pensé fue utilizar la función del lenguaje de plantilla en JavaScript: escapar del nombre del elemento, que simplemente escapa de las comillas. Eso no solucionará el caso de la cadena que contiene comillas dobles que rompe el HTML del enlace. ¿Cómo se aborda normalmente este problema? ¿Debo escanear HTML todo el controlador OnClick?

Si es así, parecería realmente extraño ya que la función de escape del lenguaje de la plantilla también HTMLify los paréntesis, comillas y puntos y comas ...

Este enlace se genera para cada resultado en una página de resultados de búsqueda, por lo que no es posible crear un método separado dentro de una etiqueta de JavaScript, ya que necesitaría generar uno por resultado.

Además, estoy usando un motor de creación de plantillas propio de la empresa para la que trabajo, por lo que las soluciones específicas para el kit de herramientas no me servirán de nada.


Declare funciones separadas en la sección <head> e invoque aquellas en su método onClick. Si tiene lotes, puede usar un esquema de nombres que los numera, o pasar un número entero en sus onClicks y tener una declaración de interruptor grande y gordo en la función.


Dependiendo del idioma del lado del servidor, puede usar uno de estos:

.NET 4.0

string result = System.Web.HttpUtility.JavaScriptStringEncode("jsString")

Java

import org.apache.commons.lang.StringEscapeUtils; ... String result = StringEscapeUtils.escapeJavaScript(jsString);

Pitón

import json result = json.dumps(jsString)

PHP

$result = strtr($jsString, array(''//' => ''////', "''" => "//'", ''"'' => ''//"'', "/r" => ''//r'', "/n" => ''//n'' ));

Ruby on Rails

<%= escape_javascript(jsString) %>


En JavaScript, puede codificar comillas simples como "/ x27" y comillas dobles como "/ x22". Por lo tanto, con este método, una vez dentro de las comillas (dobles o únicas) de un literal de cadena de JavaScript, utilice / x27 / x22 con total impunidad, sin temor a que las comillas incrustadas "salgan" de su cadena.

/ xXX es para caracteres <127 y / uXXXX para Unicode , por lo que, armado con este conocimiento, puede crear una función JSEncode sólida para todos los caracteres que estén fuera de la lista blanca habitual.

Por ejemplo,

<a href="#" onclick="SelectSurveyItem(''<% JSEncode(itemid) %>'', ''<% JSEncode(itemname) %>''); return false;">Select</a>


En primer lugar, sería más sencillo si el controlador onclick se configurara de esta manera:

<a id="someLinkId"href="#">Select</a> <script type="text/javascript"> document.getElementById("someLinkId").onClick = function() { SelectSurveyItem(''<%itemid%>'', ''<%itemname%>''); return false; }; </script>

Entonces itemid y nombre del elemento deben ser escapados para JavaScript (es decir, " convierte en /" , etc.).

Si está utilizando Java en el lado del servidor, puede echar un vistazo a la clase StringEscapeUtils de common-lang de jakarta. De lo contrario, no debería tomar demasiado tiempo para escribir su propio método ''escapeJavascript''.


Enfrenté el mismo problema, y ​​lo resolví de una manera complicada. Primero crea las variables globales, v1, v2 y v3. Y en el clic, envíe un indicador, 1, 2 o 3 y en la función compruebe 1, 2, 3 para poner v1, v2 y v3 como:

onclick="myfun(1)" onclick="myfun(2)" onclick="myfun(3)" function myfun(var) { if (var ==1) alert(v1); if (var ==2) alert(v2); if (var ==3) alert(v3); }


Intente evitar el uso de literales de cadena en su HTML y use JavaScript para enlazar eventos de JavaScript.

Además, evite ''href = #'' a menos que realmente sepa lo que está haciendo. Se rompe tanta facilidad de uso para middleclickers compulsivos (abrelatas).

<a id="tehbutton" href="somewhereToGoWithoutWorkingJavascript.com">Select</a>

Mi biblioteca de JavaScript de elección simplemente es jQuery:

<script type="text/javascript">//<!-- <![CDATA[ jQuery(function($){ $("#tehbutton").click(function(){ SelectSurveyItem(''<%itemid%>'', ''<%itemname%>''); return false; }); }); //]]>--></script>

Si está reproduciendo una lista de enlaces como esa, puede hacer esto:

<a id="link_1" href="foo">Bar</a> <a id="link_2" href="foo2">Baz</a> <script type="text/javascript"> jQuery(function($){ var l = [[1,''Bar''],[2,''Baz'']]; $(l).each(function(k,v){ $("#link_" + v[0] ).click(function(){ SelectSurveyItem(v[0],v[1]); return false; }); }); }); </script>


Me he enfrentado a este problema también. Hice una secuencia de comandos para convertir comillas simples en comillas dobles escapadas que no romperán el HTML.

function noQuote(text) { var newtext = ""; for (var i = 0; i < text.length; i++) { if (text[i] == "''") { newtext += "/""; } else { newtext += text[i]; } } return newtext; }


Otra solución interesante podría ser hacer esto:

<a href="#" itemid="<%itemid%>" itemname="<%itemname%>" onclick="SelectSurveyItem(this.itemid, this.itemname); return false;">Select</a>

Luego puede usar una codificación HTML estándar en ambas variables, sin tener que preocuparse por la complicación adicional de las citas de JavaScript.

Sí, esto crea HTML que es estrictamente inválido. Sin embargo, es una técnica válida, y todos los navegadores modernos lo admiten.

Si fuera mío, probablemente aceptaría mi primera sugerencia y me aseguraré de que los valores estén codificados en HTML y se hayan escapado las comillas simples.


Si entra en un atributo de HTML, deberá codificar HTML (como mínimo: > a &gt; < a &lt y " a &quot; ) y escapar de comillas simples (con una barra inclinada invertida) para que no se apliquen. interfiere con tu cita de JavaScript.

La mejor forma de hacerlo es con su sistema de plantillas (extendiéndolo, si es necesario), pero podría simplemente hacer un par de funciones de escape / codificación y envolverlas alrededor de cualquier dato que ingrese allí.

Y sí, es perfectamente válido (correcto, par) para HTML: escapa de todo el contenido de los atributos HTML, incluso si contienen javascript.


Son las respuestas aquí que no se puede escapar de las citas usando JavaScript y que debe comenzar con las cadenas escapadas.

Por lo tanto. No hay forma de que JavaScript sea capaz de manejar la cadena ''Marge dijo'' Me gustaría ver que era "para Peter ''y necesitas que tus datos se limpien antes de ofrecerlos al script?



Use tramos ocultos, uno para cada uno de los parámetros <%itemid%> y <%itemname%> y escriba sus valores dentro de ellos.

Por ejemplo, el lapso para <%itemid%> se vería como <span id=''itemid'' style=''display:none''><%itemid%></span> y en la función javascript SelectSurveyItem para elegir los argumentos de estos se extiende '' innerHTML .