obtener - saber si un elemento tiene una clase javascript
La mejor forma de determinar si existe un atributo XML en Flex (7)
Asumiendo que en su ejemplo event.result
es un objeto XML
cuyo contenido es exactamente como lo publicó, esto debería funcionar (debido a que la etiqueta Validation es la etiqueta raíz del XML):
var error:String = event.result.@Error;
if (error != "")
// error
else
// no error
El ejemplo anterior supondrá que un atributo de Error
existente con un valor vacío se debe tratar como un caso "sin errores", por lo que si desea saber si el atributo existe o no, debe hacer esto:
if (event.result.hasOwnProperty("@Error"))
// error
else
// no error
Tengo una respuesta XML de una llamada HTTPService con el formato de resultado e4x.
<?xml version="1.0" encoding="utf-8"?>
<Validation Error="Invalid Username/Password Combination" />
Yo he tratado:
private function callback(event:ResultEvent):void {
if(event.result..@Error) {
// error attr present
}
else {
// error attr not present
}
}
Esto no parece funcionar (siempre se piensa que el atributo de error se cierra) ¿cuál es la mejor manera de hacer esto? Gracias.
EDIT: también he intentado comparar el atributo con null y una cadena vacía sin tal éxito ...
Has encontrado la mejor manera de hacerlo:
event.result.attribute("Error").length() > 0
El método de attribute
es la forma preferida de recuperar atributos si no sabe si están allí o no.
He encontrado una solución, todavía estoy interesado si hay una mejor manera de hacer esto ...
Esto funcionará:
private function callback(event:ResultEvent):void {
if(event.result.attribute("Error").length()) {
// error attr present
}
else {
// error attr not present
}
}
Puede verificar esto de la siguiente manera:
if (undefined == event.result.@Error)
o dinámicamente
if (undefined == event.result.@[attributeName])
Tenga en cuenta que en su ejemplo, los dos puntos recuperarán todos los descendientes en todos los niveles, por lo que obtendrá una lista como resultado. Si no hay atributos de Error, obtendrá una lista vacía. Es por eso que nunca será igual a nulo.
Me gusta este método porque a) es dolorosamente simple yb). Ely Greenfield lo usa. ;)
if("@property" in node){//do something}
Aqui tienes:
if(event.result.@error[0]){
//exists
}
Fácil, ¿eh? :)
Me gusta usar la siguiente sintaxis para verificar porque es fácil de leer, menos tipeo y está casi empatado como el método más rápido:
if ("@style" in item) // do something
Para asignarle un valor a ese atributo cuando no se conoce su nombre de antemano, use el método de attribute
:
var attributeName:String = "style";
var attributeWithAtSign:String = "@" + attributeName;
var item:XML = <item style="value"/>;
var itemNoAttribute:XML = <item />;
if (attributeWithAtSign in itemNoAttribute) {
trace("should not be here if attribute is not on the xml");
}
else {
trace(attributeName + " not found in " + itemNoAttribute);
}
if (attributeWithAtSign in item) {
item.attribute(attributeName)[0] = "a new value";
}
Todas las siguientes son formas de comprobar si existe un atributo recopilado a partir de las respuestas enumeradas en esta pregunta. Como había tantos, ejecuté cada uno en 11.7.0.225 jugador de depuración. El valor a la derecha es el método utilizado. El valor de la izquierda es el tiempo más bajo en milisegundos que se tarda al ejecutar el código un millón de veces. Aquí están los resultados:
807 item.hasOwnProperty("@style")
824 "@style" in item
1756 item.@style[0]
2166 (undefined != item.@["style"])
2431 (undefined != item["@style"])
3050 XML(item).attribute("style").length()>0
Código de prueba de rendimiento:
var item:XML = <item value="value"/>;
var attExists:Boolean;
var million:int = 1000000;
var time:int = getTimer();
for (var j:int;j<million;j++) {
attExists = XML(item).attribute("style").length()>0;
attExists = XML(item).attribute("value").length()>0;
}
var test1:int = getTimer() - time; // 3242 3050 3759 3075
time = getTimer();
for (var j:int=0;j<million;j++) {
attExists = "@style" in item;
attExists = "@value" in item;
}
var test2:int = getTimer() - time; // 1089 852 991 824
time = getTimer();
for (var j:int=0;j<million;j++) {
attExists = (undefined != item.@["style"]);
attExists = (undefined != item.@["value"]);
}
var test3:int = getTimer() - time; // 2371 2413 2790 2166
time = getTimer();
for (var j:int=0;j<million;j++) {
attExists = (undefined != item["@style"]);
attExists = (undefined != item["@value"]);
}
var test3_1:int = getTimer() - time; // 2662 3287 2941 2431
time = getTimer();
for (var j:int=0;j<million;j++) {
attExists = item.hasOwnProperty("@style");
attExists = item.hasOwnProperty("@value");
}
var test4:int = getTimer() - time; // 900 946 960 807
time = getTimer();
for (var j:int=0;j<million;j++) {
attExists = item.@style[0];
attExists = item.@value[0];
}
var test5:int = getTimer() - time; // 1838 1756 1756 1775