2009-08-08 16 views
5

Hasta hace poco, había estado usando Safari 4 para probar y depurar mi actual jQuery Plugin. Probé mi código en Firefox y comenzó a quejarse sobre algo dentro de JQuery-Framework: "establecer una propiedad que tiene solo un getter". traté de averiguar qué línea hace que Firefox a quejarse y se encontró que esto sucede por aquí **"establecer una propiedad que tiene solo un getter" - error de Javascript con firefox

$.fn.util.create_$dom = function(opt) { 
    var $dom = {}; 
    $.each(opt.dom,function(name,val){ 
     console.log(name); 
     var $elm = $('<div>'); 
     $.each(opt.dom[name],function(_name,_val){ 
      if(_name == 'tagName') $elm = $('<'+_val+'/>'); 
     }); 
        console.log(name+': ok'); 
     $.each(opt.dom[name],function(_name,_val){    **here  
      switch(_name){          **here 
       case 'className': $elm.addClass(_val);   **here 
       default: $elm.attr(_name, _val);    **here 
      }             **here 
     }); 
     $dom[name] = $elm; 
     console.log(name+': ok'); 
    }); 
    return $dom; 
}; 

options.dom se ve así:

dom:{ 
     wrapper:{className:'wrapper'}, 
     inner:{tagName:'p',className:'test',test:'bla'} 
    }, 
+0

Supongo que las personas son más inteligentes por las mañanas ... un poco fue el caso conmigo después de tomar un café fuerte y tomar una respiración profunda. redsquare tenía toda la razón sobre el problema, por supuesto, y tengo una solución similar: acabo de agregar: case 'tagName': break; para evitar este problema, y ​​firefox me ama por ello. –

Respuesta

7

Parece que tu tratando de establecer el tagName de un elemento con esta línea

$elm.attr(_name, _val); 

Por supuesto, esto no es posible, ya que es de sólo lectura.

+0

... pero parecía posible en Safari, ¿diría que hay una solución para Firefox? –

+0

safari probablemente se trague la excepción. Siempre puede envolverlo en una captura de prueba, pero ¿por qué no tener otra declaración de caso para tagName que no establece tagName ya que ya ha creado el elemento apropiado? – redsquare

+0

¿por qué no simplemente eliminar el primero y mover la condición que tiene dentro para ser una declaración de caso? Sin embargo, deberá asegurarse de que tagName sea el primer elemento de la matriz. Sin embargo, tal vez mire la estructura de su objeto para evitar la posibilidad de que – redsquare

3
case 'tagName': break; 

... es la solución, pero para agradecer a redsquare por la pista, lo marqué.

Cuestiones relacionadas